Criando um Lambda em Python via Terraform e Deploy com GitLab CI/CD
Já pensou publicar sua chamada Python com CI/CD em minutos? Esse é um guia objetivo para criarmos um Lambda em Python + API Gateway com domínio customizado via Terraform e deploy via GitLab CI/CD, utilizando recursos sob demanda da AWS!
Essa é a continuação de guias e compartilhamento de experiências que pretendo trazer aqui sobre o provisionamento de aplicações com recursos sob demanda da AWS seguindo meus estudos sobre arquitetura serverless.
Esse guia tem como requisito um domínio no Route 53 da AWS, por tanto, recomendo dar uma olhada em um dos meus últimos artigos aqui no Medium.
Proposta de Arquitetura
Segue abaixo o diagrama de proposta de arquitetura para o Lambda utilizando os recursos da AWS que iremos provisionar 🚀
Hello World em Python
Iremos manter o foco no criação dos recursos e deploy da aplicação, com isso, o código que iremos criar é um simples “Hello World” em Python.
É importante utilizarmos exatamente esse nome arquivo “lambda_function.py” e método “lambda_handler”, onde no decorrer desse guia referenciaremos a esses exatos valores.
Além disso, iremos realizar nossa atualização de código do lambda via arquivo “.zip”, dessa forma, para realizarmos a criação do nosso Lambda iremos precisar desse mesmo arquivo de código em .zip.
Para isso podemos executar o seguinte comando:
zip -r hello_world_python.zip lambda_function.py
Projeto Terraform
Para reutilizar e facilitar a criação de recursos do Terraform, iremos criar um módulo Terraform próprio.
Para isso, utilizaremos a seguinte estrutura de arquivos e pastas.
modules/
-- lambda-python/
---- main.tf
---- variables.tf
---- output.tf
---- hello_world_python.zip
provider.tf
route53.tf
lambda.tf
variables.tf
output.tf
Os arquivos “provider.tf”, “route53.tf” e “variables.tf” haviamos criados previamente no artigo anterior, por tanto, iremos reutilizá-los.
Módulos Terraform
Com a estrutura inicial do projeto concluída, vamos seguir para a construção do nosso módulo Terraform para Lambda em Python e API Gateway.
Dentro desse módulo utilizaremos um outro módulo para criação de lambda, onde dentro dele ele cria uma série de recursos como Lambda, CloudWatch, IAM, etc.
Recomendo a leitura da documentação dele para entender os recursos que ele cria e quais as possíveis customizações ele disponibiliza caso deseje evoluir o projeto desse guia.
E iremos utilizar os recursos da “aws_apigatewayv2” onde recomendo também a leitura da documentação para entender as possíveis customizações caso deseje evoluir o projeto dese guia.
Módulo Terraform Lambda Python
Com isso vamos construir nosso módulo Lambda Python, para isso, iremos definir os 4 arquivos do módulo, sendo eles:
modules/
-- lambda-python/
---- main.tf
---- variables.tf
---- output.tf
---- hello_world_python.zip
O arquivo .zip com nosso Hello World em Python nós já temos, podemos movê-lo para dentro da estrutura de pastas do módulo com esses comandos na raiz do projeto:
mkdir -p modules/lambda-python
mv hello_world_python.zip modules/lambda-python/hello_world_python.zip
Feito isso, iremos definir nosso arquivo de “variables.tf” com os valores e tipos que iremos receber para criar nosso módulo.
A partir das variáveis vamos criar agora nosso arquivo “main.tf” que faz referência e uso de cada uma delas.
Por fim, iremos definir o arquivo “output.tf” para retornar as URLs base.
Provisionando o Lambda + API Gateway
Criado nosso módulo, iremos utilizar o mesmo para provisionarmos nosso Lambda em Python, para isso iremos definir nosso arquivo “lambda.tf”.
Nesse arquivo referenciamos nosso módulo que acabamos de criar e definimos suas propriedades como nome, protocolo, handler, path, etc.
Com isso, caso desejemos criar um novo lambda em python, basta replicarmos esse trecho de código e em poucos segundos temos nossa aplicação no ar.
Por fim, vamos definir o arquivo “output.tf”, para que seja retornadas as URLs base do Lambda.
Feito isso, vamos executar os seguintes comandos:
terraform init
terraform plan -out plan_terraform
Onde iremos baixar as dependências e planejar a criação dos recursos, onde teremos o seguinte resultado:
Onde podemos verificar cada um dos 16 recursos que serão criados a partir do nosso código terraform.
Validados podemos executar o seguinte comando para criarmos os recursos:
terraform apply "plan_terraform"
Onde em poucos segundos serão criados os recursos que definimos na AWS e nos retornadas as URLs base do nosso Lambda.
Acessando as URLs temos o mesmo resultado em ambas:
Com isso, provisionamos nosso Lambda + API Gateway em Python via Terraform 🎉
Projeto Lambda no GitLab
Nosso próximo passo é configurar o projeto lambda no GitLab, para isso podemos nos cadastrar no GitLab e criar um novo repositório com o mesmo nome definido no Lambda.
Criado repositório vamos definir o arquivo “lambda_function.py”.
Onde utilizei o mesmo código Hello World atualizando a mensagem de retorno para identificamos o sucesso no Deploy.
Além disso, definimos o arquivo “.gitlab-ci.yml”:
Possuindo duas etapas, uma para build, no caso o empacotamento em zip do projeto python e uma etapa de deploy para atualizar o código Lambda.
Usuário IAM para GitLab CI/CD
Para realizarmos a atualização de código via CI/CD, vamos precisar de um usuário IAM na AWS com permissão de atualização de código Lambda.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:UpdateFunctionCode",
"Resource": "*"
}
]
}
A permissão pode definir os lambdas que terá acesso, neste caso como utilizarei apenas para teste deixei a permissão de atualização de código de maneira global.
Criado o usuário, vamos criar um par de chaves (Key e Secret), e defini-las no GitLab CI/CD em Settings > CI/CD > Variables.
AWS_ACCESS_KEY_ID=<key>
AWS_SECRET_ACCESS_KEY=<secret>
AWS_DEFAULT_REGION=us-east-1
Deploy via GitLab CI/CD
Por fim, podemos executar o deploy do código lambda:
Feito o deploy, podemos conferir nas URLs a mensagem atualizada após o deploy.
Efetuamos o deploy do Lambda Python via GitLab CI/CD com Sucesso! 🎉
Removendo Recursos Criados
Para realizar a exclusão do recurso, basta executar o seguinte comando e confimar com “yes” caso deseje remover os recursos indicados.
terraform destroy
Preço
Além dos custos com Route 53 já detalhado no outro guia, temos novos recursos Lambda, CloudWatch e API Gateway.
Confira nas documentações abaixo o detalhamento da precificação dos recursos, onde todos são sob demanda de uso.
Conclusão
Com o módulo criado é incrível podermos em poucos minutos provisionarmos uma aplicação nova no ambiente, colocamos a escalabilidade de aplicações a outro nível.
São diversas as customizações do Lambda e API Gateway para se adaptar a cada contexto, e temos que levar em consideração que todos os recursos são sob demanda da AWS, logo seremos cobrados de acordo com o uso dos recursos que é proporcional a escalabilidade do negócio 😄