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 elruntime
provided.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
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)}
Y nuestrogo.mod
debe tener un nombre diferente al de la dependencia:
modulelambda-functiongo1.23requiregithub.com/aws/aws-lambda-gov1.49.0
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]}
Clave: El ejecutable debe llamarsebootstrap
, nomain
. El runtimeprovided.al2023
busca específicamente este nombre.
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]}
🤔 ¿ 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 to
provided.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
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
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
El resultado debería ser:
more response.json# "Hello λ!"
Errores conocidos:
Si ves este error … :
{"errorType":"Runtime.InvalidEntrypoint","errorMessage":"Couldn't find valid bootstrap(s): [/var/task/bootstrap /opt/bootstrap]"}
Es porque el ejecutable no se llamabootstrap
. Asegúrate de compilar con:
envGOOS=linuxGOARCH=arm64 go build-o bootstrap main.go
Conclusiones
Usar
provided.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)
For further actions, you may consider blocking this person and/orreporting abuse