Cloudformation 02 - VPC e Referências

Evoluindo no Cloudformation

No primeiro artigo desta série, aprendemos como funciona o Cloudformation, configuramos o ambiente e criamos nosso primeiro template.

Naquele exemplo, utilizamos a VPC padrão da AWS, o que não é algo recomendável. O melhor cenário é sempre criarmos a nossa própria VPC, com a faixa de rede que desejamos. Isto é importante para, por exemplo, utilizar uma faixa de rede diferente do seu datacenter atual e poder fechar uma VPN.

Entendendo a VPC

Uma VPC é a sua nuvem privada virtual dentro da AWS (por isso a sigla VPC). É dentro da VPC que ficarão as nossas subnets, gateways, tabelas de roteamento e endpoints, de maneira bem semelhante com uma rede tradicional.

https/://fabio.monster

Seguindo uma topologia bem simples e padrão, vamos criar os seguintes recursos:

  • VPC
  • Subnet pública
  • Subnet privada
  • Tabela de roteamento
  • Associação a tabela de roteamento
  • Internet gateway
  • Rota para o Internet Gateway

Criando nossa primeira VPC

Criar uma VPC utilizando o Cloudformation é bastante simples, seguimos o exemplo:

Resources: 
  myVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.10.0.0/16
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MyVPC

Podemos observar que a faixa de rede utilizada é a 10.10.0.0/16. Neste caso a escolha foi aleatória, mas o correto é verificar a sua necessidade para evitar problemas futuros.

Nos próximos passos, iremos utilizar bastante as referências, portanto precisamos entender esse ponto.

Utilizando as Referências

Para referenciarmos um recurso previamente criado pelo Cloudformation, no mesmo template, utilizamos a tag:

!Ref Recurso

Também é possível acessar recursos criados por outras stacks do Cloudformation, desde que sejam gravados nos Outputs.

Para referênciar um output, precisamos utilizar a tag:

!GetAtt Recurso.atributo

Utilizaríamos esta opção, por exemplo, para criar recursos futuros dentro desta mesma VPC.

Para entender melhor, vamos fazer na prática.

Criando as subnets

Vamos criar as subnets pública e privada, com as respectivas faixas de IP 10.10.1.0/24 e 10.10.2.0/24.


Pubsubnet:
  Type: AWS::EC2::Subnet
  Properties:
    AvailabilityZone: us-east-1a
    VpcId: !Ref myVPC
    CidrBlock: 10.10.1.0/24
    Tags:
      - Key: Name
        Value: Pubsubnet

Privsubnet:
  Type: AWS::EC2::Subnet
  Properties:
    AvailabilityZone: us-east-1a
    VpcId: !Ref myVPC
    CidrBlock: 10.10.2.0/24
    Tags:
      - Key: Name
        Value: Privsubnet

Note como referênciamos nossa VPC como:

!Ref myVPC 

Criando o Internet Gateway

Agora iremos criar e anexar nosso gateway de Internet, também usando as referências.

igwName:
  Type: AWS::EC2::InternetGateway
  Properties:
    Tags:
      - Key: Name
        Value: IG
AttachGateway:
  Type: AWS::EC2::VPCGatewayAttachment
  Properties:
    VpcId: !Ref myVPC
    InternetGatewayId: !Ref igwName

Criado as tabelas e rotas

Por fim, criamos a tabela de roteamento, associamos a subnet pública e criamos a rota para o IGW:


IGAcc:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref myVPC
      Tags:
        - Key: Name
          Value: IGAcc
  
  routeTableAssocIG:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref Pubsubnet
      RouteTableId: !Ref IGAcc

  IntAcc:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref IGAcc
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref igwName

Outputs

Para podermos referenciar a VPC nos próximos templates do Cloudformation, precisamos registrar os IDs da VPC e das subnets.

Outputs:
  VpcId:
      Description: ID of created VPC
      Value: !Ref myVPC
      Export:
        Name: VpcId
  
  PubsubnetId:
      Description: ID of public subnet
      Value: !Ref Pubsubnet
      Export:
        Name: PubsubnetId
  
  PrivsubnetId:
      Description: ID of private subnet
      Value: !Ref Privsubnet
      Export:
        Name: PrivsubnetId

Rodando a stack

Agora basta rodar o nosso template via awscli:

➜  vpc (master) ✗ aws cloudformation deploy --stack-name vpctest --template-file vpc.yaml

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - vpctest

Podemos verificar os outputs que salvamos pelo console:

https/://fabio.monster

Lembrando que depois dos estudos podemos deletar a stack para não gerar custos.

➜  vpc (master) ✗ aws cloudformation delete-stack --stack-name vpctest

Conclusão

Neste artigo criamos uma VPC completa utilizando o Cloudformation. Nos próximos artigos iremos criar recursos dentro desta VPC.

Não se esqueçam de destruir os recursos para não serem cobrados até o próximo passo do tutorial.

Todos os arquivos completos ficam no meu Github.

Referências

https://docs.aws.amazon.com/pt_br/vpc/latest/userguide/how-it-works.html

https://docs.aws.amazon.com/pt_br/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html