🚀 Golang + ⚡ Lambda + 🏗️Terraform
Como siempre por estos caminos estoy hablando de Serverless y sus derivados, en esta ocasin contar un poco sobre como es desplegar funciones AWS Lambda en Go con Terraform no es complejo, pero tenemos que tener consideraciones.
En este artculo te muestro cmo crear una funcin Lambda bsica en Golang usando el runtime provided.al2023 y por qu es la mejor opcin actualmente.
Estructura del proyecto
Aqu Link dejar el repositorio con el cdigo completo.
00_GST_lambda/ src/ go.mod # Mdulo Go main.go # Cdigo fuente bootstrap # Binario compilado (generado) main.tf # Recursos Terraform variables.tf # Variables configurables outputs.tf # Outputs del mdulo providers.tf # Configuracin de providers backend.tf # Backend de Terraform README.md # Documentacin
El cdigo Go
Primero creamos una funcin Lambda bsica en Go. Lo importante aqu es usar la librera oficial aws-lambda-go:
// main.gopackage mainimport ( "github.com/aws/aws-lambda-go/lambda")func hello() (string, error) { return "Hello !", nil}func main() { // Make the handler available for Remote Procedure Call by AWS Lambda lambda.Start(hello)}
Y nuestro go.mod debe tener un nombre diferente al de la dependencia:
module lambda-functiongo 1.23require github.com/aws/aws-lambda-go v1.49.0
Importante: El nombre del mdulo no puede ser github.com/aws/aws-lambda-go porque entrara en conflicto con la dependencia.
La infraestructura Terraform
Compilacin automtica
El truco est en usar un data source external que compile automticamente nuestro cdigo Go:
# Crear archivo ZIP con el cdigo compiladodata "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 llamarse bootstrap, no main. El runtime provided.al2023 busca especficamente este nombre.
Rol IAM y funcin Lambda
# Rol IAM para Lambdaresource "aws_iam_role" "lambda_role" { name = var.role_name assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] })}# Funcin Lambdaresource "aws_lambda_function" "go_lambda" { filename = data.archive_file.lambda_zip.output_path function_name = "go-hello-serverless-lambda" role = aws_iam_role.lambda_role.arn handler = "main" runtime = "provided.al2023" architectures = ["arm64"] source_code_hash = data.archive_file.lambda_zip.output_base64sha256 depends_on = [ aws_iam_role_policy_attachment.lambda_basic, data.archive_file.lambda_zip ]}
Por qu usar provided.al2023 en lugar de go1.x?
Si has trabajado con Lambda en Go anteriormente, probablemente usaste el runtime go1.x. Sin embargo, AWS deprec todos los runtimes nativos de Go en diciembre de 2023.
The Go 1.x managed runtime for Lambda is deprecated. If you have functions that use the Go 1.x runtime, you must migrate your functions to provided.al 2023 or provided.al 2. The provided.al 2023 and provided.al2 runtimes offer several advantages over go1.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 recomendacin oficial es usar provided.al2023 por estas razones:
Soporte ARM64: Arquitectura Graviton2 que es 50% ms barata que x86_64
Control total: Siempre usas la ltima versin de Go que necesites
Mejor rendimiento: Binario nativo sin overhead del runtime
Sin deprecacin: AWS no puede deprecar tu versin 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 funcin se despleg correctamente:
Podemos ver que:
Runtime: provided.al2023
Arquitectura: arm64
Handler: bootstrap
Probando nuestra funcin Lambda
Para probar la funcin podemos usar la consola de AWS o el CLI:
aws lambda invoke --function-name go-hello-serverless-lambda response.jsoncat response.json
El resultado debera 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 llama bootstrap. Asegrate de compilar con:
env GOOS=linux GOARCH=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 compilacin automtica.
Gracias por leer, saludos!
Referencias
https://docs.aws.amazon.com/lambda/latest/dg/lambda-golang.html
https://github.com/aws/aws-lambda-go
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function
Artículo original: 🚀 Golang + ⚡ Lambda + 🏗️Terraform