Criar uma aplicação dimensionada e com balanceamento de carga
Neste passo a passo, você cria uma pilha que ajuda a configurar uma aplicação dimensionada e com balanceamento de carga. O passo a passo fornece um modelo de exemplo que você usa para criar a pilha. O modelo de exemplo provisiona um grupo do Auto Scaling, um Application Load Balancer, grupos de segurança que controlam o tráfego para o balanceador de carga e para o grupo do Auto Scaling e uma configuração de notificação do Amazon SNS para publicar notificações sobre atividades de escalabilidade.
Esse modelo cria uma ou mais instâncias do Amazon EC2 e um Application Load Balancer. Você será cobrado pelos recursos da AWS usados se criar uma pilha com base nesse modelo.
Modelo de pilha completo
Vamos começar com o modelo.
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: InstanceType: Description: The EC2 instance type Type: String Default: t3.micro AllowedValues: - t3.micro - t3.small - t3.medium KeyName: Description: Name of an existing EC2 key pair to allow SSH access to the instances Type: 'AWS::EC2::KeyPair::KeyName' LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' OperatorEmail: Description: The email address to notify when there are any scaling activities Type: String 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 ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Subnets: Type: 'List<AWS::EC2::Subnet::Id>' Description: At least two public subnets in different Availability Zones in the selected VPC VPC: Type: 'AWS::EC2::VPC::Id' Description: A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet Resources: ELBSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: ELB Security Group VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 EC2SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: EC2 Security Group VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 SourceSecurityGroupId: Fn::GetAtt: - ELBSecurityGroup - GroupId - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation EC2TargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: HealthCheckIntervalSeconds: 30 HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 15 HealthyThresholdCount: 5 Matcher: HttpCode: '200' Name: EC2TargetGroup Port: 80 Protocol: HTTP TargetGroupAttributes: - Key: deregistration_delay.timeout_seconds Value: '20' UnhealthyThresholdCount: 3 VpcId: !Ref VPC ALBListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: DefaultActions: - Type: forward TargetGroupArn: !Ref EC2TargetGroup LoadBalancerArn: !Ref ApplicationLoadBalancer Port: 80 Protocol: HTTP ApplicationLoadBalancer: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Properties: Scheme: internet-facing Subnets: !Ref Subnets SecurityGroups: - !GetAtt ELBSecurityGroup.GroupId LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: LaunchTemplateName: !Sub ${AWS::StackName}-launch-template LaunchTemplateData: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType KeyName: !Ref KeyName SecurityGroupIds: - !Ref EC2SecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<h1>Hello World!</h1>" > /var/www/html/index.html NotificationTopic: Type: AWS::SNS::Topic Properties: Subscription: - Endpoint: !Ref OperatorEmail Protocol: email WebServerGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: LaunchTemplate: LaunchTemplateId: !Ref LaunchTemplate Version: !GetAtt LaunchTemplate.LatestVersionNumber MaxSize: '3' MinSize: '1' NotificationConfigurations: - TopicARN: !Ref NotificationTopic NotificationTypes: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR'] TargetGroupARNs: - !Ref EC2TargetGroup VPCZoneIdentifier: !Ref Subnets
JSON
{ "AWSTemplateFormatVersion":"2010-09-09", "Parameters":{ "InstanceType":{ "Description":"The EC2 instance type", "Type":"String", "Default":"t3.micro", "AllowedValues":[ "t3.micro", "t3.small", "t3.medium" ] }, "KeyName":{ "Description":"Name of an existing EC2 key pair to allow SSH access to the instances", "Type":"AWS::EC2::KeyPair::KeyName" }, "LatestAmiId":{ "Description":"The latest Amazon Linux 2 AMI from the Parameter Store", "Type":"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>", "Default":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" }, "OperatorEmail":{ "Description":"The email address to notify when there are any scaling activities", "Type":"String" }, "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", "ConstraintDescription":"Must be a valid IP CIDR range of the form x.x.x.x/x." }, "Subnets":{ "Type":"List<AWS::EC2::Subnet::Id>", "Description":"At least two public subnets in different Availability Zones in the selected VPC" }, "VPC":{ "Type":"AWS::EC2::VPC::Id", "Description":"A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet" } }, "Resources":{ "ELBSecurityGroup":{ "Type":"AWS::EC2::SecurityGroup", "Properties":{ "GroupDescription":"ELB Security Group", "VpcId":{ "Ref":"VPC" }, "SecurityGroupIngress":[ { "IpProtocol":"tcp", "FromPort":80, "ToPort":80, "CidrIp":"0.0.0.0/0" } ] } }, "EC2SecurityGroup":{ "Type":"AWS::EC2::SecurityGroup", "Properties":{ "GroupDescription":"EC2 Security Group", "VpcId":{ "Ref":"VPC" }, "SecurityGroupIngress":[ { "IpProtocol":"tcp", "FromPort":80, "ToPort":80, "SourceSecurityGroupId":{ "Fn::GetAtt":[ "ELBSecurityGroup", "GroupId" ] } }, { "IpProtocol":"tcp", "FromPort":22, "ToPort":22, "CidrIp":{ "Ref":"SSHLocation" } } ] } }, "EC2TargetGroup":{ "Type":"AWS::ElasticLoadBalancingV2::TargetGroup", "Properties":{ "HealthCheckIntervalSeconds":30, "HealthCheckProtocol":"HTTP", "HealthCheckTimeoutSeconds":15, "HealthyThresholdCount":5, "Matcher":{ "HttpCode":"200" }, "Name":"EC2TargetGroup", "Port":80, "Protocol":"HTTP", "TargetGroupAttributes":[ { "Key":"deregistration_delay.timeout_seconds", "Value":"20" } ], "UnhealthyThresholdCount":3, "VpcId":{ "Ref":"VPC" } } }, "ALBListener":{ "Type":"AWS::ElasticLoadBalancingV2::Listener", "Properties":{ "DefaultActions":[ { "Type":"forward", "TargetGroupArn":{ "Ref":"EC2TargetGroup" } } ], "LoadBalancerArn":{ "Ref":"ApplicationLoadBalancer" }, "Port":80, "Protocol":"HTTP" } }, "ApplicationLoadBalancer":{ "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer", "Properties":{ "Scheme":"internet-facing", "Subnets":{ "Ref":"Subnets" }, "SecurityGroups":[ { "Fn::GetAtt":[ "ELBSecurityGroup", "GroupId" ] } ] } }, "LaunchTemplate":{ "Type":"AWS::EC2::LaunchTemplate", "Properties":{ "LaunchTemplateName":{ "Fn::Sub":"${AWS::StackName}-launch-template" }, "LaunchTemplateData":{ "ImageId":{ "Ref":"LatestAmiId" }, "InstanceType":{ "Ref":"InstanceType" }, "KeyName":{ "Ref":"KeyName" }, "SecurityGroupIds":[ { "Ref":"EC2SecurityGroup" } ], "UserData":{ "Fn::Base64":{ "Fn::Join":[ "", [ "#!/bin/bash\n", "yum update -y\n", "yum install -y httpd\n", "systemctl start httpd\n", "systemctl enable httpd\n", "echo \"<h1>Hello World!</h1>\" > /var/www/html/index.html" ] ] } } } } }, "NotificationTopic":{ "Type":"AWS::SNS::Topic", "Properties":{ "Subscription":[ { "Endpoint":{ "Ref":"OperatorEmail" }, "Protocol":"email" } ] } }, "WebServerGroup":{ "Type":"AWS::AutoScaling::AutoScalingGroup", "Properties":{ "LaunchTemplate":{ "LaunchTemplateId":{ "Ref":"LaunchTemplate" }, "Version":{ "Fn::GetAtt":[ "LaunchTemplate", "LatestVersionNumber" ] } }, "MaxSize":"3", "MinSize":"1", "NotificationConfigurations":[ { "TopicARN":{ "Ref":"NotificationTopic" }, "NotificationTypes":[ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR", "autoscaling:EC2_INSTANCE_TERMINATE", "autoscaling:EC2_INSTANCE_TERMINATE_ERROR" ] } ], "TargetGroupARNs":[ { "Ref":"EC2TargetGroup" } ], "VPCZoneIdentifier":{ "Ref":"Subnets" } } } } }
Demonstração do modelo
A primeira parte desse modelo especifica o Parameters
. A cada parâmetro deve receber um valor em tempo de execução para que o AWS CloudFormation provisione a pilha com êxito. Os recursos especificados mais tarde nesse modelo fazem referência a esses valores e usam os dados.
-
InstanceType
: o tipo de instância do EC2 provisionado pelo Amazon EC2 Auto Scaling. Se não especificado, um padrão det3.micro
será usado. -
KeyName
: um par de chaves do EC2 existente para permitir o acesso SSH às instâncias. -
LatestAmiId
: a imagem de máquina da Amazon (AMI) para as instâncias. Se não for especificada, suas instâncias serão iniciadas com uma AMI do Amazon Linux 2, usando um parâmetro público AWS Systems Manager mantido pelo AWS. Para obter mais informações, consulte Localizar parâmetros públicos, no Guia do usuário do AWS Systems Manager. -
OperatorEmail
: o endereço de e-mail para o qual você deseja enviar notificações de atividade de escalabilidade. -
SSHLocation
: o intervalo de endereços IP que pode ser usado para aplicar SSH nas instâncias. -
Subnets
: pelo menos duas sub-redes públicas devem estar em diferentes zonas de disponibilidade. -
VPC
: uma nuvem privada virtual (VPC) na sua conta que permite aos recursos em sub-redes públicas se conectarem à Internet.nota
Você pode usar a VPC padrão e as sub-redes padrão para permitir que as instâncias acessem a Internet. Nesse último caso, certifique-se de que a VPC tenha uma sub-rede mapeada para cada zona de disponibilidade da região na qual você está trabalhando. No mínimo, é necessário ter duas sub-redes públicas disponíveis para criar o balanceador de carga.
A próxima parte desse modelo especifica o Resources
. Esta seção especifica os recursos da pilha e suas propriedades.
ELBSecurityGroup
do recurso AWS::EC2::SecurityGroup
-
SecurityGroupIngress
contém uma regra de entrada TCP que permite acesso de todos os endereços IP (“CidrIp”: “0.0.0.0/0") na porta 80.
EC2SecurityGroup
do recurso AWS::EC2::SecurityGroup
-
SecurityGroupIngress
contém duas regras de entrada: 1) uma regra de entrada TCP que permite acesso SSH (porta 22) a partir do intervalo de endereços IP que você fornece ao parâmetro de entradaSSHLocation
e 2) uma regra de entrada TCP que permite acesso do balanceador de carga especificando o grupo de segurança do balanceador de carga. A função GetAtt é usada para obter o ID do grupo de segurança com o nome lógicoELBSecurityGroup
.
Recurso AWS::ElasticLoadBalancingV2::TargetGroup EC2TargetGroup
-
Port
,Protocol
eHealthCheckProtocol
especificam a porta da instância (80) e o protocolo (HTTP) para onde oApplicationLoadBalancer
roteia o tráfego e que o Elastic Load Balancing utiliza para verificar a integridade das instâncias do EC2. -
HealthCheckIntervalSeconds
especifica que as instâncias do EC2 têm um intervalo de 30 segundos entre verificações de integridade. OHealthCheckTimeoutSeconds
é definido como o tempo que Elastic Load Balancing espera por uma resposta do destino da verificação de integridade (15 segundos neste exemplo). Após o tempo limite, o Elastic Load Balancing marca essa verificação de integridade da instância do EC2 como não íntegra. Quando uma instância do EC2 falha em três verificações de integridade consecutivas (UnhealthyThresholdCount
), o Elastic Load Balancing interrompe o roteamento do tráfego para essa instância do EC2 até que ela tenha cinco verificações de integridade positivas consecutivas (HealthyThresholdCount
). Nesse ponto, o Elastic Load Balancing considera a instância íntegra e começa a rotear o tráfego para ela novamente. -
TargetGroupAttributes
atualiza o valor do atraso de cancelamento do registro do grupo de destino para 20 segundos. Por padrão, o Elastic Load Balancing aguarda 300 segundos antes de concluir o processo de cancelamento do registro.
Recurso AWS::ElasticLoadBalancingV2::Listener ALBListener
-
DefaultActions
especifica a porta na qual o balanceador de carga escuta, o grupo de destino ao qual o balanceador de carga encaminha solicitações e o protocolo usado para rotear as solicitações.
Recurso AWS::ElasticLoadBalancingV2::LoadBalancer ApplicationLoadBalancer
-
Subnets
usa o valor do parâmetro de entradaSubnets
como a lista de sub-redes públicas nas quais os nós do balanceador de carga serão criados. -
SecurityGroup
obtém o ID do grupo de segurança que atua como um firewall virtual para seus nós de balanceador de carga a fim de controlar o tráfego de entrada. A função GetAtt é usada para obter o ID do grupo de segurança com o nome lógicoELBSecurityGroup
.
Recurso AWS::EC2::LaunchTemplate LaunchTemplate
-
ImageId
usa o valor do parâmetro de entradaLatestAmiId
como a AMI a ser usada. -
KeyName
usa o valor do parâmetro de entradaKeyName
como o par de chaves do EC2 a ser usado. -
SecurityGroupIds
obtém o ID do grupo de segurança com o nome lógicoEC2SecurityGroup
que atua como um firewall virtual para suas instâncias do EC2 a fim de controlar o tráfego de entrada. -
UserData
é um script de configuração executado depois que a instância está ativa e em execução. Neste exemplo, o script instala o Apache e cria um arquivo index.html.
Recurso AWS::SNS::Topic NotificationTopic
-
Subscription
usa o valor do parâmetro de entradaOperatorEmail
como o endereço de e-mail do destinatário das notificações quando há atividades de escalabilidade.
Recurso AWS::AutoScaling::AutoScalingGroup WebServerGroup
-
MinSize
eMaxSize
definem os números mínimo e máximo de instâncias do EC2 no grupo do Auto Scaling. -
TargetGroupARNs
usa o ARN do grupo de destino com o nome lógicoEC2TargetGroup
. À medida que esse grupo do Auto Scaling é escalado, ele automaticamente registra e cancela o registro de instâncias nesse grupo de destino. -
VPCZoneIdentifier
usa o valor do parâmetro de entradaSubnets
como a lista de sub-redes públicas nas quais as instâncias do EC2 podem ser criadas.
Etapa 1: Iniciar a pilha
Para iniciar a pilha, verifique se você tem permissões do AWS Identity and Access Management (IAM) para usar todos estes serviços: Amazon EC2, Amazon EC2 Auto Scaling,AWS Systems Manager, Elastic Load Balancing, Amazon SNS e AWS CloudFormation.
O procedimento a seguir envolve o upload do modelo de pilha de amostra a partir de um arquivo. Abra um editor de texto na máquina local e adicione um dos modelos. Salve o arquivo com o nome sampleloadbalancedappstack.template
.
Para executar o modelo de pilha
-
Faça login no AWS Management Console e abra o console AWS CloudFormation em https://console.aws.amazon.com/cloudformation
. -
Escolha Create stack (Criar pilha), With new resources (Com novos recursos (padrão)).
-
Em Especificar modelo, selecione Carregar um arquivo de modelo e depois Escolher arquivo para carregar o arquivo
sampleloadbalancedappstack.template
. -
Escolha Próximo.
-
Na página Specify stack details (Especificar detalhes da pilha), digite um nome para a pilha (por exemplo,
SampleLoadBalancedAppStack
). -
Em Parameters (Parâmetros), analise os parâmetros da pilha e forneça valores para todos os parâmetros que não tenham valores padrão, incluindo OperatorEmail, SSHLocation, KeyName, VPC e Subnets.
-
Escolha Next (Próximo) duas vezes.
-
Na página Revisar, verifique e confirme as configurações.
-
Selecione Enviar.
Você pode visualizar o status da pilha no console do AWS CloudFormation, na coluna Status. Quando o AWS CloudFormation criar a pilha, você receberá o status CREATE_COMPLETE.
nota
Depois de criar a pilha, você deve confirmar a assinatura para que o endereço de e-mail possa começar a receber notificações. Para obter mais informações, consulte Obter notificações do Amazon SNS quando o grupo do Auto Scaling é dimensionado no Guia do usuário do Amazon EC2 Auto Scaling.
Etapa 2: limpar recursos de amostra
Para ter certeza de que você não será cobrado por recursos de amostra não utilizados, exclua a pilha.
Para excluir a pilha
-
No console do AWS CloudFormation, selecione a pilha SampleLoadBalancedAppStack.
-
Escolha Excluir.
-
Na mensagem de confirmação, escolha Delete stack (Excluir pilha).
O status de SampleLoadBalancedAppStack muda para DELETE_IN_PROGRESS. Quando o AWS CloudFormation conclui a exclusão da pilha, ela é removida da lista.
Use o modelos de exemplo deste passo a passo para criar seus próprios modelos de pilha. Para obter mais informações, consulte Tutorial: Configurar uma aplicação dimensionada e com balanceamento de carga, no Guia do usuário do Amazon EC2 Auto Scaling.