Go + Github Actions + Terraform + Lambda + ARM64
Tags: aws, go, github
Published: 2023-12-29 04:37:28

Eae, bora falar um pouco sobre Lambdas em Go?
A AWS recentemente depreciou o runtime go1.x e recomenda a todos migrarem para o provided.al2. [Link](https://aws.amazon.com/pt/blogs/aws-brasil/migracao-de-funcoes-do-aws-lambda-no-runtime-go1-x-para-o-runtime-personalizado-no-amazon-linux-2/)
Com isso em mente resolvi criar um projetinho simples fazendo desde o Github Actions, provisionamento de infra com o Terraform e o deploy da Lambda em ARM64.

A primeira coisa que eu fiz foi criar o código da Lambda em Go. Um código bem simples apenas para printar um hello world.

![main.go](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/co3aygqacevmqsln5ikc.png)

Depois de criado o código da Lambda, é necessário rodar o comando para criar o módulo Go.

![go mod init](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kh88tlsoc8iflebtdze4.png)

Os arquivos go.mod e go.sum foram criados.
Depois de criada a Lambda, vamos partir para o Terraform.
Vamos utilizar ele para provisionar a infra do projeto.

![main.tf](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6y6afp1jwmh961zr14yw.png)

Repare que utilizamos o runtime provided.al2023, que é o runtime mais novo criado pela AWS e também o architecture arm64.

Depois do arquivo de terraform criado, vamos criar o Github Actions para funcionar como nosso CI/CD.
Crie um arquivo chamado pipeline.yml dentro da pasta .github/workflows.

Como vamos usar uma Lambda em ARM64, temos algumas peculiaridades no momento de fazer o build. Temos que passar as variáveis GOOS=linux GOARCH=arm64.

![Github Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tixk9liux2fdvmj1hg1.png)

Agora no job de deploy vamos fazer o terraform init, format check, validate, plan e apply, para validar se tudo está correto e realmente provisionar a infra.

![Github Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/27prabta8b5kp342bb5x.png)

Outro ponto importante, para conseguirmos fazer todo o provisionamento na AWS precisamos passar para o Terraform algumas chaves de acesso. Como não é nada recomendado deixar as chaves no arquivo do Actions, Eu acabei deixando elas no secret do Github.

![Github Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wkmo7lcfod8x6zq1g1p.png)

Depois do push com as alterações a pipeline vai ficar assim:

![Github Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uu2vxnopq91q9qkib636.png)

![Github Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umj6d1h07eblz7rsa0q7.png)

![Github Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6akgt4a6qt4pjjjvqalz.png)

Caso tudo funcione perfeitamente(eu sei, eu sei... nada funciona de primeira rsrs) a Lambda será criada na AWS.

![AWS Lambda](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i5p3j9e6ost6gh1zzlon.png)

E... voilà, Lambda funcionando!

Todo o código está nesse repo: https://github.com/FRSiqueiraBR/go-terraform-lambda

Criei essa Lambda pra usar de base para outros projetos pessoais, esperam que tenham gostado, deixem sugestões e melhorias nos comentários ✋. Bye!