Passo a passo: criar uma aplicação dimensionada e com balanceamento de carga - AWS CloudFormation

Passo a passo: 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 ser atribuído 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 de t3.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.

Recurso AWS::EC2::SecurityGroup ELBSecurityGroup

  • SecurityGroupIngress contém uma regra de entrada TCP que permite acesso de todos os endereços IP (“CidrIp”: “0.0.0.0.0/0") na porta 80.

Recurso AWS::EC2::SecurityGroup EC2SecurityGroup

  • 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 entrada SecurityGroupIngress 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ógico ELBSecurityGroup.

Recurso AWS::ElasticLoadBalancingV2::TargetGroup EC2TargetGroup

  • Port, Protocol e HealthCheckProtocol especificam a porta da instância (80) e o protocolo (HTTP) para onde o ApplicationLoadBalancer 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. O HealthCheckTimeoutSeconds é 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 entrada Subnets 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ógico ELBSecurityGroup.

Recurso AWS::EC2::LaunchTemplate LaunchTemplate

  • ImageId usa o valor do parâmetro de entrada LatestAmiId como a AMI a ser usada.

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

  • SecurityGroupIds obtém o ID do grupo de segurança com o nome lógico EC2SecurityGroup 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 entrada OperatorEmail como o endereço de e-mail do destinatário das notificações quando há atividades de escalabilidade.

Recurso AWS::AutoScaling::AutoScalingGroup WebServerGroup

  • MinSize e MaxSize 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ógico EC2TargetGroup. À 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 entrada VPCZoneIdentifier 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

  1. Faça login no AWS Management Console e abra o console AWS CloudFormation em https://console.aws.amazon.com/cloudformation.

  2. Escolha Create stack (Criar pilha), With new resources (Com novos recursos (padrão)).

  3. Em Specify template (Especificar modelo), selecione Upload a template file (Carregar um arquivo de modelo) e depois Choose file (Escolher arquivo).

  4. Escolha Next (Próximo).

  5. Na página Specify stack details (Especificar detalhes da pilha), digite um nome para a pilha (por exemplo, SampleLoadBalancedAppStack).

  6. 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.

  7. Escolha Next (Próximo) duas vezes.

  8. Na página Revisar, verifique e confirme as configurações.

  9. Selecione Submit (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 6: 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
  1. No console do AWS CloudFormation, selecione a pilha SampleLoadBalancedAppStack.

  2. Escolha Delete (Excluir).

  3. 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.