Criação de EC2 utilizando Cloudformation

O AWS CloudFormation é um serviço de infraestrutura como código (IaC) que permite modelar, provisionar e gerenciar recursos da AWS.

Apesar de hoje possuímos diversas ferramentas disponíveis para utilização de infraestrutura como código, como o Terraform, a AWS também possui a sua ferramenta nativa para atingir tais objetivos.

Tecnicamente CloudFormation é a forma oficial de definir infraestrutura como código na nuvem da AWS, portanto, é uma peça fundamental para possibilitar processos de entrega contínua e DevOps.

Diferente do Terraform, com o CloudFormation temos duas formas de realizar a declaração de infraestrutura, podemos utilizar tanto o Json como o Yaml, fica a critério de cada um porém acredito que o Yaml fica melhor para visualização e compreensão das definições.

AS SEÇÕES DO TEMPLATE

A estrutura completa de um template pode se tornar complexa, mas as mais importantes só as seções:

  • AWSTemplateFormatVersion: Declara a versão do template.
  • Description: Breve descrição do template, que pode ajudar a compreender quando existe uma grande quantidade de stacks.
  • Resources: Onde todos os recursos que devem ser provisionados são declarados
  • Outputs: Permite a visualização rápida de atributos de recursos criados utilizando a linha de comando e o console da aws. Quando é utilizado o parâmetro export ainda permite que outros stacks façam referência a esses atributos, permitindo um compartilhar informações entre diferentes stacks.

PRIMEIRO TEMPLATE

Sabendo das necessidades que um template do CloudFormation tem, criaremos um template que irá criar uma EC2, um Security Group e atachar um Elastic IP.

Sabendo que os recursos são declarados dentro da sessão Resources, vamos então iniciar pela definição da nossa EC2. Precisamos declarar algumas informações como ImageId, InstanceType, SecurityGroups e para isso vamos adicionar dentro da sessão resources a seguinte definição:

  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-1a
      ImageId: ami-03ededff12e34e59e
      InstanceType: t2.micro
      KeyName: Thiago
      SecurityGroups:
        - !Ref SSHSecurityGroup
      Tags: 
        - Key: Environment
          Value: Test
        - Key: Name
          Value: CloudFormation-Ec2

Com a nossa instância declarada, vamos então atribuir um Elastic IP, assim mantemos um IP público fixo para a nossa EC2, para isso basta adicionar o seguinte bloco:

  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyInstance

Dessa forma, falta apenas que criarmos um Security Group liberando a comunicação para SSH, iremos liberar para toda a internet, mas apenas por que isso e um lab, em ambiente real, filtre quem pode acessar suas instâncias.

  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
      - CidrIp: 0.0.0.0/0
        FromPort: 22
        IpProtocol: tcp
        ToPort: 22

Bom, dessa forma devemos ter um template semelhante ao abaixo:

---
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-1a
      ImageId: ami-03ededff12e34e59e
      InstanceType: t2.micro
      KeyName: Thiago
      SecurityGroups:
        - !Ref SSHSecurityGroup
      Tags: 
        - Key: Environment
          Value: Test
        - Key: Name
          Value: CloudFormation-Ec2

  # an elastic IP for our instance
  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyInstance

  # our EC2 security group
  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
      - CidrIp: 0.0.0.0/0
        FromPort: 22
        IpProtocol: tcp
        ToPort: 22

CRIAR UMA STACK

Basta buscar na barra de pesquisa do console pelo serviço CloudFormation, caso não tenha nenhuma stack, será retornado uma tela semelhante a abaixo, clique em Create Stack:

cf 01

Basta clicar na opção Template Ready e em seguida Upload a template file, la você deve enviar o arquivo yaml que criamos durante esse artigo:

cf 02

Basta adicionar o nome da Stack e seguir as próximas configurações clicando em Next até a etapa de review e clicar em Create Stack:

cf 04

Pronto, feito isso, a nossa stack foi criada e agora basta que você acompanhe a criação através da aba events, por la teremos visualizações sobre a etapa de criação e também em caso de erro.

cf 06

Por fim, após o término de todo processo de deploy da stack, podemos acessar a aba resources e por lá verificar todos os recursos criados e seus respectivos ids:

cf 07

Bom, é isso, espero que tenham curtido e entendido um pouco sobre como lançar instâncias através do CloudFormation. Deixo também o link da documentação referente ao recurso AWS::EC2::Instance para vocês verificarem todas as possibilidades de personalização.

Comentários