Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

AWS Español profile imageolcortesb
olcortesb forAWS Español

Posted on

     

🚀 Golang + ⚡ Lambda + 🏗️Terraform

Source:https://olcortesb.hashnode.dev/golang-lambda-terraform

Como siempre por estos caminos estoy hablando de Serverless y sus derivados, en esta ocasión contaré un poco sobre como es desplegar funcionesAWS Lambda en Go conTerraform no es complejo, pero tenemos que tener consideraciones.

En este artículo te muestro cómo crear una función Lambda básica enGolang usando elruntimeprovided.al2023 y por qué es la mejor opción actualmente.

Estructura del proyecto

AquíLink dejaré el repositorio con el código completo.

00_GST_lambda/├──src/├──go.mod#MóduloGo├──main.go#Códigofuente└──bootstrap#Binariocompilado(generado)├──main.tf#RecursosTerraform├──variables.tf#Variablesconfigurables├──outputs.tf#Outputsdelmódulo├──providers.tf#Configuracióndeproviders├──backend.tf#BackenddeTerraform└──README.md#Documentación
Enter fullscreen modeExit fullscreen mode

El código Go

Primero creamos una función Lambda básica en Go. Lo importante aquí es usar la librería oficialaws-lambda-go:

// main.gopackagemainimport("github.com/aws/aws-lambda-go/lambda")funchello()(string,error){return"Hello λ!",nil}funcmain(){// Make the handler available for Remote Procedure Call by AWS Lambdalambda.Start(hello)}
Enter fullscreen modeExit fullscreen mode

Y nuestrogo.mod debe tener un nombre diferente al de la dependencia:

modulelambda-functiongo1.23requiregithub.com/aws/aws-lambda-gov1.49.0
Enter fullscreen modeExit fullscreen mode

Importante: El nombre del módulo no puede sergithub.com/aws/aws-lambda-go porque entraría en conflicto con la dependencia.

La infraestructura Terraform

Compilación automática

El truco está en usar undata source external que compile automáticamente nuestro código Go:

#CreararchivoZIPconelcódigocompiladodata"external""build_lambda"{program=["bash","-c","cd src && env GOOS=linux GOARCH=arm64 go build -o bootstrap main.go && echo '{\"filename\":\"bootstrap\"}'"]}data"archive_file""lambda_zip"{type="zip"source_file="${path.module}/src/bootstrap"output_path="${path.module}/lambda_function.zip"depends_on=[data.external.build_lambda]}
Enter fullscreen modeExit fullscreen mode

Clave: El ejecutable debe llamarsebootstrap, nomain. El runtimeprovided.al2023 busca específicamente este nombre.

GST_1

Rol IAM y función Lambda

#RolIAMparaLambdaresource"aws_iam_role""lambda_role"{name=var.role_nameassume_role_policy=jsonencode({Version="2012-10-17"Statement=[{Action="sts:AssumeRole"Effect="Allow"Principal={Service="lambda.amazonaws.com"}}]})}#FunciónLambdaresource"aws_lambda_function""go_lambda"{filename=data.archive_file.lambda_zip.output_pathfunction_name="go-hello-serverless-lambda"role=aws_iam_role.lambda_role.arnhandler="main"runtime="provided.al2023"architectures=["arm64"]source_code_hash=data.archive_file.lambda_zip.output_base64sha256depends_on=[aws_iam_role_policy_attachment.lambda_basic,data.archive_file.lambda_zip]}
Enter fullscreen modeExit fullscreen mode

🤔 ¿ Por qué usarprovided.al2023 en lugar dego1.x?

Si has trabajado con Lambda en Go anteriormente, probablemente usaste el runtimego1.x. Sin embargo, AWSdeprecó todos los runtimes nativos de Go en diciembre de 2023.

The Go 1.x managed runtime for Lambda isdeprecated If you have functions that use the Go 1.x runtime, you must migrate your functions toprovided.al 2023 orprovided.al 2. Theprovided.al 2023 andprovided.al 2 runtimes offer several advantages overgo1.x, including support for the arm64 architecture (AWS Graviton2 processors), smaller binaries, and slightly faster invoke times.

https://docs.aws.amazon.com/lambda/latest/dg/lambda-golang.html?utm_source=chatgpt.com

Como se ve la recomendación oficial es usarprovided.al2023 por estas razones:

  • Soporte ARM64: Arquitectura Graviton2 que es50% más barata que x86_64

  • Control total: Siempre usas la última versión de Go que necesites

  • Mejor rendimiento: Binario nativo sin overhead del runtime

  • Sin deprecación: AWS no puede deprecar tu versión de Go

Despliegue

# Inicializar Terraformterraform init# Ver plan de despliegueterraform plan# Aplicar cambiosterraform apply
Enter fullscreen modeExit fullscreen mode

Verificamos el despliegue

En nuestra consola de AWS verificamos que la función se desplegó correctamente:

Podemos ver que:

  • Runtime:provided.al2023

  • Arquitectura:arm64

  • Handler:bootstrap

GST_02

Probando nuestra función Lambda

Para probar la función podemos usar la consola de AWS o el CLI:

aws lambda invoke--function-name go-hello-serverless-lambda response.jsoncatresponse.json
Enter fullscreen modeExit fullscreen mode

El resultado debería ser:

more response.json# "Hello λ!"
Enter fullscreen modeExit fullscreen mode

GST_03

Errores conocidos:

Si ves este error … :

{"errorType":"Runtime.InvalidEntrypoint","errorMessage":"Couldn't find valid bootstrap(s): [/var/task/bootstrap /opt/bootstrap]"}
Enter fullscreen modeExit fullscreen mode

Es porque el ejecutable no se llamabootstrap. Asegúrate de compilar con:

envGOOS=linuxGOARCH=arm64 go build-o bootstrap main.go
Enter fullscreen modeExit fullscreen mode

Conclusiones

  • Usarprovided.al2023 para funciones Lambda en Go nos da:

  • El proceso de despliegue con Terraform es directo una vez que entiendes los detalles del runtime y la compilación automática.

¡Gracias por leer, saludos!

Referencias

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

More fromAWS Español

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp