Tutorial: Uso de Lambda con API Gateway - AWS Lambda

Tutorial: Uso de Lambda con API Gateway

En este tutorial, va a utilizar Amazon API Gateway para crear una API REST y un recurso (DynamoDBManager). Defina un método (POST) en el recurso y cree una función de Lambda (LambdaFunctionOverHttps) que respalde el método POST. De esta forma, cuando se llama a la API a través de un punto de enlace HTTPS, API Gateway invoca la función de Lambda.

El método POST que definió en el recurso DynamoDBManager admite las siguientes operaciones de Amazon DynamoDB:

  • Crear, actualizar y eliminar un elemento.

  • Leer un elemento.

  • Examinar un elemento.

  • Otras operaciones (echo, ping), no relacionadas con DynamoDB, que puede utilizar para las pruebas.

El uso de API Gateway con Lambda también proporciona capacidades avanzadas, como las que se señalan a continuación:

  • Transferencia de la solicitud completa: una función de Lambda puede recibir la solicitud HTTP completa (en lugar de solo el cuerpo de la solicitud) y establecer la respuesta HTTP (en lugar de solo el cuerpo de la respuesta) mediante el tipo de integración del proxy de Lambda (AWS_PROXY).

  • Métodos catch-all: puede mapear todos los métodos de un recurso de la API a una sola función de Lambda con un único mapeo mediante el método catch-all ANY.

  • Recursos catch-all: puede mapear todas las subrutas de un recurso a una función de Lambda sin necesidad de realizar ninguna configuración adicional mediante una variable de ruta expansiva ({proxy+}).

Para obtener más información sobre estas características de API Gateway, consulte Configuración de una integración de proxy con un recurso de proxy en la Guía para desarrolladores de API Gateway.

Requisitos previos

En este tutorial, se presupone que tiene algunos conocimientos sobre las operaciones básicas de Lambda y la consola de Lambda. Si aún no lo ha hecho, siga las instrucciones de Cree una función de Lambda con la consola. para crear su primera función Lambda.

Para completar los pasos siguientes, necesitará un shell o un terminal de línea de comando para ejecutar los comandos. Los comandos y la salida esperada se enumeran en bloques separados:

aws --version

Debería ver los siguientes datos de salida:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

Para comandos largos, se utiliza un carácter de escape (\) para dividir un comando en varias líneas.

En Linux y macOS, use su administrador de shell y paquetes preferido.

nota

En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, zip) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, instale el subsistema de Windows para Linux.

Creación de un rol de ejecución

Cree un rol de ejecución. Este rol de AWS Identity and Access Management (IAM) utiliza una política personalizada para otorgar permiso a la función de Lambda a fin de acceder a los recursos de AWS necesarios. Tenga en cuenta que primero debe crear la política y luego crear el rol de ejecución.

Para crear una política personalizada
  1. Abra la página de Policies (Políticas) de la consola de IAM.

  2. Elija Create Policy (Crear política).

  3. Elija la pestaña JSON y pegue la siguiente política personalizada en el editor JSON.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ] }

    Esta política incluye permisos para que la función pueda acceder a DynamoDB y Amazon CloudWatch Logs.

  4. Elija Next: Tags (Siguiente: etiquetas).

  5. Elija Next: Review (Siguiente: revisar).

  6. En Review policy (Revisar política), para el Name (Nombre) de la política, ingrese lambda-apigateway-policy.

  7. Elija Create Policy (Crear política).

Para crear un rol de ejecución
  1. Abra la página Roles en la consola de IAM.

  2. Elija Create role (Crear rol).

  3. En el tipo de entidad de confianza, elija AWS service (Servicio de AWS).

  4. En el caso de uso, elija Lambda.

  5. Elija Next (Siguiente).

  6. En el cuadro de búsqueda de políticas, escriba lambda-apigateway-policy.

  7. En los resultados de búsqueda, seleccione la política que ha creado (lambda-apigateway-policy), y luego Next (Siguiente).

  8. En Role details (Detalles del rol), ingrese lambda-apigateway-role en Role name (Nombre del rol).

  9. Elija Create role (Crear rol).

  10. En la página Roles (Roles), elija el nombre de su rol (lambda-apigateway-role).

  11. En la página Summary (Resumen), copie el valor de Role ARN (ARN de rol). Lo necesitará más adelante en el tutorial.

Creación de la función

A continuación se muestra código de ejemplo que recibe un evento de API Gateway como entrada y procesa los mensajes que contiene. Con fines ilustrativos, el código escribe parte de los datos de los eventos de entrada en CloudWatch Logs.

Node.js
ejemplo index.js
console.log('Loading function'); var AWS = require('aws-sdk'); var dynamo = new AWS.DynamoDB.DocumentClient(); /** * Provide an event that contains the following keys: * * - operation: one of the operations in the switch statement below * - tableName: required for operations that interact with DynamoDB * - payload: a parameter to pass to the operation being performed */ exports.handler = function(event, context, callback) { //console.log('Received event:', JSON.stringify(event, null, 2)); var operation = event.operation; if (event.tableName) { event.payload.TableName = event.tableName; } switch (operation) { case 'create': dynamo.put(event.payload, callback); break; case 'read': dynamo.get(event.payload, callback); break; case 'update': dynamo.update(event.payload, callback); break; case 'delete': dynamo.delete(event.payload, callback); break; case 'list': dynamo.scan(event.payload, callback); break; case 'echo': callback(null, "Success"); break; case 'ping': callback(null, "pong"); break; default: callback(`Unknown operation: ${operation}`); } };
Para crear la función
  1. Guarde el código de ejemplo como un archivo denominado index.js.

  2. Cree un paquete de implementación.

    zip function.zip index.js
  3. Cree una función de Lambda con el comando create-function de AWS Command Line Interface (AWS CLI). En el parámetro role, ingrese el Nombre de recurso de Amazon (ARN) del rol de ejecución que copió anteriormente.

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Python 3
ejemplo LambdaFunctionOverHttps.py
from __future__ import print_function import boto3 import json print('Loading function') def handler(event, context): '''Provide an event that contains the following keys: - operation: one of the operations in the operations dict below - tableName: required for operations that interact with DynamoDB - payload: a parameter to pass to the operation being performed ''' #print("Received event: " + json.dumps(event, indent=2)) operation = event['operation'] if 'tableName' in event: dynamo = boto3.resource('dynamodb').Table(event['tableName']) operations = { 'create': lambda x: dynamo.put_item(**x), 'read': lambda x: dynamo.get_item(**x), 'update': lambda x: dynamo.update_item(**x), 'delete': lambda x: dynamo.delete_item(**x), 'list': lambda x: dynamo.scan(**x), 'echo': lambda x: x, 'ping': lambda x: 'pong' } if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))
Para crear la función
  1. Guarde el código de ejemplo como un archivo denominado LambdaFunctionOverHttps.py.

  2. Cree un paquete de implementación.

    zip function.zip LambdaFunctionOverHttps.py
  3. Cree una función de Lambda con el comando create-function de AWS Command Line Interface (AWS CLI). En el parámetro role, ingrese el Nombre de recurso de Amazon (ARN) del rol de ejecución que copió anteriormente.

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler LambdaFunctionOverHttps.handler --runtime python3.8 \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role

Prueba de la función

Pruebe la función de Lambda de forma manual utilizando los siguientes datos de un evento de muestra. Puede invocar la función mediante el comando invoke de AWS CLI o con la consola de Lambda.

Para probar la función de Lambda (AWS CLI)
  1. Guarde el siguiente JSON como un archivo denominado input.txt.

    { "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
  2. Ejecute el comando siguiente invoke AWS CLI.

    aws lambda invoke --function-name LambdaFunctionOverHttps \ --payload file://input.txt outputfile.txt --cli-binary-format raw-in-base64-out

    La opción cli-binary-format es obligatoria si va a usar la versión 2 de AWS CLI. Para que esta sea la configuración predeterminada, ejecute aws configure set cli-binary-format raw-in-base64-out. Para obtener más información, consulte las opciones globales de la línea de comandos admitidas de AWS CLI.

  3. Verifique la salida en el archivo outputfile.txt.

Creación de una API REST mediante API Gateway

En esta sección, creará una API REST de API Gateway (DynamoDBOperations) con un recurso (DynamoDBManager) y un método (POST). A continuación, asociará el método POST a la función de Lambda. A continuación, pruebe la configuración.

Cuando el método de la API recibe una solicitud HTTP, API Gateway invoca la función de Lambda.

Cree la API de

En los siguientes pasos, creará la API REST de DynamoDBOperations con la consola de API Gateway.

Para crear la API
  1. Abra la consola de API Gateway.

  2. Seleccione Create API (Crear API).

  3. En el cuadro REST API (API de REST), elija Build (Crear).

  4. En Create new API (Crear nueva API), elija New API (Nueva API).

  5. En Settings (Configuración), realice la siguiente operación:

    1. En API name (Nombre de la API), escribaDynamoDBOperations.

    2. En Endpoint Type, (Tipo de punto de enlace), elija Regional.

  6. Elija Create API (Crear API).

Creación de un recurso en la API

En los pasos siguientes, creará un recurso denominado DynamoDBManager en la API REST.

Para crear el recurso
  1. En la consola de API Gateway, en el árbol de Resources (Recursos) de la API, asegúrese de que el nivel raíz (/) esté resaltado. A continuación, elija Actions (Acciones), Create Resource (Crear recurso).

  2. En New child resource (Nuevo recurso secundario), realice la siguiente operación:

    1. En Resource Name (Nombre del recurso), escriba DynamoDBManager.

    2. Mantenga el valor de Resource Path (Ruta de acceso del recurso) establecido en /dynamodbmanager.

  3. Elija Create Resource (Crear recurso).

Creación de un método POST en el recurso

En los pasos siguientes, creará un método POST en el recurso DynamoDBManager que creó en la sección anterior.

Creación del método
  1. En la consola de API Gateway, en el árbol de Resources (Recursos) de la API, asegúrese de que /dynamodbmanager esté resaltado. A continuación, elija Actions (Acciones), Create Method (Crear método).

  2. En el menú desplegable pequeño que aparece en /dynamodbmanager, elija POST y, a continuación, elija el icono de marca de verificación.

  3. En el panel de configuración del método, haga lo siguiente:

    1. En Integration type (Tipo de integración), elija Lambda Function (Función de Lambda).

    2. En Lambda Region (Región de Lambda), elija la misma región de AWS que la función de Lambda.

    3. En Lambda Function (Función de Lambda), ingrese el nombre de la función (LambdaFunctionOverHttps).

    4. Seleccione Use Default Timeout (Usar tiempo de espera predeterminado).

    5. Seleccione Save.

  4. En el cuadro de diálogo Add Permission to Lambda Function (Agregar permiso a la función de Lambda), elija OK (Aceptar).

Creación de una tabla de DynamoDB

Cree la tabla de DynamoDB que usa la función de Lambda.

Creación de la tabla de DynamoDB
  1. Abra la página Tables (Tablas) en la consola de DynamoDB.

  2. Seleccione Create table (Crear tabla).

  3. En Table details (Detalles de la tabla), haga lo siguiente:

    1. En Nombre de la tabla, introduzca lambda-apigateway.

    2. En Partition key (Clave de partición), ingrese id y mantenga el tipo de datos establecido como String (Cadena).

  4. En Settings (Configuración), mantenga Default settings (Configuración predeterminada).

  5. Seleccione Create table (Crear tabla).

Prueba de la configuración

Ahora tiene todo listo para probar la configuración. Puede enviar solicitudes al método POST directamente desde la consola de API Gateway. En este paso, utilice una operación create seguida de una operación update.

Creación de un elemento en la tabla de DynamoDB

La función de Lambda puede utilizar la operación create para crear un elemento en la tabla de DynamoDB.

  1. En la consola de API Gateway, elija el nombre de la API de REST (DynamoDBOperations).

  2. En el árbol de Resources (Recursos), en /dynamodbmanager, elija el método POST.

  3. En el panel Method Execution (Ejecución del método), en el cuadro Client (Cliente), elija Probar.

  4. En el panel Method Test (Prueba del método), mantenga los campos Query Strings (Cadenas de consulta) y Headers (Encabezados) vacíos. En Request Body (Cuerpo de la solicitud), pegue el siguiente JSON:

    { "operation": "create", "tableName": "lambda-apigateway", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
  5. Seleccione Test (Probar).

Los resultados de la prueba deben mostrar el estado 200, lo que indica que la operación create se realizó correctamente. Para confirmarlo, puede verificar que su tabla de DynamoDB ahora contenga un elemento con "id": "1234ABCD" y "number": "5".

Actualización del elemento de la tabla de DynamoDB

También puede actualizar los elementos de la tabla mediante la operación update.

  1. En la consola de API Gateway, vuelva al panel Method Test (Prueba del método) del método POST.

  2. En el panel Method Test (Prueba del método), mantenga los campos Query Strings (Cadenas de consulta) y Headers (Encabezados) vacíos. En Request Body (Cuerpo de la solicitud), pegue el siguiente JSON:

    { "operation": "update", "tableName": "lambda-apigateway", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
  3. Seleccione Test (Probar).

Los resultados de la prueba deben mostrar el estado 200, lo que indica que la operación update se realizó correctamente. Para confirmarlo, puede verificar que su tabla de DynamoDB ahora contenga un elemento con "id": "1234ABCD" y "number": "10".

Limpiar los recursos de

A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su cuenta de AWS.

Para eliminar la función de Lambda
  1. .Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Seleccione Actions (Acciones) y, a continuación, seleccione Delete (Eliminar).

  4. Elija Delete (Eliminar).

Para eliminar el rol de ejecución
  1. Abra la página Roles en la consola de IAM.

  2. Seleccione el rol de ejecución que creó.

  3. Elija Delete role (Eliminar rol).

  4. Elija Sí, eliminar.

Para eliminar la API
  1. Abra la página API de la consola de API Gateway.

  2. Seleccione la API que ha creado.

  3. Elija Actions (Acciones), Delete (Eliminar).

  4. Elija Eliminar.

Para eliminar una tabla de DynamoDB
  1. Abra la página Tables (Tablas) en la consola de DynamoDB.

  2. Seleccione la tabla que ha creado.

  3. Elija Eliminar (Delete).

  4. Escriba delete en el cuadro de texto.

  5. Elija Eliminar.