Creando una funcion lambda function con terraform


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.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido