<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felipe Siqueira</title>
    <description>The latest articles on DEV Community by Felipe Siqueira (@frsiqueira).</description>
    <link>https://dev.to/frsiqueira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1243784%2Fa07c1dfc-b658-47f8-9b6b-0c71986e6015.jpg</url>
      <title>DEV Community: Felipe Siqueira</title>
      <link>https://dev.to/frsiqueira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frsiqueira"/>
    <language>en</language>
    <item>
      <title>Go + Github Actions + Terraform + Lambda + ARM64</title>
      <dc:creator>Felipe Siqueira</dc:creator>
      <pubDate>Fri, 29 Dec 2023 04:37:28 +0000</pubDate>
      <link>https://dev.to/frsiqueira/go-github-actions-terraform-lambda-arm64-509n</link>
      <guid>https://dev.to/frsiqueira/go-github-actions-terraform-lambda-arm64-509n</guid>
      <description>&lt;p&gt;Eae, bora falar um pouco sobre Lambdas em Go?&lt;br&gt;
A AWS recentemente depreciou o runtime go1.x e recomenda a todos migrarem para o provided.al2. &lt;a href="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/"&gt;Link&lt;/a&gt;&lt;br&gt;
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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vd7D_nau--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/co3aygqacevmqsln5ikc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vd7D_nau--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/co3aygqacevmqsln5ikc.png" alt="main.go" width="468" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de criado o código da Lambda, é necessário rodar o comando para criar o módulo Go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CvZEufp2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kh88tlsoc8iflebtdze4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CvZEufp2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kh88tlsoc8iflebtdze4.png" alt="go mod init" width="523" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os arquivos go.mod e go.sum foram criados.&lt;br&gt;
Depois de criada a Lambda, vamos partir para o Terraform.&lt;br&gt;
Vamos utilizar ele para provisionar a infra do projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gZ_anpUr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6y6afp1jwmh961zr14yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gZ_anpUr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6y6afp1jwmh961zr14yw.png" alt="main.tf" width="800" height="861"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repare que utilizamos o runtime provided.al2023, que é o runtime mais novo criado pela AWS e também o architecture arm64.&lt;/p&gt;

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

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RKcpI7Fu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tixk9liux2fdvmj1hg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RKcpI7Fu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tixk9liux2fdvmj1hg1.png" alt="Github Actions" width="627" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h9dWQe6N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/27prabta8b5kp342bb5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h9dWQe6N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/27prabta8b5kp342bb5x.png" alt="Github Actions" width="688" height="1058"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W33V8qSr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wkmo7lcfod8x6zq1g1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W33V8qSr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wkmo7lcfod8x6zq1g1p.png" alt="Github Actions" width="547" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois do push com as alterações a pipeline vai ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KbL3fwd0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uu2vxnopq91q9qkib636.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KbL3fwd0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uu2vxnopq91q9qkib636.png" alt="Github Actions" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a7uhNEqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umj6d1h07eblz7rsa0q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a7uhNEqb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umj6d1h07eblz7rsa0q7.png" alt="Github Actions" width="729" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EIo3JkAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6akgt4a6qt4pjjjvqalz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EIo3JkAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6akgt4a6qt4pjjjvqalz.png" alt="Github Actions" width="737" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso tudo funcione perfeitamente(eu sei, eu sei... nada funciona de primeira rsrs) a Lambda será criada na AWS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U-ppOiju--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i5p3j9e6ost6gh1zzlon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U-ppOiju--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i5p3j9e6ost6gh1zzlon.png" alt="AWS Lambda" width="800" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E... voilà, Lambda funcionando!&lt;/p&gt;

&lt;p&gt;Todo o código está nesse repo: &lt;a href="https://github.com/FRSiqueiraBR/go-terraform-lambda"&gt;https://github.com/FRSiqueiraBR/go-terraform-lambda&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>aws</category>
      <category>go</category>
      <category>github</category>
    </item>
  </channel>
</rss>
