Configurar AWS Signer en lambda con terraform
Tags: aws, lambda, terraform
Published: 2024-03-18 08:44:46

---
title: Configurar AWS Signer en lambda con terraform
published: true
date: 2024-03-18 08:41:27 UTC
tags: aws,lambda,terraform
canonical_url: https://olcortesb.hashnode.dev/configurar-aws-signer-en-lambda-con-terraform
---

Son amplias las funcionalidades que ofrece AWS para mantener nuestro código de manera segura y protegida, [AWS signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) es un servicio que permite firmar el código de algunos servicios de AWS entre los que se encuentra [AWS Lambda](https://aws.amazon.com/es/pm/lambda/).

Existe una amplia variedad de herramientas de infraestructura como código (IaC) para gestionar nuestra infraestructura, [terraform](https://www.terraform.io/) es una de las herramientas ms difundidas para gestionar infraestructura.

A continuacin veremos como configurar [AWS signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) con [terraform](https://www.terraform.io/) para firmar el código de una lambda y veremos su funcionamiento asegurando nuestro código.

# Repositorio:

Todo el código está en el siguiente repositorio que pueden descargar y seguir para desplegar la `POC` en su entorno de prueba:

> [https://github.com/olcortesb/terraform-lambda-signer/tree/main](https://github.com/olcortesb/terraform-lambda-signer/tree/main)

## Configurar terraform:

La versión de [terraform](https://www.terraform.io/) que utilizaremos es la `1.5.5`

```bash
terrafom --version
# is 1.7.5. You can update by downloading from 
# https://www.terraform.io/downloads.html
```

Configuramos el `bucket` de `s3` que hemos creado para esta prueba, en el archivo `preferences.tf` el parámetro `backend.bucket`

```js
 // file terraform-lambda-signer/preferences.tf
 terraform {
    required_version = ">=1.5.0"
    required_providers {
        aws = {
        source  = "hashicorp/aws"
        version = ">= 4.9"
        }
    }
    backend "s3" {
        key    = "terraform.tfstate"
        bucket = "terraform-lambda-signer" // change the name of bucket
        region = "us-east-1"
        }
  }
```

## Configurar AWS CLI

Necesitamos tener configurada una cuenta de `AWS`, aquí un pequeño `gist` de como se configura [Link](https://gist.github.com/olcortesb/a471797eb1d45c54ad51d920b78aa664)

## Configurando AWS signer

Para configurar `AWS signer` necesitamos

### Definir el `signing_profile`:

```
 AWSIoTDeviceManagement-SHA256-ECDSA
 AWSLambda-SHA384-ECDSA
 AmazonFreeRTOS-TI-CC3220SF
 AmazonFreeRTOS-Default
```
Elegimos la que corresponde a Lambda y creamos el recurso:

```js
 // File lambda.tf
 resource "aws_signer_signing_profile" "tfsigner" {
   name_prefix = "tfsigner"
   platform_id = "AWSLambda-SHA384-ECDSA"
 }
```

### Configurar el `signing_job`:

Para definir el `signig job` necesitamos el origen del `bucket` y el objeto `s3` y agregarle un destino donde tendremos el código firmado.

```js
 // File lambda.tf
 resource "aws_signer_signing_job" "this" {
   profile_name = aws_signer_signing_profile.tfsigner.name

   source {
     s3 {
       bucket  = aws_s3_bucket.lambda_code_bucket.id
       key     = aws_s3_object.lambda_code.id
       version = aws_s3_object.lambda_code.version_id
     }
   }

   destination {
     s3 {
       bucket = aws_s3_bucket.lambda_code_bucket.id
       prefix = "signed/"
     }
   }

   ignore_signing_job_failure = true
 }
```

### Definir la configuración del `signer` para Lambda:

```js
 // File lambda.tf
 resource "aws_lambda_code_signing_config" "tfsigner_code" {
   allowed_publishers {
     signing_profile_version_arns = [aws_signer_signing_profile.tfsigner.version_arn]
   }
   policies {
     untrusted_artifact_on_deployment = "Enforce"
   }
 }
```

### Agregar al `resource` de lambda la configuración del `signer`

```js
 // file lambda.tf
 // Lambda
 resource "aws_lambda_function" "lambda" {
     // ...
     // Signer
     code_signing_config_arn = aws_lambda_code_signing_config.tfsigner_code.arn
     // S3 for signer configurations
     s3_bucket = aws_signer_signing_job.this.signed_object[0].s3[0].bucket
     s3_key    = aws_signer_signing_job.this.signed_object[0].s3[0].key
     // ...
 }
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1710605819348/de03de4b-6204-441b-aa14-e154bae1b409.png)

# Conclusiones

Con `AWS signer` tenemos la posibilidad de garantizar la integridad del código de nuestra lambda, teniendo un lugar único donde definir el entorno de firma como sus roles y propiedades que no abordamos en esta `POC`, pero que se pueden configurar.

El código queda completamente trazado y la integridad del mismo permite tener un control sobre los cambios que se realizan sobre l.

La configuración desde `terraform` es simple y puede automatizarse de manera eficiente para los distintos entornos de desarrollo que tengamos

Respecto al coste, `AWS Signer` no tiene cargo adicionar como se puede revisar en la documentación oficial [Link](https://docs.aws.amazon.com/signer/latest/developerguide/whatis-pricing.html)

# Referencias

- [https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html)

- [https://github.com/terraform-aws-modules/terraform-aws-lambda/blob/v6.1.0/examples/code-signing/main.tf#L95](https://github.com/terraform-aws-modules/terraform-aws-lambda/blob/v6.1.0/examples/code-signing/main.tf#L95)

- [https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3\_bucket\_versioning](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_versioning)