Esta característica usa delegación. De forma predeterminada, la delegación está deshabilitada para los inquilinos que no tenían ningún complemento en uso al 8 de junio de 2017. Los inquilinos heredados que actualmente usan un complemento que requiere delegación pueden seguir usando esta característica. Si la funcionalidad de delegación cambia o se elimina del servicio en algún momento, se notificará con antelación a los clientes que la usan actualmente y se les dará tiempo suficiente para migrar. Además, tenga en cuenta que la delegación no admite el uso de dominios personalizados, por lo que cualquier característica que dependa de ella podría no funcionar por completo junto con un dominio personalizado.
Paso 1: Configurar Amazon API Gateway
Después de completar este paso, habrá realizado lo siguiente:
- Configurado Amazon API Gateway con funciones de AWS Lambda para ejecutar la lógica de su servicio, que almacena y recupera mascotas de una tabla de Amazon DynamoDB;
- Creado dos métodos de servicio REST sin autenticación para obtener y actualizar una lista de mascotas.
Antes de comenzar, asegúrese de tener instalado Node.js.
Paso 1. Cree la tabla de Amazon DynamoDB
En la consola de Amazon DynamoDB, haga clic en Create Table.
Configure las variables asociadas a la tabla:
- Nombre de la tabla: Pets
- Clave principal: username
- Tipo de clave principal: String
- Usar la configuración predeterminada: desmarcado
- Unidades de capacidad de lectura: 3
- Unidades de capacidad de escritura: 3
Haga clic en Create para crear la tabla con la configuración indicada.
Mientras se crea la tabla, tome nota del Amazon Resource Name (ARN) en la sección de detalles de la tabla. Necesitará el ARN de la tabla en el siguiente paso.
Paso 2. Cree la política que otorga a las funciones de AWS Lambda acceso a la tabla Pets de DynamoDB
Vaya a la Consola de IAM de AWS.
Haga clic en Roles en el menú de la izquierda y, a continuación, en el botón Create New Role.
Asigne al rol el nombre APIGatewayLambdaExecRole y haga clic en Next Step.
Seleccione el tipo de rol. En AWS Service Roles, seleccione AWS Lambda.
En la pantalla Attach Policy, omita este paso haciendo clic en Next Step. En este punto, revise la información que proporcionó. Si todo es correcto, haga clic en Create Role. Cuando termine, debería ver el rol en la página principal de IAM.
Seleccione el rol que acaba de crear, APIGatewayLambdaExecRole. Haga clic en la flecha desplegable de Inline Policies y, a continuación, en el enlace Click Here.
Seleccione Custom Policy y, a continuación, haga clic en Select. Asigne a la política el nombre LogAndDynamoDBAccess y agregue el siguiente código como documento de la política (asegúrese de actualizar primero el Amazon Resource Name (ARN) de su tabla de DynamoDB). Haga clic en Apply Policy.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccessCloudwatchLogs",
"Action": ["logs:*"],
"Effect": "Allow",
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "PetsDynamoDBReadWrite",
"Effect": "Allow",
"Action": [
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem"
],
"Resource": ["DYNAMODB_TABLE_ARN_VALUE_FROM_PREVIOUS_STEP"]
}
]
}
Paso 2. Cree las funciones de AWS Lambda
En los tres pasos siguientes, creará las funciones de AWS Lambda para recuperar y actualizar la información de las mascotas en la tabla de DynamoDB.
Cree la función de AWS Lambda para GetPetInfo
En la consola de AWS Lambda, seleccione Create a Lambda Function (si aún no ha creado una función de AWS Lambda, haga clic en Get Started Now).
En la pantalla Select blueprint, haga clic en Blank Function.
A continuación, se le pedirá que configure los desencadenadores. Haga clic en Next para continuar. No es necesario hacerlo en este momento.
Por último, se le pedirá que configure la función.
Complete los campos correspondientes con la siguiente información:
- Nombre:
GetPetInfo
- Entorno de ejecución: Node.js 6.10
Pegue el siguiente código en el área Lambda function code para leer la información de la mascota desde la tabla de DynamoDB.
var AWS = require('aws-sdk');
var DOC = require('dynamodb-doc');
var dynamo = new DOC.DynamoDB();
exports.handler = function(event, context) {
var cb = function(err, data) {
if(err) {
console.log('error on GetPetsInfo: ',err);
context.done('Unable to retrieve pet information', null);
} else {
if(data.Item && data.Item.pets) {
context.done(null, data.Item.pets);
} else {
context.done(null, {});
}
}
};
dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, cb);
};
En Role, seleccione Choose an existing role. A continuación, elija APIGatewayLambdaExecRole como Existing Role. Deje todas las demás configuraciones con sus valores predeterminados.
Haga clic en Next para revisar la información proporcionada. Si todo se ve correcto, haga clic en Create function.
Haga clic en Test y deje Input test event con su valor predeterminado (que usa la plantilla Hello World). Cuando finalice la prueba, debería ver una salida vacía ({}) en la sección Execution Result. La tabla está vacía.
Cree la función de AWS Lambda para UpdatePetInfo
Repita las instrucciones que usó para crear la función GetPetInfo, pero utilice el siguiente código para la función:
var AWS = require('aws-sdk');
var DOC = require('dynamodb-doc');
var dynamo = new DOC.DynamoDB();
exports.handler = function(event, context) {
var item = { username:"default",
pets: event.pets || {}
};
var cb = function(err, data) {
if(err) {
console.log(err);
context.fail('unable to update pets at this time');
} else {
console.log(data);
context.done(null, data);
}
};
dynamo.putItem({TableName:"Pets", Item:item}, cb);
};
Pruebe la función: haga clic en el menú desplegable Actions y seleccione Configurar evento de ejemplo. Introduzca lo siguiente como datos de ejemplo y haga clic en Enviar:
{
"pets": [{
"id": 1,
"type": "dog",
"price": 249.99
}]
}
Deberías ver un resultado de retorno vacío ({}).
Vuelve a la función de AWS Lambda GetPetInfo y haz clic en Test de nuevo. Ahora deberías ver una única mascota.
Cree la tercera función de AWS Lambda
Creará una función de AWS Lambda adicional. Aunque esta función no hará nada, es necesaria para el método OPTIONS de CORS, como se describe en una sección posterior.
Siguiendo los pasos descritos anteriormente, cree una función de AWS Lambda llamada NoOp. El código de la función será el siguiente:
exports.handler = function(event, context) {
context.succeed('');
}
En lugar de crear esta tercera función de AWS Lambda, puede optar por crear un método OPTIONS en el API Gateway.
Paso 3. Cree la API de Amazon API Gateway
Creará una API con dos métodos: uno para GET de la información de la mascota y otro para POST de la información de la mascota.
Vaya a la Amazon API Gateway Console y haga clic en Create API. Si es la primera vez que crea una API, en su lugar verá una pantalla en la que se le pedirá hacer clic en Get Started.
Si es la primera vez que crea una API, se le pedirá que cree una API de ejemplo. Haga clic en OK para cerrar la notificación emergente y seleccione el botón de opción New API en lugar de Example API.
Asigne a la API el nombre SecurePets y haga clic en Create API.
Vaya a la pestaña Resources de la API SecurePets y haga clic en la acción Create Resource.
Asigne al recurso el nombre Pets y vuelva a hacer clic en Create Resource.
En el panel izquierdo, seleccione /pets y, a continuación, haga clic en el botón CreateMethod.
En el menú desplegable, seleccione GET y haga clic en el botón con la marca de verificación. Proporcione los siguientes valores de configuración para el método GET:
- Integration type: Lambda Function;
- Lambda Region: la región en la que se encuentra;
- Lambda Function: GetPetInfo.
Haga clic en Save y, cuando se le solicite en la ventana emergente que conceda permisos a la función Lambda, haga clic en OK.
En la ventana Method Execution que aparece a continuación, haga clic en Test.
Debería ver la única mascota devuelta en el cuerpo de la respuesta.
Método: POST de información de mascotas
La creación de la API que se usa para hacer POST de información de mascotas es similar a la de la API que se usa para hacer GET de información de mascotas.
En el panel izquierdo, seleccione /pets y haga clic en CreateMethod.
En el menú desplegable, seleccione POST y haga clic en el botón con la marca de verificación.
En Integration Type, seleccione Lambda Function, luego seleccione la región en la que se encuentra y elija UpdatePetInfo como función Lambda.
Haga clic en Save y luego en OK cuando se le solicite en la ventana emergente conceder permisos a la función Lambda.
Haga clic en Test y pegue lo siguiente en el cuerpo de la solicitud:
{"pets": [
{"id": 1, "type": "dog", "price": 249.99},
{"id": 2, "type": "cat", "price": 124.99}
]
}
Debería ver un resultado vacío ({}).
Vuelva al método GET y haga clic en Test de nuevo para comprobar que el cuerpo de la respuesta indica que hay dos mascotas en la tabla:
[
{
"id": 1,
"price": 249.99,
"type": "dog"
},
{
"id": 2,
"price": 124.99,
"type": "cat"
}
]
En lugar de crear una función de Lambda que no realice ninguna acción, puede crear un método OPTIONS en Amazon API Gateway.
En el panel izquierdo, seleccione /pets y haga clic en CreateMethod. En el menú desplegable, seleccione OPTIONS y haga clic en el botón con la marca de verificación. En Integration Type, seleccione Mock. Haga clic en Save.
Deje el Response Body en blanco y haga clic en Test. Debería recibir un Response Body que indique no data.
En este punto, las funciones de AWS Lambda y los métodos de Amazon API Gateway están definidos sin ninguna configuración de seguridad.