Demonstração: Criar um servidor web escalável com balanceamento de carga - AWS CloudFormation

Demonstração: Criar um servidor web escalável com balanceamento de carga

Este modelo cria um site da web de exemplo que usa o Amazon EC2 Auto Scaling e o Elastic Load Balancing e está configurado para usar várias zonas de disponibilidade. O modelo também contém alarmes do CloudWatch que executam políticas de escalabilidade para adicionar ou remover instâncias do grupo de Auto Scaling quando os limites definidos são excedidos.

Este modelo cria uma ou mais instâncias do Amazon EC2. Você será cobrado pelos recursos da AWS usados se criar uma pilha com base nesse modelo.

nota

O modelo pressupõe que a conta seja compatível com a plataforma EC2-VPC. Em outras palavras, você tem um VPC padrão que permite que as instâncias acessem a Internet. Caso não tenha uma VPC padrão, você pode criar uma. Para obter mais informações, consulte Amazon EC2 e Amazon Virtual Private Cloud no Guia do usuário do Amazon EC2 para instâncias do Linux.

Obtenha a versão mais recente desse modelo de exemplo em https://s3.amazonaws.com/cloudformation-templates-us-east-1/AutoScalingMultiAZWithNotifications.template.

Modelo Multi-AZ do 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" ]}]]} } } }

Demonstração do modelo

O modelo de exemplo contém um grupo de Auto Scaling com um LoadBalancer, um grupo de segurança que define regras de entrada, alarmes do CloudWatch e políticas de escalabilidade.

O modelo tem três parâmetros de entrada: InstanceType é o tipo de instância do EC2 a ser usado no grupo de Auto Scaling e tem um padrão m1.small; WebServerPort é a porta TCP para o servidor da web e tem um padrão 8888; KeyName é o nome de um par de chaves do EC2 a ser usado no grupo de Auto Scaling. KeyName deve ser especificado na criação da pilha (parâmetros sem valor padrão devem ser especificados na criação da pilha).

O recurso AWS::AutoScaling::AutoScalingGroup WebServerGroup declara a seguinte configuração do grupo de Auto Scaling:

  • AvailabilityZones especifica as zonas de disponibilidade nas quais as instâncias do EC2 do grupo de Auto Scaling serão criadas. A chamada à função Fn::GetAZs { "Fn::GetAZs" : "" } especifica todas as zonas de disponibilidade para a região na qual a pilha é criada.

  • MinSize e MaxSize definem os números mínimo e máximo de instâncias do EC2 no grupo de Auto Scaling.

  • LoadBalancerNames lista os LoadBalancers usados a fim de rotear tráfego para o grupo de Auto Scaling. O LoadBalancer desse grupo é o recurso ElasticLoadBalancer.

O recurso AWS::AutoScaling::LaunchConfiguration LaunchConfig declara as seguintes configurações a serem usadas nas instâncias do EC2 no grupo de Auto Scaling WebServerGroup:

  • KeyName utiliza o valor do parâmetro de entrada KeyName como o par de chaves do EC2 a ser usado.

  • UserData é o valor codificado em Base64 do parâmetro WebServerPort, passado para uma aplicação.

  • SecurityGroups é uma lista de grupos de segurança do EC2 que contêm regras de entrada do firewall para instâncias do EC2 no grupo de Auto Scaling. Neste exemplo, só existe um grupo de segurança e declarado como um recurso AWS::EC2::SecurityGroup: InstanceSecurityGroup. Esse grupo de segurança contém duas regras de entrada: 1) uma regra de entrada TCP que permite o acesso de todos os endereços IP ("CidrIp" : "0.0.0.0/0") para a porta 22 (para acesso SSH) e 2) uma regra de entrada TCP que permite o acesso pelo recurso ElasticLoadBalancer para a porta WebServerPort especificando o grupo de segurança da fonte do LoadBalancer. A função GetAtt função é usada para obter as propriedades SourceSecurityGroup.OwnerAlias and SourceSecurityGroup.GroupName pelo recurso ElasticLoadBalancer. Para obter mais informações sobre os grupos de segurança do Elastic Load Balancing, consulte Gerenciar grupos de segurança no Amazon Amazon EC2-Classic ou Gerenciar grupos de segurança na Amazon VPC.

  • ImageId é o valor avaliado de um conjunto de mapas aninhados. Adicionamos os mapas de maneira que o modelo contivesse a lógica para a escolha de um ID de imagem certa. Essa lógica se baseia no tipo de instância que foi especificado com o parâmetro InstanceType (AWSInstanceType2Arch mapeia o tipo de instância para uma arquitetura 32 ou 64) e na região onde a pilha é criada (AWSRegionArch2AMI mapeia a região e a arquitetura para um ID de imagem):

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

    Por exemplo, se você usasse esse modelo para criar uma pilha na região us-east-2 e especificasse m1.small como InstanceType, o AWS CloudFormation avaliaria o mapa interno para AWSInstanceType2Arch da seguinte maneira:

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

    No mapeamento AWSInstanceType2Arch, o valor Arch da chave m1.small é mapeado para 32, usado como o valor para o mapa externo. A chave é o resultado avaliado do pseudoparâmetro AWS::Region que é a região onde a pilha está sendo criada. Para esse exemplo, AWS::Region é us-east-1. Portanto, o mapa externo é avaliado da seguinte maneira:

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

    No mapeamento AWSRegionArch2AMI, o valor 32 da chave us-east-1 é mapeado para ami-6411e20d. Isso significa que ImageId seria ami-6411e20d.

O recurso AWS::ElasticLoadBalancing::LoadBalancer ElasticLoadBalancer declara a seguinte configuração de LoadBalancer:

  • AvailabilityZones é uma lista de zonas de disponibilidade em que o LoadBalancer distribuirá o tráfego. Neste exemplo, a chamada à função Fn::GetAZs { "Fn::GetAZs" : "" } especifica todas as zonas de disponibilidade para a região na qual a pilha é criada.

  • Listeners é uma lista de configurações de roteamento de balanceamento de carga que especificam a porta em que LoadBalancer aceita solicitações, a porta nas instâncias do EC2 registradas, em que LoadBalancer encaminha solicitações e o protocolo usado para rotear as solicitações.

  • HealthCheck é a configuração que o Elastic Load Balancing usa para verificar a integridade das instâncias do EC2 para as quais o LoadBalancer roteia o tráfego. Neste exemplo, HealthCheck segmenta o endereço raiz das instâncias EC2 usando a porta especificada por WebServerPort pelo protocolo HTTP. Caso WebServerPort seja 8888, a chamada à função { "Fn::Join" : [ "", ["HTTP:", { "Ref" : "WebServerPort" }, "/"]]} é avaliada como a string HTTP:8888/. Ela também especifica que as instâncias EC2 têm um intervalo de 30 segundos entre verificações de integridade (intervalo). Timeout é definido como o tempo que Elastic Load Balancing espera por uma resposta do destino da verificação de integridade (5 segundos neste exemplo). Após a decorrência do período Timeout, Elastic Load Balancing marca essa verificação de integridade da instância EC2 como não íntegro. Quando uma instância EC2 falha em 5 verificações de integridade consecutivas (UnhealthyThreshold), o Elastic Load Balancing para de rotear o tráfego para essa instância EC2 até que esta instância tenha 3 verificações de integridade consecutivas no ponto em que Elastic Load Balancing considera a instância EC2 íntegra e começa o roteamento do tráfego para essa instância novamente.

O recurso AWS::AutoScaling::ScalingPolicy WebServerScaleUpPolicy é uma política de escalabilidade simples que dimensiona até o grupo de Auto Scaling WebServerGroup. A propriedade AdjustmentType é definida como ChangeInCapacity. Isso significa que o ScalingAdjustment representa o número de instâncias a serem adicionadas (caso ScalingAdjustment seja positivo, as instâncias são adicionadas; caso negativo, as instâncias são excluídas). Neste exemplo, ScalingAdjustment é 1; por isso, a política de escalabilidade incrementa o número de instâncias do EC2 no grupo em 1 quando a política é executada. A propriedade Cooldown especifica que o Amazon EC2 Auto Scaling aguarda 60 segundos antes de iniciar qualquer outra ação de escalabilidade devido a políticas de escalabilidade simples.

O recurso AWS::CloudWatch::Alarm CPUAlarmHigh especifica a política de escalabilidade simples WebServerScaleUpPolicy como a ação a ser executada quando o alarme está em um estado ALARM (AlarmActions). O alarme monitora as instâncias do EC2 no grupo de Auto Scaling WebServerGroup (Dimensions). O alarme avalia a utilização de CPU média (Statistic) do EC2 (Namespace e MetricName) das instâncias no WebServerGroup (Dimensions) ao longo de um período de 300 segundos (Period). Quando esse valor (utilização média da CPU por mais de 300 segundos) permanecer superior a 90% (ComparisonOperator e Threshold) por 2 períodos consecutivos (EvaluationPeriod), o alerta entrará em um estado ALARM e o CloudWatch executará a política WebServerScaleUpPolicy (AlarmActions) descrita acima para chegar ao WebServerGroup.

O alarme CPUAlarmLow mede as mesmas métricas, mas tem um alarme que é acionado quando a utilização da CPU é inferior a 75% (ComparisonOperator e Threshold) e executa a política WebServerScaleDownPolicy para remover 1 instância do EC2 do grupo de Auto Scaling WebServerGroup.