Exemple de modèle CloudFormation pour Amazon VPC

Le modèle CloudFormation suivant permet de lancer une pile ArcGIS Server hautement disponible dans Amazon Virtual Private Cloud (VPC). Consultez la rubrique AWS CloudFormation et haute disponibilité avec ArcGIS Server.

Copiez ce code, collez-le dans un fichier de texte et adaptez-le à vos besoins. Naviguez ensuite vers le fichier de texte lorsque vous créez votre pile ArcGIS Server avec CloudFormation.

Dans cette rubrique :

Code du modèle

{	"AWSTemplateFormatVersion": "2010-09-09",

	"Description": "CloudFormation template to launch a highly available ArcGIS Server stack in Amazon VPC",

	"Parameters" : {
		"AMI" : {
			"Description" : "Your ArcGIS Server AMI ID.",
			"Type" : "String"
		},
		"VpcId" : {
			"Type" : "String",
			"Description" : "VpcId of your existing Virtual Private Cloud (VPC).",
			"Default" : "vpc-4adfc123"
		},
		"Subnets" : {
			"Type" : "CommaDelimitedList",
			"Default" : "subnet-8ec5b8e6,subnet-1edcc277",
			"Description" : "The list of SubnetIds where the stack will be launched"
		},
	    "AZs" : {
		"Type" : "CommaDelimitedList",
		"Default" : "us-west-2b,us-west-2c",
		"Description" : "The list of AvailabilityZones for your Virtual Private Cloud (VPC). It needs to be consistent with the AZ of your subnets."
		},
		"InstanceType" : {
			"Description" : "Type of EC2 instance to launch.",
			"Type" : "String",
			"Default" : "m1.medium",
			"AllowedValues" : [ "m1.medium","m1.large","m1.xlarge","m2.xlarge","m2.2xlarge","m2.4xlarge","m3.xlarge","m3.2xlarge","c1.xlarge","cc2.8xlarge","cg1.4xlarge", "cr1.8xlarge","hi1.4xlarge","hs1.8xlarge"],
			"ConstraintDescription" : "must be a valid EC2 instance type."			
		},
		"KeyName" : {
			"Description" : "The EC2 Key Pair to allow Remote Desktop access or SSH to the instances.",
			"Type" : "String",
			"Default" : "Your_KeyPair_Name"
		},
		"MinSize" : {
			"Description" : "Minimum number of EC2 instances.",
			"Type" : "Number",
			"Default" : "2"
		},
		"MaxSize" : {
			"Description" : "Maximum number of EC2 instances.",
			"Type" : "Number",
			"Default" : "4"
		}
	},

	"Resources": {
		
		"LoadBalancerSecurityGroup": {
			"Type": "AWS::EC2::SecurityGroup",
			"Properties": {
				"GroupDescription": "Enable HTTP access on port 80 and 443.",
				"VpcId" : { "Ref" : "VpcId" },
				"SecurityGroupIngress": [{
				                        	 "IpProtocol": "tcp",
				                        	 "FromPort": "80" ,
				                        	 "ToPort": "80" ,
				                        	 "CidrIp" : "0.0.0.0/0"
											 },{
 				                        	 "IpProtocol": "tcp",
				                        	 "FromPort": "443" ,
				                        	 "ToPort": "443" ,
                                             "CidrIp" : "0.0.0.0/0"
				                         }],
		        "SecurityGroupEgress" : [{
											 "IpProtocol" : "tcp",
											 "FromPort" : "6080",
											 "ToPort" : "6080",
											 "CidrIp" : "0.0.0.0/0"
											 },{
				                        	 "IpProtocol": "tcp",
				                        	 "FromPort": "6443" ,
				                        	 "ToPort": "6443" ,
				                        	 "CidrIp" : "0.0.0.0/0"
				                         }]
						  }
			},
		"ELB" : {
			"Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
			"Properties" : {
				"Subnets" : { "Ref" : "Subnets" },
				"SecurityGroups" : [ { "Ref" : "LoadBalancerSecurityGroup" } ],				
				"Listeners" : [ {
					"LoadBalancerPort" : "80",
					"InstancePort" : "6080" ,
					"Protocol" : "HTTP"
				}],
				"HealthCheck" : {
					"Target" : "HTTP:6080/arcgis/rest/info/healthcheck",
					"HealthyThreshold" : "3",
					"UnhealthyThreshold" : "5",
					"Interval" : "30",
					"Timeout" : "5"
				}
			}
		},
		
		"InstanceSecurityGroup": {
			"Type": "AWS::EC2::SecurityGroup",
			"Properties": {
				"GroupDescription": "Enable HTTP access on 6080 and 6443 from ELB.",
				"VpcId" : { "Ref" : "VpcId" },
				"SecurityGroupIngress": [{
				                        	 "IpProtocol": "tcp",
				                        	 "FromPort": "6080" ,
				                        	 "ToPort": "6080" ,
											 "SourceSecurityGroupId": { "Ref" : "LoadBalancerSecurityGroup" }
				                         },{
				                        	 "IpProtocol": "tcp",
				                        	 "FromPort": "6443" ,
				                        	 "ToPort": "6443" ,
				                        	 "SourceSecurityGroupId": { "Ref" : "LoadBalancerSecurityGroup" }
				                         }]
			}
		},
		
		"LaunchConfig": {
			"Type": "AWS::AutoScaling::LaunchConfiguration",
			"Properties": {
				"ImageId": {"Ref" : "AMI"},
				"InstanceType": {"Ref": "InstanceType"},
				"KeyName": {"Ref": "KeyName"},
				"SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
				"InstanceMonitoring": true
			}
		},
		
		"AutoScalingGroup": {
			"UpdatePolicy" : {
				"AutoScalingRollingUpdate" : {
					"MinInstancesInService" : {"Ref" : "MinSize"},
					"MaxBatchSize" : "3",
					"PauseTime" : "PT15M"
				}
			},
			"Type": "AWS::AutoScaling::AutoScalingGroup",
			"Properties": {
				"AvailabilityZones" : { "Ref" : "AZs" },
				"VPCZoneIdentifier" : { "Ref" : "Subnets" },				
				"Cooldown": "300",
				"MaxSize": {"Ref" : "MaxSize"},
				"MinSize": {"Ref" : "MinSize"},
				"LaunchConfigurationName": {"Ref": "LaunchConfig"},
                "HealthCheckType" : "EC2",
                "HealthCheckGracePeriod" : "3600",
				"LoadBalancerNames": [{"Ref": "ELB"}],
				"Tags": [{"Key": "Name", "Value": {"Ref": "AWS::StackName"}, "PropagateAtLaunch" : true}]
			}
		},

		"ScaleUpPolicy" : {
			"Type" : "AWS::AutoScaling::ScalingPolicy",
			"Properties" : {
				"AdjustmentType" : "ChangeInCapacity",
				"AutoScalingGroupName" : { "Ref" : "AutoScalingGroup" },
				"Cooldown" : "60",
				"ScalingAdjustment" : "1"
			}
		},

		"ScaleDownPolicy" : {
			"Type" : "AWS::AutoScaling::ScalingPolicy",
			"Properties" : {
				"AdjustmentType" : "ChangeInCapacity",
				"AutoScalingGroupName" : { "Ref" : "AutoScalingGroup" },
				"Cooldown" : "60",
				"ScalingAdjustment" : "-1"
			}
		},

		"CPUAlarmHigh": {
			"Type": "AWS::CloudWatch::Alarm",
			"Properties": {
				"AlarmDescription": "Scale-up if CPU > 80% for 10 minutes",
				"MetricName": "CPUUtilization",
				"Namespace": "AWS/EC2",
				"Statistic": "Average",
				"Period": "300",
				"EvaluationPeriods": "2",
				"Threshold": "80",
				"AlarmActions": [ { "Ref": "ScaleUpPolicy" } ],
				"Dimensions": [
				               {
				            	   "Name": "AutoScalingGroupName",
				            	   "Value": { "Ref": "AutoScalingGroup" }
				               }
				               ],
				               "ComparisonOperator": "GreaterThanThreshold"
			}
		},

		"CPUAlarmLow": {
			"Type": "AWS::CloudWatch::Alarm",
			"Properties": {
				"AlarmDescription": "Scale-down if CPU < 20% for 10 minutes",
				"MetricName": "CPUUtilization",
				"Namespace": "AWS/EC2",
				"Statistic": "Average",
				"Period": "300",
				"EvaluationPeriods": "2",
				"Threshold": "20",
				"AlarmActions": [ { "Ref": "ScaleDownPolicy" } ],
				"Dimensions": [
				               {
				            	   "Name": "AutoScalingGroupName",
				            	   "Value": { "Ref": "AutoScalingGroup" }
				               }
				               ],
				               "ComparisonOperator": "LessThanThreshold"
			}
		}
	},

	"Outputs": {
		"RestURL": {
			"Value": {
				"Fn::Join": ["", ["http://", {"Fn::GetAtt": ["ELB", "DNSName" ]}, "/arcgis/rest"]]
			},
			"Description" : "ArcGIS Server REST Services Directory URL"
		}
	}   

}

Paramètres contenus dans ce modèle

Le paramètre AMI définit l'ID de l'image AMI qui sera utilisé lors du lancement d'instances dans cette pile. Vous le pointez sur votre propre image AMI personnalisée exécutant ArcGIS Server.

Le paramètre VPCId est l'ID physique du cloud privé virtuel qui sera utilisé pour lancer la pile.

Le paramètre Subnets spécifie une liste séparée par des virgules de vos sous-réseaux VPC lorsque vous souhaitez lancer la pile. A des fins de haute disponibilité, vous pouvez préciser des sous-réseaux dans plusieurs zones. Les instances de votre pile seront réparties entre les zones.

Le paramètre AZs est une liste séparée par des virgules des noms des zones de disponibilité hébergeant les sous-réseaux que vous avez répertoriés.

Le paramètre InstanceType définit le type d'instance EC2 qui sera utilisé lors du lancement d'instances dans la pile. Soyez vigilant lors de la définition de ce paramètre, car il peut affecter les coûts AWS et les coûts de licence Esri. En effet, les coûts seront multipliés par le nombre d'instances que vous lancez grâce aux groupes de mise à l'échelle automatique.

KeyName est le nom d'une paire de clés qui permet de récupérer le mot de passe d'administrateur pour vos instances. Vous devrez créer le fichier de paires de clés avant d'utiliser le modèle. Cette option est nécessaire si vous prévoyez de vous connecter à vos instances via Bureau à distance ou SSH.

MinSize est le nombre minimal d'instances faisant partie de votre pile à tout moment. Ces instances sont lancées simultanément lorsque vous créez votre pile. Si vous conservez cette valeur à 2 ou plus, vous vous prémunissez contre l'indisponibilité d'ArcGIS Server si une instance s'arrête. CloudFormation créée immédiatement une seconde instance si une seule est détectée.

MaxSize est le nombre maximal d'instances autorisées à faire partie de la pile à tout moment, indépendamment de vos déclencheurs de mise à l'échelle automatique ou de l'utilisation du processeur de l'instance.

Ressources contenues dans ce modèle

La ressource LoadBalancerSecurityGroup définit les règles d'accès pour l'Équilibreur de charges élastiques, notamment les ports par lesquels le trafic peut être reçu et transféré.

La ressource ELB décrit l'équilibreur de charges élastiques (ELB) placé dans la pile. L'ELB constitue le point d'entrée de toutes les demandes Web dans ArcGIS Server. Il distribue les demandes aux instances ArcGIS Server disponibles. Vous pouvez faire appel aux propriétés dans l'ELB pour ajuster le port d'équilibreur de charges, le port d'instance (qui peut s'écarter de la valeur par défaut 6080 pour être 6443 dans le cas d'un site sécurisé SSL) et les paramètres de contrôle de l'intégrité.

La ressource InstanceSecurityGroup détermine les règles d'accès qui seront appliquées à toutes les instances lancées dans cette pile. Notez que vous pouvez définir des règles Ingress définissant quels ports sont ouverts pour les instances. Dans ce modèle, le groupe Équilibreur de charges élastiques est autorisé à accéder aux instances sur le port 6080.

La ressource LaunchConfig intègre certains des paramètres définis par l'utilisateur du modèle pour déterminer le type d'instance à lancer et l'image AMI à appliquer.

La ressource AutoScalingGroup configure les règles définissant le moment où les instances seront ajoutées et supprimées de la pile en réponse à des déclencheurs tels que l'utilisation du processeur. Cette ressource contient également une stratégie de mise à jour qui détermine le nombre d'instances à mettre à jour simultanément lorsque vous mettez à jour l'image AMI. Les mises à jour sont appliquées à tour de rôle, de sorte que la pile dans son intégralité ne soit pas déconnectée par la mise à jour. Votre paramètre MaxBatchSize représente le nombre d'instances mises à jour simultanément et doit dans l'idéal être défini comme étant inférieur à la propriété MinSize de votre pile, ce qui garantit la disponibilité d'une instance lors d'une mise à jour.

La ressource ScaleUpPolicy définit la façon dont une instance sera ajoutée à la pile en cas de charge lourde. Elle est référencée plus loin dans le modèle par la ressource CPUAlarmHigh.

La ressource ScaleDownPolicy définit la façon dont une instance sera supprimée de la pile en cas de charge légère. Elle est référencée plus loin dans le modèle par la ressource CPUAlarmLow.

La ressource CPUAlarmHigh définit des paramètres spécifiques pour une alarme qui entraînera l'ajout d'une instance à la pile. Dans ce modèle, une instance est ajoutée lorsque l'utilisation du processeur dépasse 80 % pendant 10 minutes.

La ressource CPUAlarmLow définit des paramètres spécifiques pour une alarme qui entraînera la suppression d'une instance de la pile. Dans ce modèle, une instance est supprimée lorsque l'utilisation du processeur tombe sous 20 % pendant 10 minutes.

Des exemples détaillés de toutes les propriétés JSON que vous pouvez placer dans un modèle CloudFormation sont disponibles dans la section Utilisation de modèles de la documentation AWS.

5/10/2014