Creando una funcion lambda function con terraform
Introducción
Aquí veremos cómo usar Terraform para gestionar funciones Lambda. Será un sencillo “Hello World” en node.js, disponible como gist aquí. Nota: no creé este ejemplo, pero está muy cerca de la documentación oficial, solo que más corto. También podés ver otro ejemplo con python aquí.
Antes de comenzar, asegurate de tener tu cuenta configurada para awscli y que ya tenés instalado terraform.
Archivos de configuración
Primero, necesitamos obtener nuestro archivo o archivos de Terraform (en un caso normal sería más de un archivo, pero como es un “hello world” es más fácil tener todo en el mismo archivo). Agregué algunos comentarios sobre qué hace cada parte.
# Configura la región donde se creará la función Lambda
variable "aws_region" {
default = "us-east-1"
}
# Asigna la región al proveedor, en este caso AWS
provider "aws" {
region = "${var.aws_region}"
}
# Archiva el código o proyecto que queremos ejecutar
data "archive_file" "lambda_zip" {
type = "zip"
source_file = "index.js"
output_path = "lambda_function.zip"
}
# Crea la función
resource "aws_lambda_function" "test_lambda" {
filename = "lambda_function.zip"
function_name = "test_lambda"
role = "${aws_iam_role.iam_for_lambda_tf.arn}"
handler = "index.handler"
source_code_hash = "${data.archive_file.lambda_zip.output_base64sha256}"
runtime = "nodejs8.10"
}
# Permisos necesarios para crear/ejecutar la función
resource "aws_iam_role" "iam_for_lambda_tf" {
name = "iam_for_lambda_tf"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
}
EOF
}
El código en sí
Luego necesitamos el código que queremos ejecutar.
// Función AWS Lambda "Hello World" en nodejs6.10
exports.handler = (event, context, callback) => {
console.log('Hello world!');
callback(null, 'It works!');
}
Inicializar Terraform
Primero necesitamos inicializar Terraform como en el gist a continuación. Esto descargará los plugins necesarios que usamos en el código; de lo contrario, no podrá ejecutarse.
$ terraform init
Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "aws" (2.8.0)...
- Downloading plugin for provider "archive" (1.2.1)...
Terraform has been successfully initialized!
Aplicar los cambios
El siguiente paso sería aplicar los cambios. Podés planificar en un archivo de salida y luego aplicar desde ese archivo, pero también podés usar simplemente el comando apply
. Este comando se encargará de hacer todo lo que definimos: archivará el código, creará el rol IAM y la función Lambda.
$ terraform apply
data.archive_file.lambda_zip: Refreshing state...
...
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Ejecutar la función
El último paso sería ejecutar nuestra función para ver si funciona. En este caso, estamos usando awscli, pero también podés hacerlo desde la consola de AWS.
$ aws lambda invoke --function-name test_lambda --invocation-type RequestResponse --log-type Tail - | jq '.LogResult' -r | base64 --decode
START RequestId: 760a31c6-8ba4-48ac-9a8f-0cf0ec7bf7ac Version: $LATEST
2019-04-27T20:14:23.630Z 760a31c6-8ba4-48ac-9a8f-0cf0ec7bf7ac Hello world!
END RequestId: 760a31c6-8ba4-48ac-9a8f-0cf0ec7bf7ac
REPORT RequestId: 760a31c6-8ba4-48ac-9a8f-0cf0ec7bf7ac Duration: 75.06 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 48 MB
Limpiar
Acordate de limpiar todo antes de salir.
$ terraform destroy
...
Destroy complete! Resources: 2 destroyed.
Aunque terraform puede ser útil, creo que seguiré usando el serverless framework por ahora. Sin embargo, es bueno saber que hay alternativas y que, con algo de esfuerzo, pueden ofrecernos la misma funcionalidad.
Errata
Si encontrás algún error o tenés alguna sugerencia, por favor enviame un mensaje para que lo corrija.
No tienes cuenta? Regístrate aqui
Ya registrado? Iniciar sesión a tu cuenta ahora.
-
Comentarios
Online: 0
Por favor inicie sesión para poder escribir comentarios.