Artigo original: How to Implement Infrastructure as Code with AWS
Infraestrutura como código (ou, em inglês, infrastructure as a code, ou IaC) é o processo de provisionamento e gerenciamento de seus recursos de nuvem escrevendo um arquivo de modelo que pode ser lido por humanos e consumível pela máquina.
Para o desenvolvimento na nuvem com a AWS, a escolha integrada para infraestrutura como código é o AWS CloudFormation.
Usando a IaC, os desenvolvedores podem gerenciar a infraestrutura de um projeto com eficiência, permitindo que eles configurem e mantenham facilmente as alterações na arquitetura e nos recursos de um projeto.
Existem inúmeras ferramentas de IaC disponíveis, como Ansible, Puppet, Chef e Terraform.
Para este guia, no entanto, usaremos o CloudFormation, que foi feito especificamente para os recursos da AWS.
O que você vai aprender neste tutorial
Depois de passar por este tutorial, você entenderá como manter seus recursos em um arquivo de software.
Além disso, você aprenderá os benefícios relacionados à velocidade que a infraestrutura como código traz. Sem a IaC, o tempo e o custo da implantação manual de várias infraestruturas podem ser muito maiores em comparação com a manutenção da infraestrutura como software.
Neste artigo, vamos considerar um exemplo. Ele demonstrará o provisionamento manual de recursos versus a implantação de um script CloudFormation para criar uma função Lambda sem servidor e uma API REST na AWS.
Serviços que vamos usar neste tutorial
Vamos usar os seguintes serviços para implementar infraestrutura como código na AWS:
Para quem é novo na AWS, é bom ter algum conhecimento dela para entender o artigo. Então, você pode me acompanhar criando uma conta na AWS aqui e certificando-se de ter a AWS CLI instalada para trabalhar com o exemplo.
Visão geral do exemplo
Para o artigo, implementaremos uma API REST com um gateway de API. Ele será integrado a uma função Lambda de back-end sem servidor que lida com POST e obtém solicitações feitas por nossa API.
A primeira etapa mostrará como criar e implantar manualmente esses recursos usando o console AWS. A segunda etapa mostrará como automatizar o processo usando o CloudFormation.
Como implantar manualmente
Na implantação (ou, em inglês, deployment) manual, trabalharemos dentro do console AWS. É um pouco difícil acompanhar as alterações ao trabalhar fora do IDE local, especialmente para projetos de grande escala.
Na primeira etapa, criaremos uma função Lambda.

Se você deseja que sua função Lambda funcione com algum outro serviço como o Comprehend
, deve conceder permissões para esse serviço. Portanto, certifique-se de criar uma função com essas permissões.
A seguir está nossa função Lambda que retornará "Hello World" quando integrada ao gateway da API.
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello World!')
}
Agora que configuramos nossa função Lambda, a próxima etapa é criar uma API REST para interagir com a função Lambda.
Para isso, vá para o Amazon API Gateway, clique em "Create API" (Criar API) e selecione REST API nas opções fornecidas.

Agora, vamos integrar o Lambda com a API. Para isso, crie um método GET no menu de ações e aponte nossa API REST para a função Lambda.

Estamos em condições de implantar e testar nossa API para sua integração adequada com o Lambda. Selecione o nome que desejar – para este exemplo, estou usando "prod".

Depois de implantar a API, você pode ver um URL no estágio "prod". Atingir esse URL acionará a função Lambda. Como retornamos "Hello World" a partir de nossa função Lambda, você poderá ver o resultado desejado.

Como implantar com CloudFormation
Até aqui, vimos como funciona a implantação manual, que costuma levar alguns minutos.
Vamos imaginar, no entanto, que temos mais de uma API, método e mais de um desenvolvedor trabalhando neles. Nesse cenário, rastrear todos os recursos e mudanças seria um desafio.
Portanto, nesta seção, usaremos o AWS CloudFormation. Ele dará flexibilidade aos desenvolvedores, permitindo que eles ajustem sua infraestrutura com um script simples.
Como o CloudFormation funciona?
Usaremos o arquivo YAML para provisionar e declarar esses recursos e implantá-los na AWS para criar uma stack do CloudFormation. O CloudFormation é uma stack que contém todos os recursos necessários para o projeto.
Usaremos o modelo SAM, conforme descrito acima na seção de serviços. É uma abstração do CloudFormation para criar aplicações sem servidor com menos código YAML.
Para quem não conhece o YAML, você pode pensar nele como se fosse um JSON. O CloudFormation, porém, usa esses dois formatos de arquivo.
Na primeira etapa, vamos para nosso IDE local e escrevemos a mesma função Lambda que escrevemos no console da AWS.
helloworld.py:
import json
def lambda_handler(event, context):
# TODO implementar
return {
'statusCode': 200,
'body': json.dumps('Hello World!')
}
Em seguida, criaremos um arquivo template.yaml contendo nossa infraestrutura. Definiremos nossa função Lambda e API Gateway neste arquivo.
Para criar este arquivo, precisamos adicionar algumas informações que são comuns a todos os modelos SAM.
template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: First CloudFormation template
Agora, temos que adicionar "Globals" a este arquivo template.yaml
do CloudFormation. Globals são as configurações comuns para os recursos que você vai implantar. Globals permitem que você declare informações globalmente para um tipo de recurso específico, em vez de especificá-las repetidas vezes para recursos diferentes.
template.yaml:
Globals:
#Comum a todas as funções Lambda que você cria
Function:
MemorySize: 128
Runtime: python3.6
Timeout: 5
Temos que definir a tag Resources em nosso arquivo template.yaml
. A função Lambda e a API REST estarão sob esta tag.
template.yaml:
Resources:
##Lambda e API GW integrados
helloworld:
Type: AWS::Serverless::Function
Properties:
#nome_de_arquivo.nome_da_função
Handler: helloworld.lambda_handler
#REST API criada
Events:
PostAdd:
Type: Api
Properties:
Path: /helloworld
Method: get
No código acima, definimos parâmetros para criar a função Lambda. Para o evento, criamos uma API REST que aciona a função Lambda.
Observação: há alguns parâmetros, como CodeURI e description, que você pode especificar para sua função serverless. A melhor maneira de criar um arquivo de modelo é consultar os documentos do CloudFormation e ver os parâmetros disponíveis para seu recurso/serviço especificado.
Como implantar o arquivo de modelo
Podemos implantar nosso arquivo template.yaml
usando os dois comandos da AWS CLI a seguir:
##s3 bucket armazena o modelo sam que precisamos implantar
aws cloudformation package --template-file template.yaml --output-template-file sam-template.yaml --s3-bucket helloworld-sam
Depois de executar o comando acima, você poderá ver um arquivo de modelo SAM. Usaremos esse arquivo no segundo comando abaixo.
Neste comando, forneça o caminho apropriado para o arquivo sam-template.yaml
:
#Implantar a stack
#aponta para o arquivo modeleo criado por um comando anterior e um nome da stack, bem como a região na qual estamos implantando
aws cloudformation deploy --template-file /path to sam-template.yaml file --stack-name test-stack --capabilities CAPABILITY_IAM --region us-east-1
Depois de executar esses dois comandos, você verá a stack criada na CLI. Você pode verificá-la usando o CloudFormation no console.
Aqui você verá todos os recursos provisionados por meio do código criado e implantado usando o arquivo template.yaml
.

Você pode clicar na API e acessar o URL para verificar a saída, como fizemos para a implantação manual.
Resumo
Era isso! Você implementou com sucesso a infraestrutura como código na AWS usando o CloudFormation.
Espero que este artigo tenha sido útil para quem deseja entender a implementação de infraestrutura como código na AWS.
Conecte-se com o autor do artigo pelo LinkedIn e pelo Twitter.
Até a próxima! 🙂