Conceitos básicos - AWS CloudFormation

Conceitos básicos

Com o modelo adequado, você pode implantar de uma só vez todos os recursos da AWS necessários para um aplicativo. Nesta seção, você irá examinar um modelo que declara os recursos para um blog WordPress, cria um blog WordPress como uma pilha, monitora o processo de criação da pilha, examina os recursos na pilha e, em seguida, exclui a pilha. Você usa o AWS Management Console para concluir essas tarefas.

Etapa 1: Selecionar um modelo

Primeiro, você precisa de um modelo que especifique os recursos que você deseja em sua pilha. Nesta etapa, você usa um modelo de exemplo que já está preparado. O modelo de exemplo cria um blog WordPress básico que usa uma única instância Amazon EC2 com um banco de dados MySQL local para storage. O modelo também cria um security group do Amazon EC2 para controlar as configurações de firewall para a instância do Amazon EC2.

Importante

O AWS CloudFormation é gratuito, mas os recursos da AWS que o CloudFormation cria são em ambiente de produção (e não em execução em uma sandbox). Você incorrerá nas taxas de uso padrão para esses recursos até que os encerre na última tarefa deste tutorial. O total de cobranças será mínimo. Para obter informações sobre como você pode minimizar qualquer cobrança, consulte http://aws.amazon.com/free/.

Para visualizar o modelo
  • Você pode visualizar o modelo do exemplo WordPress JSON ou YAML. Você não precisa fazer download porque usará o URL do modelo mais adiante neste guia. Para obter mais informações sobre os formatos de modelos, consulte Formatos de modelo do AWS CloudFormation.

Um modelo é um arquivo de texto JSON ou YAML que contém as informações da configuração dos recursos da AWS que você deseja criar na pilha. Para este passo a passo, o modelo de exemplo inclui seis seções de nível superior: AWSTemplateFormatVersion, Description, Parameters, Mappings, Resources, e Outputs. No entanto, somente a seção Resources é necessária.

A seção Resources contém as definições dos recursos da AWS que você deseja criar com o modelo. Cada recurso é listado separadamente e especifica as propriedades que são necessárias para a criação do recurso específico. A declaração de recurso a seguir é a configuração da instância EC2, que neste exemplo tem o nome lógico de WebServer:

exemplo JSON
"Resources" : { ... "WebServer": { "Type" : "AWS::EC2::Instance", "Properties": { "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "InstanceType" : { "Ref" : "InstanceType" }, "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], "KeyName" : { "Ref" : "KeyName" }, "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 WebServer ", " --configsets wordpress_install ", " --region ", { "Ref" : "AWS::Region" }, "\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref" : "AWS::StackName" }, " --resource WebServer ", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]}} }, ... }, ... "WebServerSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80 locked down to the load balancer + SSH access", "SecurityGroupIngress" : [ {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"}, {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : { "Ref" : "SSHLocation"}} ] } }, ... },
exemplo YAML
Resources: ... WebServer: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [AWSRegionArch2AMI, !Ref 'AWS::Region', !FindInMap [AWSInstanceType2Arch, !Ref InstanceType, Arch]] InstanceType: Ref: InstanceType KeyName: Ref: KeyName SecurityGroups: - Ref: WebServerSecurityGroup UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum update -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource WebServer --configsets wordpress_install --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackId} --resource WebServer --region ${AWS::Region} ... ... WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: "Enable HTTP access via port 80 locked down to the load balancer + SSH access" SecurityGroupIngress: - CidrIp: 0.0.0.0/0 FromPort: 80 IpProtocol: tcp ToPort: 80 - CidrIp: !Ref SSHLocation FromPort: 22 IpProtocol: tcp ToPort: 22 ...

Se tiver criado instâncias EC2 anteriormente, você poderá reconhecer propriedades, como ImageId, InstanceType e KeyName, que determinam a configuração da instância. As declarações de recursos são uma maneira eficiente de especificar todas essas definições da configuração de uma só vez. Quando você coloca declarações de recursos em um modelo, você pode criar e configurar todos os recursos declarados usando o modelo para criar uma pilha. Crie uma nova pilha que use o mesmo modelo para iniciar a mesma configuração dos recursos.

A declaração do recurso começa com uma sequência que especifica o nome lógico do recurso. Como você verá, o nome lógico pode ser usado para fazer referência a recursos no modelo.

Você usa a seção Parameters para declarar valores que podem ser passados para o modelo quando você cria a pilha. Um parâmetro é uma forma eficiente de especificar informações confidenciais, como nomes de usuário e senhas, que você não deseja armazenar no próprio modelo. Essa também é uma maneira de especificar informações que podem ser exclusivas ao aplicativo específico ou à configuração que você está implantando, por exemplo, um nome de domínio ou tipo de instância. Quando você criar a pilha do WordPress posteriormente nesta seção, você verá o conjunto de parâmetros declarados no modelo aparecer na página Especificar detalhes do assistente Criar pilha, onde você pode especificar os parâmetros antes de criar a pilha.

Os parâmetros a seguir são usados no modelo para especificar os valores que são usados em propriedades da instância EC2:

exemplo JSON
"Parameters" : { ... "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances", "Type": "AWS::EC2::KeyPair::KeyName", "ConstraintDescription" : "must be the name of an existing EC2 KeyPair." }, "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." }, ...
exemplo YAML
Parameters: ... KeyName: ConstraintDescription: must be the name of an existing EC2 KeyPair. Description: Name of an existing EC2 KeyPair to enable SSH access to the instances Type: AWS::EC2::KeyPair::KeyName InstanceType: 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. Default: t2.small Description: WebServer EC2 instance type Type: String ...

Na declaração de recurso WebServer, você vê a propriedade KeyName especificada com o parâmetro KeyName:

exemplo JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { "KeyName" : { "Ref" : "KeyName" }, ... } },
exemplo YAML
WebServer: Type: AWS::EC2::Instance Properties: KeyName: Ref: KeyName ...

As chaves contêm uma chamada para a função Ref com KeyName como sua entrada. A função Ref retorna o valor do objeto a que se refere. Nesse caso, a função Ref define a propriedade KeyName como o valor que foi especificado para KeyName quando a pilha foi criada.

A função Ref também pode definir uma propriedade do recurso como o valor de outro recurso. Por exemplo, a declaração de recurso WebServer contém a seguinte declaração de propriedade:

exemplo JSON
"WebServer" : { "Type": "AWS::EC2::Instance", "Properties": { ... "SecurityGroups" : [ {"Ref" : "WebServerSecurityGroup"} ], ... } },
exemplo YAML
WebServer: Type: AWS::EC2::Instance Properties: SecurityGroups: - Ref: WebServerSecurityGroup ...

A propriedade SecurityGroups usa uma lista de security groups do EC2. A função Ref tem uma entrada de WebServerSecurityGroup, que é o nome lógico de um security group no modelo e adiciona o nome de WebServerSecurityGroup à propriedade SecurityGroups.

No modelo, você também encontrará uma seção Mappings. Você usa mapeamentos para declarar valores condicionais que são avaliados de maneira semelhante a uma instrução de tabela de pesquisa. O modelo usa mapeamentos para selecionar a Imagem de máquina da Amazon (AMI) correta para a região e o tipo de arquitetura para o tipo de instância. As saídas definem valores personalizados que são retornados pelo comando aws cloudformation describe-stacks na guia Saídas do console do CloudFormation depois da criação da pilha. Você pode usar os valores de saída para retornar informações dos recursos na pilha, como o URL de um site que foi criado no modelo. Abordamos mapeamentos, saídas e outros tópicos sobre modelos em mais detalhes em Saiba mais sobre noções básicas de modelo.

Isso é o suficiente sobre modelos por enquanto. Vamos começar a criar uma pilha.

Etapa 2: Verificar se você preparou todos os itens necessários para a pilha

Antes de criar uma pilha a partir de um modelo, você deve garantir que todos os recursos dependentes de que o modelo precisa estejam disponíveis. Um modelo pode usar ou fazer referência aos recursos da AWS existentes e aos recursos declarados no próprio modelo. O CloudFormation cuida da verificação de referências a recursos no modelo e também verifica referências a recursos existentes para garantir que eles existam na região em que você está criando a pilha. Se seu modelo fizer referência a um recurso dependente que não existe, haverá falha na criação da pilha.

O modelo do exemplo WordPress contém um parâmetro de entrada, KeyName, que especifica o par de chaves usadas para a instância do Amazon EC2 que é declarada no modelo. O modelo depende do usuário que cria uma pilha a partir do modelo para fornecer um par de chaves válido do Amazon EC2 para o parâmetro KeyName. Se você fornecer um nome de par de chaves válido, a pilha será criada com êxito. Se você não fornecer um nome do par de chaves válido, a pilha será revertida.

Verifique se você tem um par de chaves do Amazon EC2 válido e registre o nome do par de chaves antes de criar a pilha.

Para ver seus pares de chaves, abra o console do Amazon EC2 e em seguida clique em Pares de chaves no painel de navegação.

nota

Se não tiver um par de chaves do Amazon EC2, você deverá o par de chaves na mesma região em que está criando a pilha. Para obter informações sobre como criar um par de chaves, consulte Obter um par de chaves SSH no Guia do usuário do Amazon EC2 para instâncias do Linux.

Agora que você tem um par de chaves, vamos usar o modelo do WordPress para criar uma pilha.

Etapa 3: Criar a pilha

Você criará a pilha com base no arquivo WordPress-1.0.0 discutido anteriormente. O modelo contém vários recursos da AWS, como uma instância EC2.

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

  2. Selecione Create Stack (Criar pilha).

  3. Na seção Specify template (Especificar modelo), selecione Amazon S3 Template URL (URL do modelo do Amazon S3) para digitar ou copiar e colar o URL do modelo de amostra do WordPress e, em seguida, clique em Next (Próximo):

    https://s3.us-west-2.amazonaws.com/cloudformation-templates-us-west-2/WordPress_Single_Instance.template

    nota

    Os modelos do AWS CloudFormation que estão armazenados em um bucket do S3 devem estar acessíveis ao usuário que está criando a pilha e devem estar localizados na mesma região da pilha que está sendo criada. Portanto, se o bucket do S3 estiver localizado na região us-east-2, a pilha também deverá ser criada em us-east-2.

  4. Na seção Specify stack details (Especificar detalhes da tarefa), insira o nome de uma pilha no campo Stack name (Nome da pilha). Neste exemplo, use MyWPTestStack. O nome da pilha não pode conter espaços.

  5. Na seção Parameters (Parâmetros ), é necessário fornecer valores para todos os parâmetros que não tenham valores padrão, entre eles DBUser, DBPassword, DBRootPassword e KeyName. No campo KeyName, insira o nome de um par válido do Amazon EC2 na mesma região em que você está criando a pilha.

  6. Escolha Próximo.

  7. Neste cenário, não vamos adicionar tags. Escolha Próximo. As tags, que são pares de chave/valor, podem ajudar você a identificar suas pilhas. Para mais informações, consulte Adicionar tags à pilha do CloudFormation.

  8. Revise as informações da pilha. Quando estiver satisfeito com as configurações, clique em Submit (Enviar).

Sua pilha pode demorar vários minutos para ser criada, mas você provavelmente não vai querer ficar sentado esperando. Se você for como nós, você desejará saber como está o andamento da criação da pilha.

Etapa 4: Monitorar o andamento da criação da pilha

Depois de concluir o Assistente de criação de pilha, o CloudFormation começa a criar os recursos que são especificados no modelo. Sua nova pilha, MyWPTestStack, aparecerá na lista na parte superior do console do CloudFormation. O status deve ser CREATE_IN_PROGRESS. Você pode ver o status detalhado de uma pilha visualizando seus eventos.

Para visualizar os eventos da pilha
  1. No console do CloudFormation, selecione a pilha MyWPTestStack na lista.

  2. No painel de detalhes da pilha, clique na guia Eventos.

    O console atualiza automaticamente a lista de eventos com os eventos mais recentes a cada 60 segundos.

A guia Events (Eventos) exibe cada etapa principal da criação da pilha classificada pelo tempo de cada evento, com os eventos mais recentes na parte superior.

O primeiro evento (na parte inferior da lista de eventos) é o início do processo de criação da pilha:

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::CloudFormation::Stack MyWPTestStack User initiated

Em seguida, estão os eventos que marcam o início e a conclusão da criação de cada recurso. Por exemplo, a criação da instância EC2 resulta nas seguintes entradas:

2013-04-24 18:59 UTC-7 CREATE_COMPLETE AWS::EC2::Instance...

2013-04-24 18:54 UTC-7 CREATE_IN_PROGRESS AWS::EC2::Instance...

O evento CREATE_IN_PROGRESS é registrado quando o CloudFormation relata que começou a criar o recurso. O evento CREATE_COMPLETE é registrado em log quando o recurso é criado com êxito.

Quando o CloudFormation tiver criado a pilha com êxito, você verá o seguinte evento na parte superior da guia Eventos:

2013-04-24 19:17 UTC-7 CREATE_COMPLETE AWS::CloudFormation::Stack MyWPTestStack

Se não puder criar um recurso, o CloudFormation relatará um evento CREATE_FAILED e, por padrão, reverterá a pilha e excluirá todos os recursos que foram criados. A coluna Status Reason (Motivo do status) exibe o problema que provocou a falha.

Etapa 5: Usar os recursos da pilha

Quando a pilha MyWPTestStack tiver um status CREATE_COMPLETE, o CloudFormation terá concluído a criação da pilha, e você poderá começar a usar os recursos dela.

O exemplo da pilha WordPress cria um site WordPress. Você pode continuar com a configuração do WordPress executando o script de instalação do WordPress.

Para concluir a instalação do WordPress
  1. Na guia Saídas, na linha WebsiteURL, escolha o link na coluna Valor.

    O valor da saída de WebsiteURL é o URL do script de instalação do site WordPress que você criou com a pilha.

  2. Na página da web da instalação do WordPress, siga as instruções da tela para concluir a instalação do WordPress. Para obter mais informações sobre como instalar o WordPress, consulte https://wordpress.org/support/article/how-to-install-wordpress/.

    Depois de concluir a instalação e fazer login, você é direcionado para o painel no qual você pode definir opções adicionais para seu blog WordPress. Em seguida, você poderá começar a escrever posts no blog que você criou com êxito usando um modelo do CloudFormation.

Etapa 6: limpar

Você concluiu as tarefas de conceitos básicos do CloudFormation. Para ter certeza de que você não será cobrado por qualquer serviço não desejado, poderá fazer uma limpeza excluindo a pilha e os recursos dela.

Para excluir a pilha e seus recursos
  1. No console do CloudFormation, selecione a pilha MyWPTestStack.

  2. Escolha Delete Stack.

  3. Na mensagem de confirmação exibida, escolha Yes, Delete (Sim, excluir).

O status de MyWPTestStack é alterado para DELETE_IN_PROGRESS. Da mesma forma que você monitorou a criação da pilha, você pode monitorar sua exclusão usando a guia Evento. Quando o CloudFormation conclui a exclusão da pilha, ela é removida da lista.

Parabéns! Você selecionou um modelo com êxito, criou uma pilha, visualizou e usou seus recursos e excluiu a pilha e seus recursos. Além disso, você pôde configurar um blog do WordPress usando um modelo do CloudFormation. Você pode encontrar outros modelos na Biblioteca de modelos de exemplo do AWS CloudFormation.

Agora está na hora de aprender mais sobre modelos para que você possa modificar modelos existentes ou criar seus próprios modelos: Saiba mais sobre noções básicas de modelo.