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:

Nome do serviço AWS

Descrição

AWS API Gateway (API GW)

Vamos usar este serviço para criar nossa API REST. Ele também permite criar, publicar e monitorar APIs Restful e Sockets seguros.

AWS Lambda

Vamos usar este serviço para configurar uma função serverless (sem servidor) como exemplo no backend que será integrado a nossa API REST.

Identity Access and Management (IAM)

Serviço que permite que você gerencie o acesso a vários serviços AWS por meio de roles (funções) e permissões. Vamos criar uma role para nossa função Lambda de forma que possamos acessar o API gateway.

AWS CLI

Para trabalhar com os serviços e recursos da AWS, você pode usar a interface de linha de comando em vez do console para um acesso mais fácil.

AWS SAM

Uma abstração do CloudFormation que permite desenvolver as aplicações serverless.

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.

Screenshot-2022-09-25-at-1.39.57-AM

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.

Screenshot-2022-09-25-at-1.40.24-AM

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.

Screenshot-2022-09-25-at-1.40.51-AM

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".

Screenshot-2022-09-25-at-1.41.22-AM

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.

Screenshot-2022-09-25-at-1.41.46-AM

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.

Screenshot-2022-09-25-at-1.38.39-AM

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! 🙂