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.
Secciones
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.
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
-
Abra la página de Policies (Políticas)
de la consola de IAM. -
Elija Create Policy (Crear política).
-
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.
-
Elija Next: Tags (Siguiente: etiquetas).
-
Elija Next: Review (Siguiente: revisar).
-
En Review policy (Revisar política), para el Name (Nombre) de la política, ingrese
lambda-apigateway-policy
. -
Elija Create Policy (Crear política).
Para crear un rol de ejecución
-
Abra la página Roles
en la consola de IAM. -
Elija Create role (Crear rol).
-
En el tipo de entidad de confianza, elija AWS service (Servicio de AWS).
-
En el caso de uso, elija Lambda.
-
Elija Next (Siguiente).
-
En el cuadro de búsqueda de políticas, escriba
lambda-apigateway-policy
. -
En los resultados de búsqueda, seleccione la política que ha creado (
lambda-apigateway-policy
), y luego Next (Siguiente). -
En Role details (Detalles del rol), ingrese
lambda-apigateway-role
en Role name (Nombre del rol). -
Elija Create role (Crear rol).
-
En la página Roles (Roles), elija el nombre de su rol (
lambda-apigateway-role
). -
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.
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)
-
Guarde el siguiente JSON como un archivo denominado
input.txt
.{ "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
-
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. -
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
-
Abra la consola de API Gateway
. -
Seleccione Create API (Crear API).
-
En el cuadro REST API (API de REST), elija Build (Crear).
-
En Create new API (Crear nueva API), elija New API (Nueva API).
-
En Settings (Configuración), realice la siguiente operación:
-
En API name (Nombre de la API), escriba
DynamoDBOperations
. -
En Endpoint Type, (Tipo de punto de enlace), elija Regional.
-
-
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
-
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). -
En New child resource (Nuevo recurso secundario), realice la siguiente operación:
-
En Resource Name (Nombre del recurso), escriba
DynamoDBManager
. -
Mantenga el valor de Resource Path (Ruta de acceso del recurso) establecido en
/dynamodbmanager
.
-
-
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
-
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). -
En el menú desplegable pequeño que aparece en
/dynamodbmanager
, elijaPOST
y, a continuación, elija el icono de marca de verificación. -
En el panel de configuración del método, haga lo siguiente:
-
En Integration type (Tipo de integración), elija Lambda Function (Función de Lambda).
-
En Lambda Region (Región de Lambda), elija la misma región de AWS que la función de Lambda.
-
En Lambda Function (Función de Lambda), ingrese el nombre de la función (
LambdaFunctionOverHttps
). -
Seleccione Use Default Timeout (Usar tiempo de espera predeterminado).
-
Seleccione Save.
-
-
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
-
Seleccione Create table (Crear tabla).
-
En Table details (Detalles de la tabla), haga lo siguiente:
-
En Nombre de la tabla, introduzca
lambda-apigateway
. -
En Partition key (Clave de partición), ingrese
id
y mantenga el tipo de datos establecido como String (Cadena).
-
-
En Settings (Configuración), mantenga Default settings (Configuración predeterminada).
-
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.
-
En la consola de API Gateway
, elija el nombre de la API de REST ( DynamoDBOperations
). -
En el árbol de Resources (Recursos), en
/dynamodbmanager
, elija el métodoPOST
. -
En el panel Method Execution (Ejecución del método), en el cuadro Client (Cliente), elija Probar.
-
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 } } }
-
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
.
-
En la consola de API Gateway
, vuelva al panel Method Test (Prueba del método) del método POST. -
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 } } } }
-
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
-
.Abra la página de Functions (Funciones)
en la consola de Lambda. -
Seleccione la función que ha creado.
-
Seleccione Actions (Acciones) y, a continuación, seleccione Delete (Eliminar).
-
Elija Delete (Eliminar).
Para eliminar el rol de ejecución
-
Abra la página Roles
en la consola de IAM. -
Seleccione el rol de ejecución que creó.
-
Elija Delete role (Eliminar rol).
-
Elija Sí, eliminar.
Para eliminar la API
-
Abra la página API
de la consola de API Gateway. -
Seleccione la API que ha creado.
-
Elija Actions (Acciones), Delete (Eliminar).
-
Elija Eliminar.
Para eliminar una tabla de DynamoDB
-
Abra la página Tables (Tablas)
en la consola de DynamoDB. -
Seleccione la tabla que ha creado.
-
Elija Eliminar (Delete).
-
Escriba
delete
en el cuadro de texto. -
Elija Eliminar.