

# Tutorial: Creación de una API de REST como proxy de Amazon S3
<a name="integrating-api-with-aws-services-s3"></a>

Para ilustrar cómo usar una API de REST en API Gateway como proxy de Amazon S3, en esta sección se describe cómo crear y configurar una API de REST para exponer las siguientes operaciones de Amazon S3: 
+ Exponer GET en el recurso raíz de la API para [enumerar todos los buckets de Amazon S3 de un intermediario](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html).
+ Exponer GET en un recurso de carpeta para [ver una lista de todos los objetos de un bucket de Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html).
+ Exponer GET en un recurso de carpeta o elemento para [ver o descargar un objeto de un bucket de Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).

 Es posible que desee importar la API de ejemplo como proxy de Amazon S3, tal y como se muestra en [Definiciones de OpenAPI de la API de ejemplo como un proxy de Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md). Este ejemplo contiene métodos más expuestos. Para obtener instrucciones sobre cómo importar una API mediante la definición de OpenAPI, consulte [Desarrollo de API de REST mediante OpenAPI en API Gateway](api-gateway-import-api.md).

**nota**  
 Para integrar su API de API Gateway con Amazon S3, debe elegir una región en la que estén disponibles los servicios API Gateway y Amazon S3. Para obtener información sobre la disponibilidad en función de la región, consulte [Cuotas y puntos de conexión de Amazon API Gateway](https://docs.aws.amazon.com/general/latest/gr/apigateway.html). 

**Topics**
+ [Configurar permisos de IAM para que la API invoque acciones de Amazon S3](#api-as-s3-proxy-iam-permissions)
+ [Crear recursos de API para representar recursos de Amazon S3](#api-as-s3-proxy-create-resources)
+ [Exponer un método de API para enumerar los buckets de Amazon S3 del intermediario](#api-root-get-as-s3-get-service)
+ [Exponer métodos de API para tener acceso a un bucket de Amazon S3](#api-folder-operations-as-s3-bucket-actions)
+ [Exponer métodos de API para tener acceso a un objeto de Amazon S3 en un bucket](#api-items-in-folder-as-s3-objects-in-bucket)
+ [Definiciones de OpenAPI de la API de ejemplo como un proxy de Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md)
+ [Llamada a la API mediante un cliente API de REST](api-as-s3-proxy-test-using-postman.md)

## Configurar permisos de IAM para que la API invoque acciones de Amazon S3
<a name="api-as-s3-proxy-iam-permissions"></a>

 Para permitir que la API invoque las acciones de Amazon S3, debe tener las políticas de IAM adecuadas asociadas a un rol de IAM. En este paso, deberá crear un nuevo rol de IAM.

**Para crear el rol de ejecución del proxy de servicio de AWS**

1. Inicie sesión en Consola de administración de AWS y abra la consola IAM en [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Elija **Roles**.

1. Elija **Creación de rol**.

1.  Elija **Servicio de AWS** en **Seleccionar el tipo de entidad de confianza** y, a continuación, elija **API Gateway** y seleccione **Permite que API Gateway envíe registros a CloudWatch Logs**.

1.  Seleccione **Siguiente** y de nuevo **Siguiente**.

1. En **Nombre de rol**, escriba **APIGatewayS3ProxyPolicy** y luego elija **Crear rol**.

1. En la lista **Roles**, elija el rol que acaba de crear. Puede que tenga que desplazarse o usar la barra de búsqueda para encontrar el rol.

1. Para el rol seleccionado, seleccione la pestaña **Agregar permisos**.

1. Elija **Adjuntar políticas** en la lista desplegable.

1. En la barra de búsqueda, escriba **AmazonS3FullAccess** y, a continuación, elija **Añadir permisos**. 
**nota**  
Para simplificar el proceso, este tutorial utiliza una política administrada. Como práctica recomendada, se deben crear políticas de IAM propias para otorgar los permisos mínimos requeridos. 

1. Anote el **ARN del rol** recién creado, ya que lo usará más adelante.

## Crear recursos de API para representar recursos de Amazon S3
<a name="api-as-s3-proxy-create-resources"></a>

Debe utilizar el recurso raíz (`/`) de la API como contenedor de buckets de Amazon S3 de un intermediario autenticado. También debe crear los recursos `Folder` y `Item` para representar un bucket de Amazon S3 determinado y un objeto de Amazon S3 determinado, respectivamente. El intermediario especificará el nombre de carpeta y la clave de objeto en forma de parámetros de ruta como parte de la URL de una solicitud. 

**nota**  
Al acceder a los objetos cuya clave de objeto incluye `/` o cualquier otro carácter especial, el carácter estar codificado en la URL. Por ejemplo, `test/test.txt` deben codificarse en `test%2Ftest.txt`.

**Para crear un recurso de API que exponga las características del servicio Amazon S3**

1.  En la misma Región de AWS que creó el bucket de Amazon S3, cree una API llamada **MyS3**. Este recurso raíz de la API (**/**) representa el servicio Amazon S3. En este paso, creará dos recursos adicionales,**/{folder}** y **/{item}**.

1. Elija **Crear recurso**.

1. Mantenga **Recurso proxy** desactivado. 

1. En **Ruta de recurso**, seleccione `/`.

1. En **Nombre del recurso**, escriba **{folder}**.

1. Mantenga desactivado **CORS (uso compartido de recursos entre orígenes)**.

1. Elija **Crear recurso**.

1. Seleccione el recurso **/{folder}** y, a continuación, elija **Crear recurso**.

1. Siga los pasos anteriores para crear un recurso secundario de **/{folder}** denominado **{item}**.

   Su API final debería parecerse a la siguiente:

      
![Crear una API en API Gateway como proxy de Amazon S3](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/aws_proxy_s3_create_api-resources_new_console.png)

## Exponer un método de API para enumerar los buckets de Amazon S3 del intermediario
<a name="api-root-get-as-s3-get-service"></a>

Obtener la lista de buckets de Amazon S3 del intermediario implica invocar la acción [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) en Amazon S3. En el recurso raíz de la API, (**/**), cree el método GET. Configure el método GET para realizar la integración con Amazon S3, tal y como se indica a continuación. 

**Para crear e inicializar el método `GET /` de la API**

1. Seleccione el recurso **/** y, a continuación, elija **Crear método**. 

1. En el tipo de método, seleccione **GET**.

1. En **Tipo de integración**, seleccione **Servicio de AWS**.

1. Para **Región de AWS**, seleccione la Región de AWS donde creó su bucket de Amazon S3. 

1. Para **Servicio de AWS**, elija **Amazon Simple Storage Service**.

1. Deje **Subdominio de AWS** en blanco.

1. En **Método HTTP**, seleccione **GET**.

1. En **Tipo de acción**, elija **Usar sustitución de ruta**.

   Al anular la ruta, API Gateway reenvía la solicitud del cliente a Amazon S3 como la [solicitud del tipo de ruta de la API de REST de Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAPI.html) correspondiente, en la cual un recurso de Amazon S3 se expresa por la ruta de recursos del patrón `s3-host-name/bucket/key`. API Gateway establece el `s3-host-name` y transmite el `bucket` y la `key` especificados por el cliente a Amazon S3.

1. En **Sustitución de ruta**, escriba **/**.

1. En **Rol de ejecución**, escriba el ARN del rol para **APIGatewayS3ProxyPolicy**.

1. Elija **Configuración de solicitud de método**.

   Debe utilizar la configuración de solicitud de método para controlar quién puede llamar a este método de la API.

1. En **Autorización**, en el menú desplegable, seleccione `AWS_IAM`.

      
![Declarar tipos de respuestas de método](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/aws_proxy_s3_setup_method_request_authorization_new_console.png)

1. Elija **Crear método**.

Esta configuración integra la solicitud `GET https://{{your-api-host}}/{{stage}}/` del frontend con la solicitud `GET https://{{your-s3-host}}/` del backend.

 Para que la API devuelva respuestas correctas y excepciones al intermediario, debe declarar las respuestas 200, 400 y 500 en **Respuesta de método**. Debe utilizar la asignación predeterminada para las respuestas 200, de forma que las respuestas del backend del código de estado no declarado aquí se devuelvan al intermediario como respuestas 200. 

**Para declarar tipos de respuestas para el método `GET /`**

1.  En la pestaña **Respuesta del método**, en **Respuesta 200**, elija **Editar**.

1. Elija **Añadir encabezado** y haga lo siguiente:

   1. En **Nombre de encabezado**, escriba **Content-Type**.

   1. Elija **Agregar encabezado**.

   Repita estos pasos para crear un encabezado **Timestamp** y un encabezado **Content-Length**.

1. Seleccione **Save**.

1. En la pestaña **Método de respuesta**, en **Respuestas de método**, seleccione **Crear respuesta**.

1. En **Código de estado HTTP**, introduzca **400**.

   No establezca ningún encabezado para esta respuesta.

1. Seleccione **Save**.

1. Repita los pasos siguientes para crear la respuesta 500.

   No establezca ningún encabezado para esta respuesta.

Como la respuesta de integración correcta de Amazon S3 devuelve la lista de buckets como una carga XML y la respuesta de método predeterminada de API Gateway devuelve una carga JSON, debe mapear el valor del parámetro del encabezado Content-Type del backend con su homólogo en el frontend. De lo contrario, el cliente recibirá `application/json` para el tipo de contenido cuando el cuerpo de la respuesta sea en realidad una cadena XML. El siguiente procedimiento muestra cómo realizar esta configuración. Además, también quiere mostrar al cliente otros parámetros de encabezado, como Date y Content-Length. 

**Para configurar asignaciones de encabezado de respuesta para el método GET /**

1. En la pestaña **Respuesta de integración**, en **Predeterminado: respuesta**, seleccione **Editar**.

1. Para el encabezado **Content-Length**, introduzca **integration.response.header.Content-Length** en el valor de mapeo.

1. Para el encabezado **Content-Type**, introduzca **integration.response.header.Content-Type** en el valor de mapeo.

1. Para el encabezado **Timestamp**, introduzca **integration.response.header.Date** en el valor de mapeo.

1. Seleccione **Save**. El resultado debería ser similar al siguiente:

      
![Asignar encabezados de respuesta de integración a encabezados de respuesta de método](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/aws_proxy_s3_setup_integration_response_headers_new_console.png)

1. En la pestaña **Respuesta de integración**, en **Respuestas de integración**, seleccione **Crear respuesta**.

1. En **Expresión regular de estado de HTTP**, escriba **4\\d{2}**. Esto asigna todos los códigos de estado de respuesta HTTP 4xx a la respuesta del método.

1. En **Código de estado de respuesta del método**, seleccione **400**.

1. Seleccione **Crear**.

1. Repita los siguientes pasos para crear una respuesta de integración para la respuesta del método 500. En **Expresión regular de estado de HTTP**, escriba **5\\d{2}**.

Como práctica recomendada, puede probar la API tal y como está configurada de momento.

**Para probar el método `GET /`**

1. Elija la pestaña **Prueba**. Puede que tenga que elegir el botón de flecha hacia la derecha para mostrar la pestaña.

1. Seleccione **Probar** El resultado debe ser similar al de la siguiente imagen:

      
![Probar el resultado de GET Bucket de la raíz de la API](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/aws_proxy_s3_test_root_get_result_new_console.png)

## Exponer métodos de API para tener acceso a un bucket de Amazon S3
<a name="api-folder-operations-as-s3-bucket-actions"></a>

Para trabajar con un bucket de Amazon S3, exponga el método `GET` en el recurso /{folder} para mostrar los objetos de un bucket. Las instrucciones son similares a las que se describen en [Exponer un método de API para enumerar los buckets de Amazon S3 del intermediario](#api-root-get-as-s3-get-service). Para ver más métodos, puede importar la API de ejemplo aquí, [Definiciones de OpenAPI de la API de ejemplo como un proxy de Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md).

**Para exponer el método GET en un recurso de carpeta**

1. Seleccione el recurso **/{folder}** y, a continuación, elija **Crear método**. 

1. En el tipo de método, seleccione **GET**.

1. En **Tipo de integración**, seleccione **Servicio de AWS**.

1. Para **Región de AWS**, seleccione la Región de AWS donde creó su bucket de Amazon S3. 

1. Para **Servicio de AWS**, elija **Amazon Simple Storage Service**.

1. Deje **Subdominio de AWS** en blanco.

1. En **Método HTTP**, seleccione **GET**.

1. En **Tipo de acción**, elija **Usar sustitución de ruta**.

1. En **Sustitución de ruta**, escriba **{bucket}**.

1. En **Rol de ejecución**, escriba el ARN del rol para **APIGatewayS3ProxyPolicy**.

1. Elija **Crear método**.

Establezca el parámetro de ruta `{folder}` en la URL del punto de conexión de Amazon S3. Debe mapear el parámetro de ruta `{folder}` de la solicitud de método al parámetro de ruta `{bucket}` de la solicitud de integración.

**Para mapear `{folder}` a `{bucket}`:**

1.  En la pestaña **Solicitud de integración**, en **Configuración de la solicitud de integración**, seleccione **Editar**. 

1. Elija **Parámetros de la ruta URL** y, a continuación, elija **Agregar parámetro de ruta**.

1. En **Nombre**, escriba **bucket**.

1. En **Asignado desde**, introduzca **method.request.path.folder**.

1. Seleccione **Save**.

Ahora, pruebe la API. 

**Para probar el método `/{folder} GET`**

1. Elija la pestaña **Prueba**. Puede que tenga que elegir el botón de flecha hacia la derecha para mostrar la pestaña.

1. En **Ruta**, para la **carpeta**, introduzca el nombre de tu bucket.

1. Seleccione **Probar**

   El resultado de la prueba incluirá una lista de los objetos del bucket.

      
![Pruebe el método GET para crear un bucket de Amazon S3.](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/aws_proxy_s3_test_api_folder_get_new_console.png)

## Exponer métodos de API para tener acceso a un objeto de Amazon S3 en un bucket
<a name="api-items-in-folder-as-s3-objects-in-bucket"></a>

Amazon S3 admite las acciones GET, DELETE, HEAD, OPTIONS, POST y PUT para acceder a objetos de un bucket determinado y administrarlos. En este tutorial, expondrá un método `GET` del recurso `{folder}/{item}` para obtener una imagen de un bucket. Para ver más aplicaciones del recurso `{folder}/{item}`, consulte la API de ejemplo, [Definiciones de OpenAPI de la API de ejemplo como un proxy de Amazon S3](api-as-s3-proxy-export-swagger-with-extensions.md).

**Para exponer el método GET en un recurso de elemento**

1. Seleccione el recurso **/{item}** y, a continuación, elija **Crear método**. 

1. En el tipo de método, seleccione **GET**.

1. En **Tipo de integración**, seleccione **Servicio de AWS**.

1. Para **Región de AWS**, seleccione la Región de AWS donde creó su bucket de Amazon S3. 

1. Para **Servicio de AWS**, elija **Amazon Simple Storage Service**.

1. Deje **Subdominio de AWS** en blanco.

1. En **Método HTTP**, seleccione **GET**.

1. En **Tipo de acción**, elija **Usar sustitución de ruta**.

1. En **Sustitución de ruta**, introduzca **{bucket}/{object}**.

1. En **Rol de ejecución**, escriba el ARN del rol para **APIGatewayS3ProxyPolicy**.

1. Elija **Crear método**.

Establezca los parámetros de ruta `{folder}` y `{item}` en la URL del punto de conexión de Amazon S3. Debe mapear el parámetro de ruta de la solicitud de método al parámetro de ruta de la solicitud de integración.

En este paso, hará lo siguiente:
+ Mapee el parámetro de ruta `{folder}` de la solicitud de método al parámetro de ruta `{bucket}` de la solicitud de integración.
+ Mapee el parámetro de ruta `{item}` de la solicitud de método al parámetro de ruta `{object}` de la solicitud de integración.

**Para mapear `{folder}` a `{bucket}` y `{item}` a `{object}`**

1.  En la pestaña **Solicitud de integración**, en **Configuración de la solicitud de integración**, seleccione **Editar**. 

1. Elija los **Parámetros de la ruta URL**.

1. Elija **Añadir parámetro de ruta**.

1. En **Nombre**, escriba **bucket**.

1. En **Asignado desde**, introduzca **method.request.path.folder**.

1. Elija **Añadir parámetro de ruta**.

1. En **Nombre**, escriba **object**.

1. En **Asignado desde**, introduzca **method.request.path.item**.

1. Seleccione **Save**.

**Para probar el método `/{folder}/{object} GET`**

1. Elija la pestaña **Prueba**. Puede que tenga que elegir el botón de flecha hacia la derecha para mostrar la pestaña.

1. En **Ruta**, para la **carpeta**, introduzca el nombre de tu bucket.

1. En **Ruta**, para el **elemento**, introduzca el nombre de un elemento.

1. Seleccione **Probar**

   El cuerpo de la respuesta incluirá el contenido del elemento.

      
![Pruebe el método GET para crear un bucket de Amazon S3.](http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/images/aws_proxy_s3_test_api_item_get_new_console.png)

   La solicitud devuelve correctamente el texto sin formato ("Hello world") como el contenido del archivo especificado (test.txt) en el bucket de Amazon S3 indicado (amzn-s3-demo-bucket).

 Para descargar o cargar archivos binarios, que en API Gateway se considera cualquier cosa que no sea contenido JSON codificado en UTF-8, es necesaria una configuración adicional de la API. Esto se detalla de la siguiente manera: 

**Descargar o cargar archivos binarios de S3**

1.  Registrar los tipos de archivo del archivo afectado en los tipos "binaryMediaTypes" de la API. Puede hacer lo siguiente en la consola: 

   1. Elija **Configuración de API** para la API.

   1. En **Tipos de medios binarios**, seleccione **Gestionar tipos de medios**.

   1. Seleccione **Añadir tipo de medio binario** y, a continuación, introduzca el tipo de medio requerido, por ejemplo, `image/png`.

   1. Elija **Guardar cambios**, para guardar la configuración.

1. Añada las cabeceras `Content-Type` (para cargar) y/o `Accept` (para descargar) a la solicitud del método para exigir que el cliente especifique el tipo de medios binarios necesarios y asignarlos a la solicitud de integración.

1. Establezca la opción **Content Handling (Tratamiento de contenido)** en `Passthrough` en la solicitud de integración (para cargar) y en una respuesta de integración (para descargar). Asegúrese de que no se define ninguna plantilla de mapeo para el tipo de contenido afectado. Para obtener más información, consulte [Transformaciones de datos para las API de REST en API Gateway](rest-api-data-transformations.md).

El límite de tamaño de carga es 10 MB. Consulte [Cuotas para configurar y ejecutar una API de REST en API Gateway](api-gateway-execution-service-limits-table.md).

Asegúrese de que los archivos en Amazon S3 incluyen los tipos de contenido correctos en los metadatos. Para contenido multimedia que se puede transmitir, es posible que los metadatos deban incluir `Content-Disposition:inline`.

Para obtener más información sobre la compatibilidad con datos binarios en API Gateway, consulte [Conversiones de tipo de contenido en API Gateway](api-gateway-payload-encodings-workflow.md).