Пример шаблона CloudFormation для Amazon VPC

Следующий шаблон CloudFormation может быть использован для запуска стэка ArcGIS Server с высокой доступностью на Amazon Virtual Private Cloud (VPC). См. AWS Cloud Formation и высокая доступность с помощью ArcGIS Server.

Скопируйте данный код, поместите его в текстовый файл и измените в соответствии со своими требованиями. Затем перейдите к этому текстовому файлу при создании стэка ArcGIS Server с CloudFormation.

В этом разделе:

Код шаблона

{	"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"
		}
	}   

}

Параметры для данного шаблона

Параметр AMI задает идентификатор AMI ID, который будет использоваться при запуске экземпляров в данном стэке. Укажите его в собственном настроенном ArcGIS Server, запущенном на AMI.

Параметр VPCId является физическим ID виртуального частного облака (virtual private cloud), которое будет использоваться для запуска стэка.

Параметр Subnets задает разделенный запятыми список ваших подсетей VPC, в которых вы хотите запустить свой стэк. Для целей высокой доступности вы можете указать подсети в более чем одной зоне. Экземпляры вашего стэка будут распределены между зонами.

Параметр AZs является разделенным запятыми списком, содержащим имена доступных зон, в которых размещаются перечисленные вами подсети.

Параметр InstanceType задает тип экземпляра EC2, который будет использоваться при запуске экземпляров в данном стэке. Устанавливайте его осторожно, поскольку он может повлиять как на стоимость AWS, так и на стоимость лицензирования Esri. Стоимость будет умножена на количество запускаемых экземпляров, для которых вы используете группы автомасштабирования.

KeyName – это имя ключевой пары, которая позволит вам получить пароль администратора для ваших экземпляров. Вам необходимо создать файл ключевой пары до того, как вы будете использовать шаблон. Эта опция обязательна, если вы будете подключаться к экземплярам через удаленный рабочий стол или протокол SSH.

MinSize – это минимальное число экземпляров, участвующих в вашем стэке в любой момент времени. Это количество экземпляров будет немедленно запущено, когда вы создаете стэк. Если вы зададите это значение равным 2 или больше, вы защитите себя от того, что ArcGIS Server будет недоступен при выходе из строя экземпляра. CloudFormation немедленно создаст второй экземпляр, если останется только один.

MaxSize – это максимальное количество экземпляров, которые могут участвовать в вашем стэке в любой момент времени, вне зависимости от того, используйте ли вы триггеры автомасштабирования или загрузку процессора экземпляра.

Ресурсы данного шаблона

Ресурс LoadBalancerSecurityGroup определяет правила доступа для Elastic Load Balancer, включая порты, через которые может быть получен и перенаправлен трафик.

Ресурс ELB описывает Elastic Load Balancer (ELB), помещенный в данный стэк. ELB является точкой входа для всех веб-запросов к ArcGIS Server. Он распределяет запросы по доступным экземплярам ArcGIS Server. Вы можете использовать свойства для ELB, чтобы настроить порт балансировщика нагрузки, порт экземпляра (который может быть изменен со значения по умолчанию 6080 на 6443 в случае сайта, защищенного с помощью SSL) и настройки проверки состояния.

Ресурс InstanceSecurityGroup определяет правила доступа, которые будут применяться к любому экземпляру, запущенному в данном стэке. Обратите внимание, что вы можете задать правила входа, определяющие, какие порты будут открыты для экземпляров. В этом шаблоне группе Elastic Load Balancer разрешено иметь доступ к экземплярам с портом 6080.

Ресурс LaunchConfig использует некоторые из параметров, заданных пользователем шаблона, чтобы определить тип запускаемого экземпляра и применяемых AMI.

Ресурс AutoScalingGroup задает правила, управляющие добавлением и удалением экземпляров из стэка в качестве ответа на триггеры, такие как использование процессора. Этот ресурс также содержит политику обновления, которая определяет, сколько экземпляров будет добавлено единовременно при выполнении обновления AMI. Обновления применяются на базисе отмены, так что ваш стэк не будет отключен целиком во время обновления. Ваше значение MaxBatchSize отображает количество экземпляров, обновляемых за один раз, и в идеале должно быть меньше, чем значение MinSize для вашего стэка, тем самым обеспечивая, что экземпляр останется доступным во время обновления.

Ресурс ScaleUpPolicy определяет, как экземпляр будет добавлен в стэк в случае большой нагрузки. Далее в шаблоне на это ссылается ресурс CPUAlarmHigh.

Ресурс ScaleDownPolicy определяет, как экземпляр будет удален из стэка в случае недостаточной нагрузки. Далее в шаблоне на это ссылается ресурс CPUAlarmLow.

Ресурс CPUAlarmHigh задает определенные параметры для предупреждения (alarm), которое вызовет добавление экземпляра в стэк. В данном шаблоне экземпляр добавляется, когда использование процессора превышает 80 процентов на протяжении 10 минут.

Ресурс CPUAlarmLow задает определенные параметры для предупреждения (alarm), которое вызовет удаление экземпляра из стэка. В данном шаблоне экземпляр удаляется, когда использование процессора держится ниже 20 процентов на протяжении 10 минут.

Подробные примеры всех свойств JSON, которые вы можете добавить в шаблон CloudFormation, доступны в разделе Работа с шаблонами в документации AWS.

5/16/2014