AWS sam #3: sam local + ApiGateway Lambda authorizer
Tags: aws, sam, dynamodb, apigateway
Published: 2023-10-23 08:41:26

---
title: AWS sam #3: sam local + ApiGateway Lambda authorizer
published: true
date: 2023-04-25 11:07:36 UTC
tags: aws,sam,dynamodb,apigateway
canonical_url: https://olcortesb.hashnode.dev/aws-sam-test-en-local-apigateway-lambda-authorizer
series: AWS lambda con sam
---

En post anteriores comentaba las posibilidades que ofrece _AWS sam_ para probar localmente nuestras _Apis_ Con [Dynamo DB](https://dev.to/aws-espanol/aws-sam-1-sam-local-dynamodb-ddk) y [Generando Logs Localmente](https://dev.to/aws-espanol/aws-sam-2-sam-local-logs-4ga9).

En la última actualización de [AWS sam 02-04-2023](https://aws.amazon.com/es/about-aws/whats-new/2023/04/aws-sam-cli-local-testing-api-gateway-lambda-authorizers/), se agregó una interesante funcionalidad,la posibilidad de probar localmente los _Authorizer_ que se tengan configurados en los _ApiGateway_.

En el siguiente repositorio de GitHub [https://github.com/olcortesb/sam-api-authorizer](https://github.com/olcortesb/sam-api-authorizer) he dejado una demo completa de como probar los _Authorizer_ localmente.

A continuación dejo algunos detalles adicionales

### Actualizar la versión de _AWS_ _sam_:

La versión a partir de la cual esta funcionalidad está disponible es la `1.80.0`

Para verificar la versión que tenemos instalada y actualizar:

```bash
sam --version
# SAM CLI, version 1.76.0

# For mac
brew upgrade aws-sam-cli

sam --version
# SAM CLI, version 1.81.0

```

Como actualizar _AWS sam_ Para distintos sistemas operativos:
> [manage-sam-cli-versions](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html)

### Código e infraestructura

Dentro del proyecto se encontrarán tres archivos que son los principales:

- _template.yaml -> Definición de la infraestructura (Api y lambdas)_

- _authorizer.js -> La lambda que contiene el Custom authorizer_

- _handler.js -> la lambda que esta detrás del Api Gateway y el Authorizer._

Definiendo el _Authorizer_ dentro de la API

```yaml
# File template.yaml
Resources:
  LoggerApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      Auth:
        DefaultAuthorizer: JWTCustomAuthorizer
        Authorizers: # Definitions of authorizer
          JWTCustomAuthorizer:
            FunctionPayloadType: TOKEN
            FunctionArn: !GetAtt JWTAuthFunction.Arn
```

Definiendo la lambda que se ejecutara para validar el _Authorizer_ tipo _TOKEN_

```yaml
# File template.yaml
  JWTAuthFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: authorizer.lambdaHandler
      Runtime: nodejs18.x
      CodeUri: .
      Architectures:
        - x86_64

```

Código de lambda basada en él _template_ que provee _aws:_ [Link](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)

:warning: No usar en producción, remplazar por la validación del JWT correspondiente.

```js
// File authorizer.js
const validate_token_and_user = async (token)=>{
    // Validate token Demo
    // Do not use in productive environment
    // valide your token here
    console.log("Log from lambda authorizer ...");
    console.log("The token: ",token);
    if (token.split(' ').pop() === 'e81a50b9'){
        return true;
    }
    return false;
}

```

### Levantar el proyecto en local

Descargar el proyecto del repositorio: [https://github.com/olcortesb/sam-api-authorizer](https://github.com/olcortesb/sam-api-authorizer)

Ahora levantamos las _APIs_

```bash
sam local start-api -p 3002 --log-file logfile.txt

```

### Llamamos al _endpoint_ _/logger_

Probamos pasando el token errado …

```bash
curl -X GET \
  'http://127.0.0.1:3002/logger' \
  --header 'Accept: */*' \
  --header 'Authorization: Bearer e81a50b9ddd'
# Response:
# { 
# "message": "User is not authorized to access this resource"
# }

```

Y pasando el token correcto

```bash
curl -X GET \
  'http://127.0.0.1:3002/logger' \
  --header 'Accept: */*' \
  --header 'Authorization: Bearer e81a50b9'

# Response
# "OK"

```

Finalmente, utilizando la funcionalidad de generar un _log_ localmente como si fuera AWS [CloudWatch](https://aws.amazon.com/es/cloudwatch/) ([Link](https://dev.to/olcortesb/aws-sam-local-start-api-logs-3d7p-temp-slug-6782450)), podemos ver los _logs_ que hemos dejado dentro de la lambda _Authorizer_.

```bash
START RequestId: c0bd0c4a-0722-4b82-8c68-d56c0b26d128 Version: $LATEST
2023-04-24T13:05:22.621Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO Method ARN: arn:aws:execute-api:us-east-1:123456789012:1234567890/dev/GET/logger
2023-04-24T13:05:22.627Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO Token fron event: Bearer e81a50b9
2023-04-24T13:05:22.628Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO Log from lambda authorizer ...
2023-04-24T13:05:22.628Z c0bd0c4a-0722-4b82-8c68-d56c0b26d128 INFO El token: Bearer e81a50b9
END RequestId: c0bd0c4a-0722-4b82-8c68-d56c0b26d128
REPORT RequestId: c0bd0c4a-0722-4b82-8c68-d56c0b26d128 Init Duration: 1.69 ms Duration: 1523.58 ms Billed Duration: 1524 ms Memory Size: 128 MB Max Memory Used: 128 MB

```

¡Eso es todo por ahora, espero sea útil, gracias!

Saludos

## Referencias

- [https://aws.amazon.com/es/about-aws/whats-new/2023/04/aws-sam-cli-local-testing-api-gateway-lambda-authorizers/](https://aws.amazon.com/es/about-aws/whats-new/2023/04/aws-sam-cli-local-testing-api-gateway-lambda-authorizers/)

- [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-local-start-api.html#using-sam-cli-local-start-api-authorizers](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-local-start-api.html#using-sam-cli-local-start-api-authorizers)

- [https://aws.amazon.com/es/serverless/sam/](https://aws.amazon.com/es/serverless/sam/)

- [https://github.com/mavi888/sam-eventbridge/tree/main](https://github.com/mavi888/sam-eventbridge/tree/main)

- [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis-lambda-authorizer.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-controlling-access-to-apis-lambda-authorizer.html)