Walkthrough: Erstellen eines skalierbaren Lastenausgleich-Webservers - AWS CloudFormation

Walkthrough: Erstellen eines skalierbaren Lastenausgleich-Webservers

Diese Vorlage erstellt eine Beispielwebsite, die Amazon EC2 Auto Scaling und Elastic Load Balancing verwendet und so konfiguriert ist, dass mehrere Availability Zones verwendet werden. Die Vorlage enthält auch CloudWatch-Alarme, die Skalierungsrichtlinien zum Hinzufügen oder Entfernen von Instances aus der Auto Scaling-Gruppe ausführen, wenn die definierten Schwellenwerte überschritten werden.

Diese Vorlage erstellt eine oder mehrere Amazon EC2-Instanzen. Ihnen werden Gebühren für die verwendeten AWS-Ressourcen berechnet, wenn Sie einen Stack aus dieser Vorlage erstellen.

Anmerkung

Die Vorlage geht davon aus, dass Ihr Konto die EC2-VPC-Plattform unterstützt. Anders ausgedrückt: Sie haben eine Standard-VPC, über die Instanzen auf das Internet zugreifen können. Wenn Sie nicht über eine Standard-VPC verfügen, können Sie eine erstellen. Weitere Informationen finden Sie unter Amazon EC2 und Amazon Virtual Private Cloud im Amazon EC2-Benutzerhandbuch für Linux-Instances.

Sie können die neueste Version dieser Beispielvorlage unter https://s3.amazonaws.com/cloudformation-templates-us-east-1/AutoScalingMultiAZWithNotifications.template abrufen.

Multi-AZ-Vorlage für Auto Scaling

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template AutoScalingMultiAZWithNotifications: Create a multi-az, load balanced and auto-scaled sample web site running on an Apache Web Server. The application is configured to span all Availability Zones in the region and is auto-scaled based on the CPU utilization of the web servers. Notifications will be sent to the operator email address on scaling events. The instances are load balanced with a simple health check against the default web page. **WARNING** This template creates one or more Amazon EC2 instances and an Elastic Load Balancer. You will be billed for the AWS resources used if you create a stack from this template.", "Parameters" : { "InstanceType" : { "Description" : "WebServer EC2 instance type", "Type" : "String", "Default" : "t2.small", "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge" ], "ConstraintDescription" : "must be a valid EC2 instance type." }, "OperatorEMail": { "Description": "EMail address to notify if there are any scaling operations", "Type": "String", "AllowedPattern": "([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)", "ConstraintDescription": "must be a valid email address." }, "KeyName" : { "Description" : "The EC2 Key Pair to allow SSH access to the instances", "Type" : "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "SSHLocation" : { "Description" : "The IP address range that can be used to SSH to the EC2 instances", "Type": "String", "MinLength": "9", "MaxLength": "18", "Default": "0.0.0.0/0", "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x." } }, "Mappings" : { "AWSInstanceType2Arch" : { "t1.micro" : { "Arch" : "HVM64" }, "t2.nano" : { "Arch" : "HVM64" }, "t2.micro" : { "Arch" : "HVM64" }, "t2.small" : { "Arch" : "HVM64" }, "t2.medium" : { "Arch" : "HVM64" }, "t2.large" : { "Arch" : "HVM64" }, "m1.small" : { "Arch" : "HVM64" }, "m1.medium" : { "Arch" : "HVM64" }, "m1.large" : { "Arch" : "HVM64" }, "m1.xlarge" : { "Arch" : "HVM64" }, "m2.xlarge" : { "Arch" : "HVM64" }, "m2.2xlarge" : { "Arch" : "HVM64" }, "m2.4xlarge" : { "Arch" : "HVM64" }, "m3.medium" : { "Arch" : "HVM64" }, "m3.large" : { "Arch" : "HVM64" }, "m3.xlarge" : { "Arch" : "HVM64" }, "m3.2xlarge" : { "Arch" : "HVM64" }, "m4.large" : { "Arch" : "HVM64" }, "m4.xlarge" : { "Arch" : "HVM64" }, "m4.2xlarge" : { "Arch" : "HVM64" }, "m4.4xlarge" : { "Arch" : "HVM64" }, "m4.10xlarge" : { "Arch" : "HVM64" }, "c1.medium" : { "Arch" : "HVM64" }, "c1.xlarge" : { "Arch" : "HVM64" }, "c3.large" : { "Arch" : "HVM64" }, "c3.xlarge" : { "Arch" : "HVM64" }, "c3.2xlarge" : { "Arch" : "HVM64" }, "c3.4xlarge" : { "Arch" : "HVM64" }, "c3.8xlarge" : { "Arch" : "HVM64" }, "c4.large" : { "Arch" : "HVM64" }, "c4.xlarge" : { "Arch" : "HVM64" }, "c4.2xlarge" : { "Arch" : "HVM64" }, "c4.4xlarge" : { "Arch" : "HVM64" }, "c4.8xlarge" : { "Arch" : "HVM64" }, "g2.2xlarge" : { "Arch" : "HVMG2" }, "g2.8xlarge" : { "Arch" : "HVMG2" }, "r3.large" : { "Arch" : "HVM64" }, "r3.xlarge" : { "Arch" : "HVM64" }, "r3.2xlarge" : { "Arch" : "HVM64" }, "r3.4xlarge" : { "Arch" : "HVM64" }, "r3.8xlarge" : { "Arch" : "HVM64" }, "i2.xlarge" : { "Arch" : "HVM64" }, "i2.2xlarge" : { "Arch" : "HVM64" }, "i2.4xlarge" : { "Arch" : "HVM64" }, "i2.8xlarge" : { "Arch" : "HVM64" }, "d2.xlarge" : { "Arch" : "HVM64" }, "d2.2xlarge" : { "Arch" : "HVM64" }, "d2.4xlarge" : { "Arch" : "HVM64" }, "d2.8xlarge" : { "Arch" : "HVM64" }, "hi1.4xlarge" : { "Arch" : "HVM64" }, "hs1.8xlarge" : { "Arch" : "HVM64" }, "cr1.8xlarge" : { "Arch" : "HVM64" }, "cc2.8xlarge" : { "Arch" : "HVM64" } }, "AWSInstanceType2NATArch" : { "t1.micro" : { "Arch" : "NATHVM64" }, "t2.nano" : { "Arch" : "NATHVM64" }, "t2.micro" : { "Arch" : "NATHVM64" }, "t2.small" : { "Arch" : "NATHVM64" }, "t2.medium" : { "Arch" : "NATHVM64" }, "t2.large" : { "Arch" : "NATHVM64" }, "m1.small" : { "Arch" : "NATHVM64" }, "m1.medium" : { "Arch" : "NATHVM64" }, "m1.large" : { "Arch" : "NATHVM64" }, "m1.xlarge" : { "Arch" : "NATHVM64" }, "m2.xlarge" : { "Arch" : "NATHVM64" }, "m2.2xlarge" : { "Arch" : "NATHVM64" }, "m2.4xlarge" : { "Arch" : "NATHVM64" }, "m3.medium" : { "Arch" : "NATHVM64" }, "m3.large" : { "Arch" : "NATHVM64" }, "m3.xlarge" : { "Arch" : "NATHVM64" }, "m3.2xlarge" : { "Arch" : "NATHVM64" }, "m4.large" : { "Arch" : "NATHVM64" }, "m4.xlarge" : { "Arch" : "NATHVM64" }, "m4.2xlarge" : { "Arch" : "NATHVM64" }, "m4.4xlarge" : { "Arch" : "NATHVM64" }, "m4.10xlarge" : { "Arch" : "NATHVM64" }, "c1.medium" : { "Arch" : "NATHVM64" }, "c1.xlarge" : { "Arch" : "NATHVM64" }, "c3.large" : { "Arch" : "NATHVM64" }, "c3.xlarge" : { "Arch" : "NATHVM64" }, "c3.2xlarge" : { "Arch" : "NATHVM64" }, "c3.4xlarge" : { "Arch" : "NATHVM64" }, "c3.8xlarge" : { "Arch" : "NATHVM64" }, "c4.large" : { "Arch" : "NATHVM64" }, "c4.xlarge" : { "Arch" : "NATHVM64" }, "c4.2xlarge" : { "Arch" : "NATHVM64" }, "c4.4xlarge" : { "Arch" : "NATHVM64" }, "c4.8xlarge" : { "Arch" : "NATHVM64" }, "g2.2xlarge" : { "Arch" : "NATHVMG2" }, "g2.8xlarge" : { "Arch" : "NATHVMG2" }, "r3.large" : { "Arch" : "NATHVM64" }, "r3.xlarge" : { "Arch" : "NATHVM64" }, "r3.2xlarge" : { "Arch" : "NATHVM64" }, "r3.4xlarge" : { "Arch" : "NATHVM64" }, "r3.8xlarge" : { "Arch" : "NATHVM64" }, "i2.xlarge" : { "Arch" : "NATHVM64" }, "i2.2xlarge" : { "Arch" : "NATHVM64" }, "i2.4xlarge" : { "Arch" : "NATHVM64" }, "i2.8xlarge" : { "Arch" : "NATHVM64" }, "d2.xlarge" : { "Arch" : "NATHVM64" }, "d2.2xlarge" : { "Arch" : "NATHVM64" }, "d2.4xlarge" : { "Arch" : "NATHVM64" }, "d2.8xlarge" : { "Arch" : "NATHVM64" }, "hi1.4xlarge" : { "Arch" : "NATHVM64" }, "hs1.8xlarge" : { "Arch" : "NATHVM64" }, "cr1.8xlarge" : { "Arch" : "NATHVM64" }, "cc2.8xlarge" : { "Arch" : "NATHVM64" } } , "AWSRegionArch2AMI" : { "us-east-1" : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"}, "us-west-2" : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"}, "us-west-1" : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"}, "eu-west-2" : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"}, "eu-west-3" : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"}, "eu-central-1" : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"}, "ap-northeast-1" : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"}, "ap-northeast-2" : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"}, "ap-northeast-3" : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"}, "ap-southeast-1" : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"}, "ap-southeast-2" : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"}, "ap-south-1" : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"}, "us-east-2" : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"}, "ca-central-1" : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"}, "sa-east-1" : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"}, "cn-north-1" : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"}, "cn-northwest-1" : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"} } }, "Resources" : { "NotificationTopic": { "Type": "AWS::SNS::Topic", "Properties": { "Subscription": [ { "Endpoint": { "Ref": "OperatorEMail" }, "Protocol": "email" } ] } }, "WebServerGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : ""}, "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MinSize" : "1", "MaxSize" : "3", "LoadBalancerNames" : [ { "Ref" : "ElasticLoadBalancer" } ], "NotificationConfiguration" : { "TopicARN" : { "Ref" : "NotificationTopic" }, "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR", "autoscaling:EC2_INSTANCE_TERMINATE", "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"] } }, "CreationPolicy" : { "ResourceSignal" : { "Timeout" : "PT15M", "Count" : "1" } }, "UpdatePolicy": { "AutoScalingRollingUpdate": { "MinInstancesInService": "1", "MaxBatchSize": "1", "PauseTime" : "PT15M", "WaitOnResourceSignals": "true" } } }, "LaunchConfig" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple application", "AWS::CloudFormation::Init" : { "config" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<img src=\"", {"Fn::FindInMap" : ["Region2Examples", {"Ref" : "AWS::Region"}, "Examples"]}, "/cloudformation_graphic.png\" alt=\"AWS CloudFormation Logo\"/>", "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" }, "/etc/cfn/cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackId" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]}, "mode" : "000400", "owner" : "root", "group" : "root" }, "/etc/cfn/hooks.d/cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init\n", "action=/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "runas=root\n" ]]} } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" }, "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["/etc/cfn/cfn-hup.conf", "/etc/cfn/hooks.d/cfn-auto-reloader.conf"]} } } } } }, "Properties" : { "KeyName" : { "Ref" : "KeyName" }, "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ], "InstanceType" : { "Ref" : "InstanceType" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -xe\n", "yum update -y aws-cfn-bootstrap\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource LaunchConfig ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServerGroup ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} } }, "WebServerScaleUpPolicy" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "WebServerGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "1" } }, "WebServerScaleDownPolicy" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "WebServerGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "-1" } }, "CPUAlarmHigh": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": "Scale-up if CPU > 90% for 10 minutes", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Period": "300", "EvaluationPeriods": "2", "Threshold": "90", "AlarmActions": [ { "Ref": "WebServerScaleUpPolicy" } ], "Dimensions": [ { "Name": "AutoScalingGroupName", "Value": { "Ref": "WebServerGroup" } } ], "ComparisonOperator": "GreaterThanThreshold" } }, "CPUAlarmLow": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": "Scale-down if CPU < 70% for 10 minutes", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Period": "300", "EvaluationPeriods": "2", "Threshold": "70", "AlarmActions": [ { "Ref": "WebServerScaleDownPolicy" } ], "Dimensions": [ { "Name": "AutoScalingGroupName", "Value": { "Ref": "WebServerGroup" } } ], "ComparisonOperator": "LessThanThreshold" } }, "ElasticLoadBalancer" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Properties" : { "AvailabilityZones" : { "Fn::GetAZs" : "" }, "CrossZone" : "true", "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "80", "Protocol" : "HTTP" } ], "HealthCheck" : { "Target" : "HTTP:80/", "HealthyThreshold" : "3", "UnhealthyThreshold" : "5", "Interval" : "30", "Timeout" : "5" } } }, "InstanceSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable SSH access and HTTP from the load balancer only", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : { "Ref" : "SSHLocation"} }, { "IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "SourceSecurityGroupOwnerId" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.OwnerAlias"]}, "SourceSecurityGroupName" : {"Fn::GetAtt" : ["ElasticLoadBalancer", "SourceSecurityGroup.GroupName"]} } ] } } }, "Outputs" : { "URL" : { "Description" : "The URL of the website", "Value" : { "Fn::Join" : [ "", [ "http://", { "Fn::GetAtt" : [ "ElasticLoadBalancer", "DNSName" ]}]]} } } }

Walkthrough zu Vorlagen

Die Beispielvorlage enthält eine Auto Scaling-Gruppe mit einem LoadBalancer, einer Sicherheitsgruppe die Eingangsregeln definiert, CloudWatch-Alarmen und Skalierungsrichtlinien.

Die Vorlage hat drei Eingabeparameter: InstanceType ist der Typ der EC2-Instance, der für die Auto Scaling-Gruppe verwendet werden soll, und weist einen Standardwert von "m1.small" auf; WebServerPort ist der TCP-Port für den Webserver und weist einen Standardwert von 8888 auf; KeyName ist der Name eines EC2-Schlüsselpaars, das für die Auto Scaling-Gruppe verwendet werden soll. KeyName muss bei der Stack-Erstellung angegeben werden (Parameter ohne Standardwert müssen bei der Stack-Erstellung angegeben werden).

Die AWS::AutoScaling::AutoScalingGroup-Ressource „WebServerGroup“ deklariert die folgenden Auto Scaling-Gruppenkonfiguration:

  • AvailabilityZones gibt die Availability Zones an, in denen die EC2-Instances der Auto Scaling-Gruppe erstellt werden. Der Fn::GetAZs-Funktionsaufruf { "Fn::GetAZs" : "" } gibt alle Availability Zones für die Region an, in dem der Stack erstellt wird.

  • MinSize und MaxSize bestimmen die Mindest- und Höchstanzahl von EC2-Instances in der Auto Scaling-Gruppe.

  • LoadBalancerNames listet die LoadBalancers auf, die zur Weiterleitung des Datenverkehrs an die Auto Scaling-Gruppe verwendet werden. Der LoadBalancer für diese Gruppe ist die ElasticLoadBalancer-Ressource.

Die AWS::AutoScaling::LaunchConfiguration-Ressource „LaunchConfig“ deklariert die folgenden Konfigurationen, die für die EC2-Instances in der Auto Scaling-Gruppe „WebServerGroup“ verwendet werden sollen:

  • KeyName verwendet den Wert des KeyName-Eingabeparameters als das zu verwendende EC2-Schlüsselpaar.

  • UserData ist der Base64-kodierte Wert des WebServerPort-Parameters, der an die Anwendung übergeben wird.

  • SecurityGroups ist eine Liste der EC2-Sicherheitsgruppen mit den Firewall-Eingangsregeln für EC2-Instances in der Auto Scaling-Gruppe. In diesem Beispiel gibt es nur eine Sicherheitsgruppe, und diese ist als AWS::EC2::SecurityGroup-Ressource deklariert: InstanceSecurityGroup. Diese Sicherheitsgruppe enthält zwei Eingangsregeln: 1. Eine TCP-Eingangsregel, die Zugriff von allen IP-Adressen ("CidrIp" : "0.0.0.0/0") für Port 22 (für SSH-Zugriff) ermöglicht, und 2. Eine TCP-Eingangsregel, die Zugriff von der ElasticLoadBalancer-Ressource für den WebServerPort-Port ermöglicht, indem die Sicherheitsgruppe der Quelle des LoadBalancers angegeben wird. Die GetAtt-Funktion wird verwendet, um die Eigenschaften "SourceSecurityGroup.OwnerAlias" und "SourceSecurityGroup.GroupName" aus der ElasticLoadBalancer-Ressource abzurufen. Weitere Informationen zu den Elastic Load Balancing-Sicherheitsgruppen finden Sie unter Verwalten von Sicherheitsgruppen in Amazon EC2-Classic oder Verwalten von Sicherheitsgruppen in Amazon VPC.

  • ImageId ist der bewertete Wert eines Satzes geschachtelter Zuordnungen. Die Zuordnungen wurden hinzugefügt, damit die Vorlage die Logik zur Auswahl der korrekten Image-ID enthält. Diese Logik basiert auf dem Instance-Typ, der mit dem InstanceType-Parameter (AWSInstanceType2Arch ordnet den Instance-Typ einer 32- oder 64-Architektur zu) und dem Bereich angegeben wurde, in dem der Stack erstellt wird (AWSRegionArch2AMI ordnet den Bereich und die Architektur einer Image-ID zu):

    { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ]}

    Wenn Sie diese Vorlage zum Beispiel verwenden, um den Stack im Bereich us-east-2 zu erstellen, und Sie geben "m1.small" als InstanceTyp an, so würde AWS CloudFormation die innere Zuordnung für AWSInstanceType wie folgt auswerten:

    { "Fn::FindInMap" : [ "AWSInstanceType2Arch", "m1.small", "Arch" ] }

    In der AWSInstanceType2Arch-Zuordnung entspricht der Arch-Wert für den m1.small-Schlüssel 32, was als Wert für die äußere Zuordnung verwendet wird. Der Schlüssel ist das ausgewertete Ergebnis des AWS::Region-Pseudoparameters, der dem Bereich entspricht, in dem der Stack erstellt wird. Für dieses Beispiel entspricht AWS::Region "us-east-1". Die äußere Zuordnung wird daher wie folgt ausgewertet:

    Fn::FindInMap" : [ "AWSRegionArch2AMI", "us-east-1", "32"]

    In der AWSRegionArch2AMI-Zuordnung entspricht der Wert 32 für den Schlüssel "us-east-1" "ami-6411e20d". Dies bedeutet, dass ImageId "ami-6411e20d" wäre.

Die AWS::ElasticLoadBalancing::LoadBalancer-Ressource „ElasticLoadBalancer“ deklariert die folgende LoadBalancer-Konfiguration:

  • AvailabilityZones ist eine Liste von Availability Zones, in denen der LoadBalancer den Datenverkehr verteilt. In diesem Beispiel gibt der Fn::GetAZs-Funktionsaufruf { "Fn::GetAZs" : "" } alle Availability Zones für die Region an, in dem der Stack erstellt wird.

  • Listener ist eine Liste von Load Balancing-Routingkonfigurationen, die den Port angeben, an dem der LoadBalancer Anforderungen akzeptiert, den Port auf den EC2-Instances, an denen der LoadBalancer Anforderungen weiterleitet, sowie das Protokoll, das zum Weiterleiten von Anforderungen verwendet wird.

  • HealthCheck ist die Konfiguration, die Elastic Load Balancing zum Überprüfen des Zustands der EC2-Instances verwendet, an die der LoadBalancer Datenverkehr weiterleitet. In diesem Beispiel zielt HealthCheck auf die Stammadresse der EC2-Instances ab und verwendet dafür den vom WebServerPort über das HTTP-Protokoll angegebenen Port. Wenn der WebServerPort 8888 lautet, wird der { "Fn::Join" : [ "", ["HTTP:", { "Ref" : "WebServerPort" }, "/"]]}-Funktionsaufruf als die Zeichenfolge HTTP:8888/ ausgewertet. Außerdem wird angegeben, dass die EC2-Instances ein Intervall von 30 Sekunden zwischen Zustandsprüfungen (Interval) aufweisen. Die Zeitbeschränkung ist definiert als die Zeitdauer, die Elastic Load Balancing auf eine Reaktion vom Ziel der Zustandsprüfung wartet (in diesem Beispiel 5 Sekunden). Nach Ablauf der Zeitüberschreitung markiert Elastic Load Balancing die Zustandsprüfung der EC2-Instance als instabil. Wenn bei einer EC2-Instance 5 aufeinander folgende Zustandsprüfungen fehlschlagen (UnhealthyThreshold), stoppt Elastic Load Balancing die Weiterleitung des Datenverkehrs an diese EC2-Instance, bis bei dieser Instance 3 aufeinander folgende fehlerfreie Zustandsprüfungen auftreten. Zu diesem Zeitpunkt betrachtet Elastic Load Balancing die EC2-Instance als fehlerfrei und beginnt erneut, Datenverkehr an diese Instance weiterzuleiten.

Die AWS::AutoScaling::ScalingPolicy-Ressource „WebServerScaleUpPolicy“ ist eine einfache Skalierungsrichtlinie, die die Auto Scaling-Gruppe „WebServerGroup“ nach oben skaliert. Die AdjustmentType-Eigenschaft ist auf "ChangeInCapacity" festgelegt. Das bedeutet, dass der ScalingAdjustment die Anzahl der Instances darstellt, die hinzugefügt werden sollen (wenn ScalingAdjustment positiv ist, werden Instances hinzugefügt; wenn er negativ ist, werden Instances gelöscht). In diesem Beispiel ist ScalingAdjustment auf 1 gesetzt. Wenn die Skalierungsrichtlinie ausgeführt wird, wird die Anzahl der EC2-Instances in der Gruppe also um 1 erhöht. Die Cooldown-Eigenschaft gibt an, dass Amazon EC2 Auto Scaling 60 Sekunden wartet, bevor andere Skalierungsaktivitäten aufgrund einfacher Skalierungsrichtlinien gestartet werden.

Die AWS::CloudWatch::Alarm-Ressource „CPUAlarmHigh“ legt fest, dass die einfache Skalierungsrichtlinie „WebServerScaleUpPolicy“ als Aktion ausgeführt wird, sobald der Alarm in den Status ALARM (AlarmActions) wechselt. Der Alarm überwacht die EC2-Instances in der Auto Scaling-Gruppe "WebServerGroup" (Dimensionen). Der Alarm misst die durchschnittliche (statistische) CPU-Auslastung der EC2-Instance (Namespace und MetricName) der Instances in der WebServerGroup (Dimensionen) über ein Intervall von 300 Sekunden (Zeitraum). Wenn dieser Wert (durchschnittliche CPU-Auslastung über 300 Sekunden) größer als 90 Prozent (ComparisonOperator und Threshold) für zwei aufeinander folgende Zeiträume (EvaluationPeriod) bleibt, wird der Alarm in den Status ALARM versetzt, und CloudWatch führt die oben beschriebene WebServerScaleUpPolicy-Richtlinie (AlarmActions) zum Skalieren der WebServerGroup aus.

Der CPUAlarmLow-Alarm misst dieselben Metriken, weist aber einen Alarm auf, der ausgelöst wird, wenn die CPU-Auslastung weniger als 75 Prozent (ComparisonOperator und Threshold) beträgt, und die WebServerScaleDownPolicy-Richtlinie ausführt, um eine EC2-Instance aus der Auto Scaling-Gruppe "WebServerGroup" zu entfernen.