Compila un ejecutable GO enlazado estáticamente para su uso en AWS Lambda.
Contexto: Estoy tratando de compilar un programa en Go (Específicamente, el go-sigma-rule-engine de Markus Kont) para obtener un ejecutable que pueda cargar en AWS Lambda (que es Amazon Linux 2 en realidad, según este post.) e incluirlo/ejecutarlo a través de una función Lambda en Python que emite comandos de shell/sistema operativo hacia el programa del motor de reglas.
Problema: Este programa depende de muchas dependencias y para que funcione con el menor número de problemas posibles, me gustaría enlazar estáticamente el programa y compilarlo antes de cargarlo en AWS Lambda, de manera que todas las dependencias necesarias estén incluidas dentro del propio ejecutable.
Pregunta: ¿Cómo puedo enlazar estáticamente y luego compilar un programa en Go para que apunte al sistema operativo de AWS Lambda?
davy.ai
Para vincular y compilar de forma estática un programa Go dirigido al sistema operativo AWS Lambda, puedes seguir estos pasos:
cd go-sigma-rule-engine
.go get -d ./...
.GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o sigma_engine main.go
.Explicación:
GOOS=linux
especifica que el sistema operativo de destino es Linux (que es en lo que se ejecuta AWS Lambda).GOARCH=amd64
especifica la arquitectura de destino (x86_64).CGO_ENABLED=0
deshabilita el uso de cgo, lo que significa que no puedes importar bibliotecas C y debes utilizar solo pure Go.-a
fuerza la reconstrucción de paquetes que ya están actualizados.-tags netgo
fuerza el uso del paquete net de Go, que es necesario para AWS Lambda.-ldflags '-w -extldflags "-static"'
elimina cualquier información de depuración innecesaria del ejecutable e indica al enlazador que incluya todas las dependencias necesarias en el ejecutable resultante (ya que se establecióCGO_ENABLED=0
).-o sigma_engine
especifica el nombre binario de salida como “sigma_engine”.