¿Cómo utilizo API Gateway como proxy para otro servicio de AWS?
Quiero usar Amazon API Gateway como proxy para otro servicio de AWS e integrar otros servicios con API Gateway.
Solución
Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores de la AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.
Las API de servicio de AWS son API de REST a las que puedes hacer una solicitud HTTPS. Para integrar otro servicio con API Gateway, crea una solicitud HTTPS desde API Gateway a la API del servicio. Al usar este método, todos los parámetros de la solicitud se asignan correctamente.
En esta resolución se describe un ejemplo de configuración cuando se integra con la API Publish de Amazon Simple Notification Service (Amazon SNS) con API Gateway. Utiliza el siguiente ejemplo como esquema de los métodos que debes utilizar al integrar API Gateway con otros servicios.
Configuración de las herramientas y los recursos necesarios
Configura tu entorno y crea todos los recursos de AWS necesarios para tu caso de uso. Para ver el ejemplo de configuración de Amazon SNS, sigue estos pasos:
-
Crea un tema de Amazon SNS. Anota el nombre de recurso de Amazon (ARN) del tema.
-
Abre la consola de AWS Identity and Access Management (IAM) y, a continuación, crea un rol de ejecución de proxy de servicios de AWS. Para el ejemplo de configuración de Amazon SNS, permite la acción sns:Publish. Para obtener más información, consulta Control y administración del acceso a las API de REST en API Gateway.
-
Para crear una API de REST de API Gateway, usa un recurso de pruebas. Para obtener más información y ejemplos, consulta los tutoriales y talleres sobre Amazon API Gateway.
-
Para importar la API de REST, utiliza el siguiente ejemplo de definición de OpenAPI 2.0 (Swagger):
{ "swagger": "2.0", "info": { "version": "2019-10-09T14:10:24Z", "title": "aws-service-integration" }, "basePath": "/dev", "schemes": [ "https" ], "paths": { "/test": { "post": { "produces": [ "application/json" ], "parameters": [ { "name": "Message", "in": "query", "required": true, "type": "string" }, { "name": "TopicArn", "in": "query", "required": true, "type": "string" } ], "responses": { "200": { "description": "200 response", "schema": { "$ref": "#/definitions/Empty" } } }, "x-amazon-apigateway-integration": { "credentials": "arn:aws:iam::account-id:role/apigateway-sns-role", "uri": "arn:aws:apigateway:your-region:sns:action/Publish", "responses": { "default": { "statusCode": "200" } }, "requestParameters": { "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "requestTemplates": { "application/json": { "Fn::Sub": "Action=Publish&TopicArn=$util.urlEncode('${**YOUR-TOPIC-ARN**}')&Message=$util.urlEncode($input.body)##" } }, "passthroughBehavior": "when_no_match", "httpMethod": "POST", "type": "aws" } } } }, "definitions": { "Empty": { "type": "object", "title": "Empty Schema" } } }Nota: Sustituye arn:aws:iam::account-id:role/apigateway-sns-role por el ARN de tu rol de IAM y YOUR-TOPIC-ARN por el ARN de tu tema de SNS.
La opción anterior preconfigura los ajustes del ejemplo de configuración de Amazon SNS. Para crear tu API de REST, sustituye your-region por tu región de AWS. Para obtener más información, consulta What is OpenAPI? (¿Qué es OpenAPI?) en el sitio web de Swagger.
Obtención de un ejemplo de solicitud HTTPS
Un ejemplo de solicitud HTTPS de la API del servicio que integras puede ayudarte a asignar los parámetros de la solicitud en API Gateway.
Para la API Publish de Amazon SNS, consulta la referencia de la API del servicio para ver un ejemplo de solicitud.
Para obtener una solicitud HTTPS, ejecuta el siguiente ejemplo de solicitud:
https://sns.us-west-2.amazonaws.com/?Action=Publish&TargetArn=arn%3Aaws%3Asns%3Aus-west-2%3A803981987763%3Aendpoint%2FAPNS\_SANDBOX%2Fpushapp%2F98e9ced9-f136-3893-9d60-776547eafebb&Message=%7B%22default%22%3A%22This+is+the+default+Message%22%2C%22APNS\_SANDBOX%22%3A%22%7B+%5C%22aps%5C%22+%3A+%7B+%5C%22alert%5C%22+%3A+%5C%22You+have+got+email.%5C%22%2C+%5C%22badge%5C%22+%3A+9%2C%5C%22sound%5C%22+%3A%5C%22default%5C%22%7D%7D%22%7D &Version=2010-03-31 &AUTHPARAMS
Alternativa:
Genera el ejemplo a partir de una llamada a la API. Utiliza la AWS CLI para llamar a la API del servicio y, a continuación, analiza el resultado. Determina el comando de AWS CLI asociado para la API del servicio con la que se va a integrar y, a continuación, ejecuta una solicitud de prueba con la opción —debug.
Para generar un ejemplo a partir de una llamada a la API, ejecuta el siguiente comando publish:
aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug
Nota: Sustituye arn:aws:sns:us-east-1:123456789012:test por el ARN de tu tema de Amazon SNS.
Resultado de ejemplo:
2018-11-22 11:56:39,647 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: sns2018-11-22 11:56:39,648 - MainThread - botocore.hooks - DEBUG - Event before-parameter-build.sns.Publish: calling handler <function generate\_idempotent\_uuid at 0x11093d320>2018-11-22 11:56:39,649 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=Publish) (verify\_ssl=True) with params: {'body': {'Action': u'Publish', u'Message': u'hello', 'Version': u'2010-03-31', u'TopicArn': u'arn:aws:sns:us-east-1:123456789012:test'}, 'url': u'https://sns.us-east-1.amazonaws.com/', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.15.74 Python/2.7.14 Darwin/16.7.0 botocore/1.9.23'}, 'context': {'auth\_type': None, 'client\_region': 'us-east-1', 'has\_streaming\_input': False, 'client\_config': <botocore.config.Config object at 0x1118437d0>}, 'query\_string': '', 'url\_path': '/', 'method': u'POST'} 2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event request-created.sns.Publish: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x111843750>> 2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event choose-signer.sns.Publish: calling handler <function set\_operation\_specific\_signer at 0x11093d230> 2018-11-22 11:56:39,650 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth. 2018-11-22 11:56:39,651 - MainThread - botocore.auth - DEBUG - CanonicalRequest: POST / content-type:application/x-www-form-urlencoded; charset=utf-8 host:sns.us-east-1.amazonaws.com x-amz-date:20181122T062639Z content-type;host;x-amz-date
El resultado contiene la solicitud HTTPS, los encabezados pasados y la solicitud es un método HTTP POST.
Creación de un método para la API de API Gateway
Sigue estos pasos:
- Abre la consola de API Gateway.
- En el panel de navegación, elige API y, a continuación, elige el nombre de tu API.
- En el panel Recursos, selecciona un recurso. Para el ejemplo de configuración de Amazon SNS, elige el recurso de prueba que has creado.
- Selecciona Crear método.
- En la nueva ventana:
Elige el método que usa tu API de servicio en la solicitud HTTPS de ejemplo.
Para el ejemplo de configuración de Amazon SNS, elige POST.
En Tipo de integración, elige Servicio de AWS.
En Región de AWS, elige la región de AWS del recurso asociado a la API del servicio que se va a integrar.
Para el ejemplo de configuración de Amazon SNS, elige la región de tu tema de SNS.
En Servicio de AWS, elige el servicio que se va a integrar con API Gateway. Por ejemplo, utiliza el servicio Simple Notification Service (SNS).
En Subdominio de AWS, introduce el subdominio que utiliza el servicio de AWS. Consulta la documentación del servicio para confirmar la disponibilidad de un subdominio.
Para el ejemplo de configuración de Amazon SNS, deja el campo en blanco.
En Método HTTP, elige el método que corresponda a la API de servicio de AWS con la que te integras.
Para el ejemplo de configuración de Amazon SNS, elige POST.
En Tipo de acción, si la API de servicio que integras es una acción compatible, selecciona Usar nombre de acción. Consulta la referencia de la API del servicio para obtener una lista de las acciones admitidas.
Para Amazon SNS, consulta Actions (Acciones).
En Acción, introduce el nombre de la API del servicio. Para el ejemplo de configuración de Amazon SNS, introduce Publish.
Alternativa:
En Tipo de acción, si la API del servicio de AWS espera una ruta de recursos en tu solicitud, elige Usar sustitución de ruta. Por ejemplo, para la API ListLexicons de Amazon Polly, introduce /v1/lexicons en Sustitución de ruta (opcional).
En Rol de ejecución, introduce el ARN del rol de IAM que has creado. - Selecciona Crear método.
Creación de parámetros para la solicitud de método
Determina los parámetros de solicitud obligatorios y opcionales para la API del servicio con la que te integras. Para identificar estos parámetros, consulta el ejemplo de solicitud HTTPS mostrado anteriormente o consulta la Referencia de API de la API del servicio. Por ejemplo, consulta Publish (Publicación).
Sigue estos pasos:
- Abre la consola de API Gateway.
- En el panel de navegación, elige API y, a continuación, elige el nombre de tu API.
- En la página Recursos, elige tu tipo de método.
- Selecciona la pestaña Solicitud de método y, a continuación, elige Editar.
- Elige la lista desplegable del validador de solicitudes y elige Validar el cuerpo, los parámetros de cadena y los encabezados.
- En Parámetros de cadena de consulta URL, selecciona Agregar cadena de consulta.
- En Nombre, introduce el nombre de un parámetro de solicitud para la API del servicio con la que te integras. Para el ejemplo de configuración de Amazon SNS, crea un parámetro denominado TopicArn y otro denominado Message.
- (Opcional) Si el parámetro es obligatorio, marca la casilla de verificación junto a Obligatorio.
- Selecciona Guardar.
Para obtener más información, consulta Configuración de un método con la consola de API Gateway.
Nota: Para algunas API de servicio, debes enviar los encabezados y el cuerpo necesarios en la solicitud de integración, además de los parámetros obligatorios. Puedes crear los encabezados y el cuerpo en el panel Solicitud de integración, en Encabezados de solicitud HTTP y Cuerpo de solicitud.
Por ejemplo, si vas a integrar la API ListCollections de Amazon Rekognition, crea el encabezado X-Amz-Target: RekognitionService.ListCollections.
Ejemplo de solicitud de código:
POST https://rekognition.us-west-2.amazonaws.com/ HTTP/1.1 Host: rekognition.us-west-2.amazonaws.com Accept-Encoding: identity Content-Length: 2 X-Amz-Target: RekognitionService.ListCollections X-Amz-Date: 20170105T155800Z User-Agent: aws-cli/1.11.25 Python/2.7.9 Windows/8 botocore/1.4.82 Content-Type: application/x-amz-json-1.1 Authorization: AWS4-HMAC-SHA256 Credential=XXXXXXXX/20170105/us-west-2/rekognition/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature=XXXXXXXX {}
Si integras la API SendMessage de Amazon Simple Queue Service (Amazon SQS), asigna el cuerpo de la solicitud mediante la expresión de asignación method.request.body.JSONPath_EXPRESSION. (Sustituye JSONPath_EXPRESSION por una expresión JSONPath para un campo JSON del cuerpo de la solicitud)
Ejemplo de solicitud de código:
{'url_path': '/', 'query_string': '', 'method': 'POST','headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.16.81 Python/3.6.5 Darwin/18.7.0 botocore/1.12.183'}, 'body': {'Action': 'SendMessage', 'Version': '2012-11-05', 'QueueUrl': 'https://sqs.ap-southeast-2.amazonaws.com/123456789012/test01', 'MessageBody': 'Hello'}, 'url': 'https://ap-southeast-2.queue.amazonaws.com/', 'context': {'client_region': 'ap-southeast-2', 'client_config': <botocore.config.Config object at 0x106862da0>, 'has_streaming_input': False, 'auth_type': None}}
Creación de parámetros para la solicitud de integración
Asigna los parámetros que creaste para la solicitud de método a los parámetros de la solicitud de integración.
Sigue estos pasos:
- Abre la consola de API Gateway.
- En el panel de navegación, elige API y, a continuación, elige el nombre de tu API.
- En la página Recursos, elige tu tipo de método.
- Selecciona la pestaña Solicitud de integración y, a continuación, elige Editar.
- Amplía los parámetros de cadena de consulta URL y, a continuación, elige Agregar parámetro de cadena de consulta.
- En Nombre, introduce el nombre de un parámetro de solicitud para la API del servicio con la que te integras.
Nota: El nombre distingue entre mayúsculas y minúsculas y debe aparecer exactamente como lo requiere la API del servicio. - En Asignación de, escribe method.request.querystring.param_name. Reemplaza param_name por el nombre del parámetro correspondiente que creaste para la solicitud de método. Por ejemplo, method.request.querystring.TopicArn.
- Crea parámetros para la solicitud de integración que correspondan a cada uno de los parámetros que creaste para la solicitud de método.
- Selecciona Guardar.
Nota: Si creaste los encabezados y el cuerpo necesarios para la solicitud de método, asígnalos también a la solicitud de integración. Para crear los encabezados y el cuerpo necesarios para la solicitud de método, ve al panel de solicitud de integración, en **Encabezados HTTP ** y Plantillas de asignación.
Para obtener más información, consulta Configuración de una solicitud de integración de la API mediante la consola de API Gateway.
(Opcional) Comprobación de la configuración de la integración
Para comprobar que la configuración de la integración está configurada correctamente, ejecuta el siguiente comando get-integration:
aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST
Para la configuración de ejemplo de Amazon SNS, el resultado es similar al siguiente ejemplo de código:
{ "integrationResponses": { "200": { "responseTemplates": { "application/json": null }, "statusCode": "200" } }, "passthroughBehavior": "WHEN_NO_MATCH", "timeoutInMillis": 29000, "uri": "arn:aws:apigateway:us-east-2:sns:action/Publish", "httpMethod": "POST", "cacheNamespace": "y9h6rt", "credentials": "arn:aws:iam::1234567890:role/apigateway-sns-role", "type": "AWS", "requestParameters": { "integration.request.querystring.TopicArn": "method.request.querystring.TopicArn", "integration.request.querystring.Message": "method.request.querystring.Message" }, "cacheKeyParameters": [] }
Para cargas útiles de mensajes más grandes, ejecuta la siguiente integración de Amazon SNS en tu API:
"requestParameters": { "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "requestTemplates" : { "application/json" : "Action=Publish&TopicArn=$util.urlEncode('<ourTopicArn>')&Message=$util.urlEncode($input.body)" }
Nota: Amazon SNS admite el tamaño máximo de encabezado de 16 KB. Antes de enviar la solicitud a tu integración, usa una plantilla de asignación de solicitudes para convertir una solicitud HTTP entrante a un formato diferente. Como el ARN del tema de Amazon SNS está codificado en la plantilla de asignación, los clientes no pasan por el ARN del tema de SNS en su solicitud.
Para comprobar la configuración de la integración, sigue estos pasos:
- Abre la consola de API Gateway.
- En el panel de navegación, elige API y, a continuación, elige el nombre de tu API.
- En la página Recursos, elige el tipo de método y, a continuación, elige la pestaña Prueba.
- En la página Método de prueba, sigue estos pasos:
En Cadenas de consulta, introduce una cadena de consulta que incluya los parámetros y valores de las cadenas de la solicitud.
Para la integración con Amazon SNS, introduce TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello". Sustituye arn:aws:sns:us-east-1:123456789012:test por el ARN de tu tema de Amazon SNS.
Para la integración de Amazon SNS que utiliza la plantilla de asignación, introduce los datos JSON de la carga útil del mensaje en el cuerpo de la solicitud y, a continuación, selecciona Probar.
Nota: La carga útil varía en función de la configuración. - Cuando recibas una respuesta correcta, despliega tu API de REST.
Información relacionada
Tutorial: Creación de una API de REST con una integración de AWS
Métodos de API de REST en API Gateway
Integraciones para las API de REST en API Gateway
Ejemplos de asignación de parámetros para las API de REST en API Gateway
- Etiquetas
- Amazon API Gateway
- Idioma
- Español

Contenido relevante
- preguntada hace 5 meses
- preguntada hace un año
- Respuesta aceptadapreguntada hace un año