> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Paso 1 del tutorial de Amazon API Gateway

# Paso 1 del tutorial de AWS API Gateway

<Warning>
  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.
</Warning>

<div id="step-1-set-up-the-amazon-api-gateway">
  ## Paso 1: Configurar Amazon API Gateway
</div>

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](https://nodejs.org/).

<div id="step-1-create-the-amazon-dynamodb-table">
  ### Paso 1. Cree la tabla de Amazon DynamoDB
</div>

En la [consola de Amazon DynamoDB](https://console.aws.amazon.com/dynamodb), haga clic en **Create Table**.

<Frame>
  <img src="https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/2ZPhi7Ddx4TznSXEEhUSDK/52a06412f7c5e6d0ef0d13c6ffe17611/dynamodb-create-table.png?fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=643f89a15f3cf6cac0ae04774466ed0e" alt="Consola de DynamoDB - Create Table" width="750" height="579" data-path="docs/images/cdy7uua7fh8z/2ZPhi7Ddx4TznSXEEhUSDK/52a06412f7c5e6d0ef0d13c6ffe17611/dynamodb-create-table.png" />
</Frame>

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

<Frame>
  <img src="https://mintcdn.com/translations/6GE5Z24GDCZehiJ9/docs/images/cdy7uua7fh8z/6MYJV97Xa3DxajG8DYj2dx/e428ab2ce137176d7771c61a9c528f7c/configure-newly-created-table.png?fit=max&auto=format&n=6GE5Z24GDCZehiJ9&q=85&s=baf9b40373cd0537223be38a54d49a20" alt="Consola de DynamoDB - Configurar la tabla recién creada" width="750" height="579" data-path="docs/images/cdy7uua7fh8z/6MYJV97Xa3DxajG8DYj2dx/e428ab2ce137176d7771c61a9c528f7c/configure-newly-created-table.png" />
</Frame>

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.

<Frame>
  <img src="https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4ZFemddtUD8tRi0NUvzXJ2/38abd951974cad385ef7417f48adf359/table-arn.png?fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=24bcfbd52797659d29f8dea427662a87" alt="Consola de DynamoDB - Detalles de la tabla - Amazon Resource Name" width="750" height="579" data-path="docs/images/cdy7uua7fh8z/4ZFemddtUD8tRi0NUvzXJ2/38abd951974cad385ef7417f48adf359/table-arn.png" />
</Frame>

<div id="step-2-create-the-policy-that-grants-aws-lambda-functions-access-to-the-dynamodb-pets-table">
  ### Paso 2. Cree la política que otorga a las funciones de AWS Lambda acceso a la tabla Pets de DynamoDB
</div>

Vaya a la [Consola de IAM de AWS](https://console.aws.amazon.com/iam).

Haga clic en **Roles** en el menú de la izquierda y, a continuación, en el botón **Create New Role**.

<Frame>
  <img src="https://mintcdn.com/translations/pvjQqAy3EB2TK6NP/docs/images/cdy7uua7fh8z/4mgCTXLpycHLA8RbYoEFim/5d9eb81be979355aa9cd10d476ead515/roles.png?fit=max&auto=format&n=pvjQqAy3EB2TK6NP&q=85&s=0d513d49c01b6a37861cee6ee2b626d4" alt="Consola de IAM: Roles - Create New Roles" width="750" height="579" data-path="docs/images/cdy7uua7fh8z/4mgCTXLpycHLA8RbYoEFim/5d9eb81be979355aa9cd10d476ead515/roles.png" />
</Frame>

Asigne al rol el nombre `APIGatewayLambdaExecRole` y haga clic en **Next Step**.

Seleccione el tipo de rol. En AWS Service Roles, seleccione AWS Lambda.

<Frame>
  <img src="https://mintcdn.com/translations/Dcx0M11uuptU53TX/docs/images/cdy7uua7fh8z/326kKGbahlvIwVFTi61Gfw/026d1fc0c8c6e3a489ec4fb840f551da/select-role-type.png?fit=max&auto=format&n=Dcx0M11uuptU53TX&q=85&s=cfa904c250950a7cff142f70a2d082e3" alt="Consola de IAM: Seleccione el tipo de rol - Service Roles - AWS Lambda" width="750" height="579" data-path="docs/images/cdy7uua7fh8z/326kKGbahlvIwVFTi61Gfw/026d1fc0c8c6e3a489ec4fb840f551da/select-role-type.png" />
</Frame>

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**.

```json lines theme={null}
{
  "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"]
    }
   ]
}
```

<div id="step-2-create-the-aws-lambda-functions">
  ### Paso 2. Cree las funciones de AWS Lambda
</div>

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.

<div id="create-the-lambda-function-for-getpetinfo">
  #### Cree la función de AWS Lambda para GetPetInfo
</div>

En la [consola de AWS Lambda](https://console.aws.amazon.com/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.

```javascript lines theme={null}
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.

<div id="create-the-lambda-function-for-updatepetinfo">
  #### Cree la función de AWS Lambda para UpdatePetInfo
</div>

Repita las instrucciones que usó para crear la función `GetPetInfo`, pero utilice el siguiente código para la función:

```javascript lines theme={null}
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**:

```json lines theme={null}
{
  "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.

<div id="create-the-third-lambda-function">
  #### Cree la tercera función de AWS Lambda
</div>

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:

```js lines theme={null}
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](#method-options) en el API Gateway.

<div id="step-3-create-the-amazon-api-gateway-api">
  ### Paso 3. Cree la API de Amazon API Gateway
</div>

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.

<div id="method-get-pet-information">
  #### Método: GET Pet Information
</div>

Vaya a la [Amazon API Gateway Console](https://console.aws.amazon.com/apigateway) 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.

<div id="method-post-pet-information">
  #### Método: POST de información de mascotas
</div>

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:

```json lines theme={null}
{"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:

```json lines theme={null}
[
  {
    "id": 1,
    "price": 249.99,
    "type": "dog"
  },
  {
    "id": 2,
    "price": 124.99,
    "type": "cat"
  }
]
```

<div id="method-options">
  #### Método: OPTIONS
</div>

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.
