Implantar aplicações no Amazon EC2
É possível usar o CloudFormation para instalar, configurar e iniciar aplicações automaticamente em instâncias do Amazon EC2. Isso permite que você duplique implantações e atualize instalações existentes facilmente sem se conectar diretamente à instância, o que pode economizar muito tempo e esforço.
O CloudFormation inclui um conjunto de scripts auxiliares (cfn-init
, cfn-signal
, cfn-get-metadata
e cfn-hup
) baseados em cloud-init
. Você chama esses scripts auxiliares de seus modelos do CloudFormation para instalar, configurar e atualizar os aplicativos em instâncias do Amazon EC2 que estão no mesmo modelo. Para obter mais informações, consulte Referência de scripts auxiliares do CloudFormation no Guia de referência de modelos do AWS CloudFormation.
No tutorial de conceitos básicos, você criou um servidor Web simples usando UserData
com um script bash básico. Embora isso tenha funcionado para uma página simples “Hello World”, as aplicações reais geralmente precisam de uma configuração mais sofisticada, incluindo:
-
Vários pacotes de software instalados na ordem correta.
-
Arquivos de configuração complexos criados com conteúdo específico.
-
Serviços iniciados e configurados para serem executados automaticamente.
-
Tratamento de erros e validação do processo de configuração.
Os scripts auxiliares do CloudFormation fornecem uma maneira mais robusta e sustentável de configurar instâncias do EC2 em comparação com os scripts bash básicos em UserData
. O script auxiliar cfn-init
lê os dados de configuração dos metadados do seu modelo e os aplica sistematicamente à sua instância.
Neste tutorial, você vai aprender como usar o script auxiliar cfn-init
e como monitorar o processo de bootstrap.
nota
O CloudFormation é gratuito, mas os recursos do Amazon EC2 que você criar serão cobrados. Porém, se você for novo na AWS, poderá aproveitar o nível gratuito
Tópicos
Pré-requisitos
-
Você deve ter concluído o tutorial Criar sua primeira pilha ou ter uma experiência equivalente com os conceitos básicos do CloudFormation.
-
Você deve ter acesso a uma Conta da AWS com um usuário ou perfil do IAM que tenha permissões para usar o Amazon EC2 e o CloudFormation ou ter acesso de usuário administrativo.
-
Você deve ter uma nuvem privada virtual (VPC) que tenha acesso à internet. Este modelo de tutorial requer uma VPC padrão, que vem automaticamente com as Contas da AWS mais recentes. Se você não tiver uma VPC padrão, ou se ela tiver sido excluída, consulte a seção de solução de problemas no tutorial Criar sua primeira pilha para obter soluções alternativas.
Como entender os conceitos de bootstrap
Vamos entender os principais conceitos que fazem o bootstrapping funcionar antes de criar o modelo.
O script de ajuda cfn-init
O CloudFormation fornece os scripts auxiliares do Python que podem ser usados para instalar software e iniciar serviços em uma instância do Amazon EC2. O script cfn-init
lê os metadados dos recursos do seu modelo e aplica a configuração à sua instância.
O processo funciona da seguinte maneira:
-
Você define a configuração na seção
Metadata
do seu recurso do EC2. -
Você chama
cfn-init
no scriptUserData
. -
O script
cfn-init
lê os metadados e aplica a configuração. -
A instância é configurada de acordo com suas especificações.
Estrutura de metadados
A configuração é definida em uma estrutura específica dentro da instância do EC2.
Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: # Metadata section for the resource AWS::CloudFormation::Init: # Required key that cfn-init looks for config: # Configuration name (you can have multiple) packages: # Install packages files: # Create files commands: # Run commands services: # Start/stop services
O script cfn-init
processa essas seções na seguinte ordem: pacotes, grupos, usuários, origens, arquivos, comandos e serviços.
Começar com um exemplo simples de bootstrap
Vamos começar com um exemplo mínimo de bootstrap que apenas instala e inicia o Apache.
Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: # Install Apache web server yum: httpd: [] services: # Start Apache and enable it to start on boot sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType UserData: !Base64 # Script that runs when instance starts Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
Este exemplo simples demonstra os principais conceitos:
-
A seção
packages
instala o pacotehttpd
usando yum. Isso funciona no Amazon Linux e em outras distribuições Linux que usamyum. -
A seção
services
garante que ohttpd
inicie e seja executado automaticamente. -
O
UserData
instala as ferramentas de bootstrap mais recentes e chama ocfn-init
.
Como adicionar arquivos e comandos
Agora, vamos aprimorar nosso exemplo adicionando uma página da Web personalizada e um arquivo de log no diretório /var/log
na instância do EC2.
Criar arquivos
A seção files
permite que você crie arquivos na instância com conteúdo específico. A barra vertical (|
) permite que você passe um bloco literal de texto (código HTML) como conteúdo do arquivo (/var/www/html/index.html
).
files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body>
Executar comandos
A seção commands
permite que você execute comandos shell durante o processo de bootstrap. Esse comando cria um arquivo de log em /var/log/welcome.txt
na instância do EC2. Para visualizá-lo, você precisa de um par de chaves do Amazon EC2 para usar no acesso por SSH e um intervalo de endereços IP que possa ser usado para o SSH na instância (não abordados aqui).
commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
Como adicionar segurança
Como estamos configurando um servidor Web, precisamos permitir que o tráfego da Web (HTTP) chegue à nossa instância do EC2. Para isso, criaremos um grupo de segurança que permita tráfego de entrada na porta 80 do seu endereço IP. As instâncias do EC2 também precisam enviar tráfego para a internet, por exemplo, para instalar atualizações de pacotes. Por padrão, os grupos de segurança permitem todo o tráfego de saída. Vamos então associar esse grupo de segurança à nossa instância do EC2 usando a propriedade SecurityGroupIds
.
WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP
O modelo completo de bootstrap
Agora, vamos juntar todas as peças. Confira o modelo completo que combina todos os conceitos que discutimos.
AWSTemplateFormatVersion: 2010-09-09 Description: Bootstrap an EC2 instance with Apache web server using cfn-init Parameters: 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' InstanceType: Description: EC2 instance type Type: String Default: t2.micro AllowedValues: - t3.micro - t2.micro ConstraintDescription: must be a valid EC2 instance type. MyIP: Description: Your IP address in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP WebServer: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body> commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt" services: sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: !Base64 Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region} Tags: - Key: Name Value: Bootstrap Tutorial Web Server Outputs: WebsiteURL: Value: !Sub 'http://${WebServer.PublicDnsName}' Description: EC2 instance public DNS name
Criar uma pilha usando o console
O procedimento a seguir envolve o upload do modelo de pilha de amostra a partir de um arquivo. Abra um editor de texto na sua máquina local e adicione o modelo. Salve o arquivo com o nome samplelinux2stack.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
samplelinux2stack.template
. -
Escolha Próximo.
-
Na página Especificar detalhes da pilha, digite
BootstrapTutorialStack
como o nome da pilha. -
Em Parâmetros, faça o seguinte:
-
LatestAmiId: deixe o valor padrão.
-
InstanceType: escolha t2.micro ou t3.micro como o tipo de instância do EC2.
-
MyIP: insira seu endereço IP público com um sufixo
/32
.
-
-
Escolha Avançar duas vezes e, em seguida, Enviar para criar a pilha.
Monitorar o processo de bootstrap
Os processos de bootstrap demoram mais do que simples execuções do EC2 porque software adicional está sendo instalado e configurado.
Para monitorar o progresso do bootstrap
-
No console do CloudFormation, selecione sua pilha e abra a guia Eventos.
-
Fique atento ao evento
WebServer CREATE_IN_PROGRESS
. O processo de bootstrap começa após a inicialização da instância. -
Normalmente, o processo de bootstrap leva alguns minutos. Você verá
WebServer CREATE_COMPLETE
quando tiver terminado.
Caso queira ver o que está acontecendo durante o processo de bootstrap, você pode verificar os logs da instância.
Para visualizar os logs de bootstrap (opcional)
-
Abra o console do EC2
e encontre sua instância. -
Selecione a instância e escolha Ações, Monitorar e solucionar problemas e Obter log do sistema para ver o progresso do bootstrap.
-
Se você não visualizar os logs de imediato, aguarde e atualize a página.
Testar o servidor Web bootstrapped
Quando sua pilha mostrar CREATE_COMPLETE
, teste seu servidor Web.
Para testar o servidor Web
-
No console do CloudFormation, acesse a guia Saídas da sua pilha.
-
Clique no valor WebsiteURL para abrir o servidor Web em uma nova guia.
-
Você verá sua página da Web personalizada com a mensagem
Congratulations, you have successfully launched the AWS CloudFormation sample
.
nota
Se a página não for carregada de imediato, aguarde um minuto e tente novamente. O processo de bootstrap ainda pode estar sendo concluído mesmo após a pilha mostrar CREATE_COMPLETE
.
Solucionar problemas de bootstrap
Se o processo de bootstrap falhar ou se o servidor Web não estiver funcionando, confira abaixo os problemas e soluções comuns.
Problemas comuns
-
Falha na criação da pilha: verifique a guia Eventos para ver mensagens de erro específicas.
-
Servidor Web não acessível: verifique se o endereço IP está correto no parâmetro
MyIP
. Lembre-se de incluir/32
no final. -
Falha no processo de bootstrap: a instância pode ser inicializada, mas o
cfn-init
falha. Verifique os logs do sistema conforme descrito na seção de monitoramento.
Limpar recursos
Para evitar cobranças contínuas, você pode fazer a limpeza excluindo a pilha e seus recursos.
Para excluir a pilha e seus recursos
-
Abra o console do CloudFormation
. -
Na página Pilhas, selecione a opção ao lado do nome da pilha que você criou (
BootstrapTutorialStack
) e escolha Excluir. -
Quando a confirmação for solicitada, escolha Excluir.
-
Monitore o andamento do processo de exclusão da pilha na guia Evento. O status de
BootstrapTutorialStack
é alterado paraDELETE_IN_PROGRESS
. Quando o CloudFormation conclui a exclusão da pilha, ela é removida da lista.
Próximas etapas
Parabéns! Você aprendeu com êxito como fazer bootstrap de instâncias do EC2 com o CloudFormation. Agora você já sabe:
-
Como usar scripts
cfn-init
auxiliares -
Como estruturar metadados para bootstrapping
-
Como instalar pacotes, criar arquivos, executar comandos e gerenciar serviços
-
Como monitorar problemas de bootstrap
Para continuar aprendendo:
-
Aprenda a fazer bootstrap de uma pilha do Windows. Para obter mais informações, consulte Fazer o bootstrap de pilhas do CloudFormation baseadas em Windows.
-
Conheça cenários de bootstrap mais complexos com vários conjuntos de configurações. Para obter mais informações, consulte cfn-init e AWS::CloudFormation::Init no Guia de referência de modelos do AWS CloudFormation.
-
Saiba mais sobre o script
cfn-signal
para relatar o status de conclusão do bootstrap. Para obter mais informações, consulte cfn-signal no Guia de referência de modelos do AWS CloudFormation.