Demonstração: use o AWS CloudFormation Designer para modificar o modelo de uma pilha - AWS CloudFormation

Demonstração: use o AWS CloudFormation Designer para modificar o modelo de uma pilha

Você pode usar o AWS CloudFormation Designer para modificar facilmente o modelo de uma pilha e, em seguida, enviá-lo para o AWS CloudFormation para atualizar a pilha. Normalmente, ao modificar uma pilha, você precisa obter uma cópia do modelo dela, modificar esse modelo em um editor de texto e, em seguida, usar o CloudFormation para atualizar a pilha. Com o AWS CloudFormation Designer, você pode obter rapidamente uma cópia de qualquer modelo de pilha em execução, modificá-lo e, em seguida, atualizar a pilha sem sair do console.

Nesta demonstração, vamos começar com uma pilha de servidor web básico e, depois, vamos modificá-la para que o servidor web seja escalável e durável.

Ao final da apresentação, você terá um modelo semelhante ao exemplo a seguir: https://console.aws.amazon.com/cloudformation/designer/home?templateUrl=https://s3.amazonaws.com/cloudformation-examples/sample-as-vpc.template&region=us-east-1.

Nesta demonstração, concluiremos as seguintes etapas:

  1. Obtenha o modelo de uma pilha.

    Vamos obter uma cópia do modelo de uma pilha em execução, a mesma pilha de servidor web básico na seguinte apresentação: Demonstração: Usar o AWS CloudFormation Designer para criar um servidor web básico.

  2. Modifique o modelo.

    Usaremos o AWS CloudFormation Designer para modificar o modelo de pilha de modo que o site fique escalável e durável, substituindo a instância do EC2 por um grupo do Auto Scaling e um load balancer do Elastic Load Balancing.

  3. Atualize a pilha.

    Após salvar as modificações, vamos atualizar a pilha do servidor web básico com o modelo modificado.

    nota

    O CloudFormation é um serviço gratuito; no entanto, você será cobrado pelos recursos da AWS que você incluir nas pilhas na taxa atual para cada um deles. Para obter mais informações sobre a definição de preço da AWS, consulte a página de detalhes de cada produto em http://aws.amazon.com.

  4. Exclua a pilha.

    Excluiremos a pilha para limpar todos os recursos.

Pré-requisitos

Esta apresentação pressupõe que você tenha um conhecimento prático da Amazon Virtual Private Cloud (Amazon VPC), Auto Scaling, Elastic Load Balancing e do CloudFormation. Para contexto, cada procedimento fornece algumas informações básicas sobre cada recurso.

Além disso, a descrição pressupõe que você concluiu a seguinte apresentação: Demonstração: Usar o AWS CloudFormation Designer para criar um servidor web básico. A partir dessa apresentação, você deve ter uma pilha em execução chamada BasicWebServerStack.

Etapa 1: Obter um modelo de pilha

Nesta etapa, usaremos o AWS CloudFormation Designer para obter e abrir uma cópia do modelo de uma pilha em execução.

Para obter uma cópia de um modelo de pilha em execução

  1. Abra o console do CloudFormation em https://console.aws.amazon.com/cloudformation/.

  2. Na lista de pilhas, selecione a BasicWebServerStack.

  3. Escolha Ações e, em seguida, Exibir/editar modelo no Designer.

O CloudFormation obtém uma cópia do modelo da pilha BasicWebServerStack e a exibe no AWS CloudFormation Designer, onde você pode visualizar os recursos do modelo e os relacionamentos entre eles. Na próxima etapa, usaremos o AWS CloudFormation Designer para modificar o modelo.

Etapa 2: Modificar um modelo

Vamos modificar o modelo de servidor web básico usando a interface de arrastar e soltar do AWS CloudFormation Designer e o editor de JSON e YAML integrado para substituir a única instância do Amazon EC2 por um grupo do Auto Scaling e um load balancer para tornar o site escalável. Se o tráfego para o site aumentar repentinamente, use o Auto Scaling para aumentar rapidamente o número de servidores web. O load balancer distribuirá o tráfego igualmente entre as instâncias.

Para modificar o modelo de uma pilha

  1. Remova o recurso WebServerInstance.

    1. Clique com o botão direito do mouse no recurso WebServerInstance.

    2. No menu de recursos, escolha Excluir ( ).

    3. Escolha OK para confirmar.

  2. No painel Tipos de recurso, adicione o seguinte ao recurso PublicSubnet: AutoScalingGroup, LaunchConfiguration e LoadBalancer. Antes de adicionar recursos, pode ser necessário expandir a sub-rede para incluir todos os recursos.

    Os recursos são organizados por categorias de recursos. O grupo do Auto Scaling e a configuração de execução estão na categoria AutoScaling e o load balancer está na categoria ElasticLoadBalancing.

    nota

    Esses recursos não seguem o modelo de contêiner, por isso o AWS CloudFormation Designer não os associa automaticamente à sub-rede. Vamos criar conexões mais tarde nesta etapa.

  3. No painel Tipos de recurso da categoria EC2, adicione o recurso SecurityGroup em qualquer lugar do VPC, exceto na sub-rede.

    Esse security group controlará o tráfego de entrada e saída do load balancer.

  4. Renomeie os recursos para facilitar a identificação deles:

    • Renomeie AutoScalingGroup como WebServerFleet

    • Renomeie LaunchConfiguration como WebServerLaunchConfig

    • Renomeie LoadBalancer como PublicElasticLoadBalancer

    • Renomeie SecurityGroup como PublicLoadBalancerSecurityGroup

  5. Crie associações para os recursos que você adicionou.

    1. Associe o load balancer e os recursos do grupo do Auto Scaling à sub-rede pública:

      • No recurso PublicElasticLoadBalancer, arraste a conexão AWS::EC2::Subnet (Property: Subnets) para o recurso PublicSubnet.

      • No recurso WebServerFleet, arraste a conexão AWS::EC2::Subnet (Property: VPCZoneIdentifier) para o recurso PublicSubnet.

    2. Associe o load balancer ao respectivo security group:

      • No recurso PublicElasticLoadBalancer, arraste a conexão AWS::EC2::SecurityGroup (Property: SecurityGroups) para o recurso PublicLoadBalancerSecurityGroup.

    3. Associe o grupo do Auto Scaling ao load balancer e à configuração de execução:

      • No recurso WebServerFleet, arraste a conexão AWS::ElasticLoadBalancing::LoadBalancer (Property: LoadBalancerNames) para o recurso PublicElasticLoadBalancer.

      • No recurso WebServerFleet, arraste a conexão AWS::ElasticLoadBalancing::LaunchConfiguration (Property: LaunchConfigurationName) para o recurso WebServerLaunchConfig.

    4. Associe a configuração de execução ao security group:

      • No recurso WebServerLaunchConfig, arraste a conexão AWS::EC2::SecurityGroup (Property: SecurityGroups) para o recurso WebServerSecurityGroup.

    5. Defina uma dependência do grupo do Auto Scaling para a rota pública:

      • No recurso WebServerFleet, arraste a conexão DependsOn para o recurso PublicRoute.

      Essa dependência significa que o CloudFormation não criará o recurso WebServerFleet até que a rota pública esteja concluída. Caso contrário, se a rota pública não estiver disponível quando as instâncias de servidor web estiverem inicializando, elas não poderão enviar sinais (usando o script auxiliar cfn-signal) para notificar o CloudFormation quando as implantações de configurações aplicativos estiverem concluídas.

  6. Especifique as propriedades dos recursos que você adicionou.

    1. Na tela do AWS CloudFormation Designer, escolha o recurso PublicElasticLoadBalancer.

    2. No painel do editor integrado, selecione a guia Propriedades e, em seguida, copie o snippet a seguir e cole-o entre as chaves Propriedades ({}).

      O AWS CloudFormation Designer adicionou automaticamente a associação de grupo de segurança e sub-rede, assim você precisa adicionar apenas as propriedades Listeners e HealthCheck. A propriedade Listeners especifica onde e que tipo de tráfego escutar, e a propriedade HealthCheck descreve as configurações para determinar o estado de integridade do load balancer.

      JSON

      "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ], "HealthCheck": { "Target": "HTTP:80/", "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "90", "Timeout": "60" }, "SecurityGroups": [ { "Ref": "PublicLoadBalancerSecurityGroup" } ], "Subnets": [ { "Ref": "PublicSubnet" } ]

      YAML

      Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP HealthCheck: Target: 'HTTP:80/' HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '90' Timeout: '60' SecurityGroups: - !Ref PublicLoadBalancerSecurityGroup Subnets: - !Ref PublicSubnet
    3. Repita este processo para os recursos a seguir:

      WebServerFleet

      Adicione as propriedades MaxSize, MinSize e DesiredCapacity. Essas propriedades especificam o número máximo e mínimo de instâncias que você pode executar no grupo do Auto Scaling e o número inicial de instâncias. O valor de capacidade desejado refere-se a um novo parâmetro, que adicionaremos posteriormente neste procedimento.

      JSON

      "MinSize": "1", "MaxSize": "10", "DesiredCapacity": { "Ref": "WebServerCount" }, "VPCZoneIdentifier": [ { "Ref": "PublicSubnet" } ], "LaunchConfigurationName": { "Ref": "WebServerLaunchConfig" }, "LoadBalancerNames": [ { "Ref": "PublicElasticLoadBalancer" } ]

      YAML

      MinSize: '1' MaxSize: '10' DesiredCapacity: !Ref WebServerCount VPCZoneIdentifier: - !Ref PublicSubnet LaunchConfigurationName: !Ref WebServerLaunchConfig LoadBalancerNames: - !Ref PublicElasticLoadBalancer
      PublicLoadBalancerSecurityGroup

      Adicione as regras de entrada e de saída a seguir, que determinam o tráfego que pode alcançar e deixar o load balancer. As regras permitem que todo o tráfego HTTP alcance e deixe o load balancer.

      JSON

      "GroupDescription": "Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "SecurityGroupEgress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "VpcId": { "Ref": "VPC" }

      YAML

      GroupDescription: >- Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 SecurityGroupEgress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 VpcId: !Ref VPC
      WebServerSecurityGroup

      Modifique a regra de entrada HTTP para permitir apenas o tráfego do load balancer.

      JSON

      "GroupDescription": "Allow access from load balancer and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "SourceSecurityGroupId": { "Ref": "PublicLoadBalancerSecurityGroup" } }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } } ], "VpcId": { "Ref": "VPC" }

      YAML

      VpcId: !Ref VPC GroupDescription: Allow access from load balancer and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 SourceSecurityGroupId: !Ref PublicLoadBalancerSecurityGroup - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
      WebServerLaunchConfig

      A configuração de execução tem várias propriedades diferentes que você precisa especificar, portanto, vamos destacar apenas algumas delas. As propriedades InstanceType e ImageId usam valores de parâmetro e mapeamento que já foram especificados no modelo. Você especifica o tipo de instância como um valor de parâmetro ao criar uma pilha. O valor ImageId é um mapeamento baseado na região da sua pilha e no tipo de instância que você especificou.

      Na propriedade UserData, especificamos os scripts de configuração que são executados depois que a instância está ativa e em execução. As informações de configuração são definidas nos metadados da instância, que adicionaremos na próxima etapa.

      JSON

      "InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "AssociatePublicIpAddress": "true", "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerLaunchConfig ", " --configsets All ", " --region ", { "Ref": "AWS::Region" }, "\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerFleet ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }, "SecurityGroups": [ { "Ref": "WebServerSecurityGroup" } ]

      YAML

      InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName AssociatePublicIpAddress: 'true' UserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - | yum install -y aws-cfn-bootstrap - | # Install the files and packages from the metadata - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerLaunchConfig ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerFleet ' - ' --region ' - !Ref 'AWS::Region' - |+ SecurityGroups: - !Ref WebServerSecurityGroup
  7. Adicione os metadados da configuração de execução ao recurso WebServerLaunchConfig, que instrui o script auxiliar cfn-init a iniciar o servidor web e criar uma página web básica.

    1. Escolha o recurso WebServerLaunchConfig e depois a guia Metadata (Metadados) no editor integrado.

    2. Se você estiver criando seu modelo em JSON: nas chaves Metadata ({}), depois da chave de fechamento AWS::CloudFormation::Designer, adicione uma vírgula (,).

    3. Após a propriedade AWS::CloudFormation::Designer, adicione o snippet a seguir, que instrui o script auxiliar cfn-init a iniciar o servidor web e criar uma página web básica.

      JSON

      "AWS::CloudFormation::Init" : { "configSets" : { "All" : [ "ConfigureSampleApp" ] }, "ConfigureSampleApp" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } }

      YAML

      'AWS::CloudFormation::Init': configSets: All: - ConfigureSampleApp ConfigureSampleApp: packages: yum: httpd: [] files: /var/www/html/index.html: content: !Join - |+ - - >- <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true'
  8. Adicione o parâmetro WebServerCount. Esse parâmetro especifica quantas instâncias serão criadas quando o CloudFormation criar o grupo do Auto Scaling.

    1. Selecione uma área aberta na tela do AWS CloudFormation Designer.

    2. No painel do editor integrado, escolha a guia Parâmetros.

    3. Adicione o parâmetro a seguir no editor integrado. Se você está criando o modelo em JSON, adicione uma vírgula conforme necessário.

      JSON

      "WebServerCount": { "Description": "Number of Amazon EC2 instances to launch for the WebServer server", "Type": "Number", "Default": "1" }

      YAML

      WebServerCount: Description: Number of Amazon EC2 instances to launch for the WebServer server Type: Number Default: '1'
  9. Modifique a saída do modelo para mostrar o nome DNS do load balancer.

    1. No painel do editor integrado, escolha a guia Saídas.

    2. Modifique o JSON para usar o nome DNS do load balancer, como mostrado no snippet a seguir.

      JSON

      { "Outputs": { "URL": { "Value": { "Fn::GetAtt": [ "PublicElasticLoadBalancer", "DNSName" ] }, "Description": "Newly created application URL" } } }

      Se você está criando seu modelo em YAML, use o snippet a seguir.

      Outputs: URL: Value: !GetAtt - PublicElasticLoadBalancer - DNSName Description: Newly created application URL
  10. Na barra de ferramentas do AWS CloudFormation Designer, escolha Validate template (Validar modelo) ( ) para verificar erros de sintaxe no seu modelo.

    Visualize e corrija os erros no painel Mensagens e, em seguida, valide o modelo novamente. Se você não visualizar erros, seu modelo é sintaticamente válido.

  11. Na barra de ferramentas do AWS CloudFormation Designer, salve o modelo localmente selecionando Arquivo ( ) e depois Salvar.

Agora você tem um modelo do CloudFormation modificado, que pode usar para atualizar a pilha de servidor Web básico. Na próxima etapa, usaremos esse modelo para atualizar a pilha de servidor web básico.

Etapa 3: Atualizar a pilha

Para implementar as alterações no modelo, precisamos atualizar a pilha de servidor web básico. Você pode iniciar o assistente de atualização de pilha do CloudFormation diretamente do AWS CloudFormation Designer.

Para atualizar a pilha

  1. Na barra de ferramentas do AWS CloudFormation Designer, selecione Create Stack (Criar pilha) ( ).

    O AWS CloudFormation Designer salva o modelo aberto em um bucket do S3 e, em seguida, inicia o assistente de criação de pilha do CloudFormation. Como modificamos o modelo da pilha BasicWebServerStack, o CloudFormation inicia o assistente de atualização de pilha para ela.

  2. O CloudFormation preenche automaticamente o URL do modelo; escolha Next.

  3. Na seção Pilha, no campo Nome, verifique se o nome da pilha é BasicWebServerStack.

  4. Na seção Parâmetros, use os valores existentes e, em seguida, escolha Próximo.

  5. Para esta demonstração, você não precisa adicionar tags ou especificar configurações avançadas, portanto escolha Próximo.

  6. Certifique-se de que o nome da pilha está correto e, em seguida, selecione Atualizar.

Pode levar vários minutos para que o CloudFormation atualize a pilha. Para monitorar o progresso, exiba os eventos da pilha. Para obter mais informações, consulte Visualizar dados e recursos da pilha do AWS CloudFormation no AWS Management Console. Após a atualização da pilha, visualize as saídas da pilha e acesse o URL do site para verificar se o site está em execução. Para obter mais informações, consulte Visualizar dados e recursos da pilha do AWS CloudFormation no AWS Management Console. Você atualizou com êxito um modelo e uma pilha usando o AWS CloudFormation Designer.

Para garantir que não será cobrado por serviços indesejados, você pode excluir esta pilha.

Etapa 4: Limpar os recursos

Para garantir que você não será cobrado por serviços indesejados, exclua a pilha e os respectivos recursos.

Para excluir a pilha

  1. No console do CloudFormation, escolha a pilha BasicWebServerStack2.

  2. Escolha Delete Stack.

  3. Na mensagem de confirmação, escolha Sim, excluir.

Pode levar vários minutos para que o CloudFormation exclua a pilha. Para monitorar o progresso, exiba os eventos da pilha. Depois que a pilha for excluída, todos os recursos que você criou serão excluídos. Agora que você entende como usar o AWS CloudFormation Designer, pode usá-lo para criar e modificar seus próprios modelos.