¿Cómo utilizo API Gateway como proxy para otro servicio de AWS?

12 minutos de lectura
0

Quiero usar Amazon API Gateway como proxy para otro servicio de AWS e integrar otros servicios con API Gateway.

Descripción breve

Las API de servicio de AWS son básicamente API de REST a las que puede hacer una solicitud HTTPS. Puede integrar muchos servicios de AWS con API Gateway, pero la configuración y la asignación varían en función de la API del servicio en particular.

Para integrar otro servicio con API Gateway, cree una solicitud HTTPS desde API Gateway a la API del servicio. De esta forma, todos los parámetros de la solicitud se asignan correctamente.

En este artículo se describe un ejemplo de configuración para integrar la API Publish de Amazon Simple Notification Service (Amazon SNS) con API Gateway. Utilice este ejemplo como esquema para integrar otros servicios.

Resolución

Nota: Si recibe errores al ejecutar los comandos de la interfaz de la línea de comandos de AWS (AWS CLI), asegúrese de utilizar la versión más reciente de la AWS CLI.

Configurar las herramientas y los recursos necesarios

Configure su entorno y cree todos los recursos de AWS necesarios para su caso de uso. Para el ejemplo de configuración de Amazon SNS, haga lo siguiente:

  1. Instale la AWS CLI.
  2. Cree un tema de Amazon SNS. Anote el tema nombre de recurso de Amazon (ARN). Utilice esta información en el paso siguiente y más adelante en esta configuración.
  3. Cree una suscripción al tema.
  4. Abra la consola de AWS Identity and Access Management (IAM) y, a continuación, cree un rol de ejecución de proxy de servicios de AWS. Anote el ARN del rol para usarlo más adelante en la configuración. Este rol de IAM concede permisos a API Gateway como entidad de confianza para asumir el servicio y realizar la acción de API que se está integrando. Para el ejemplo de configuración de Amazon SNS, permita la acción sns:Publish. Para obtener más información, consulte el modelo de permisos de API Gateway para invocar una API.
  5. Cree una API de REST de API Gateway con un recurso de pruebas. Para obtener más información y ejemplos, consulte los tutoriales y talleres de Amazon API Gateway.
    **Nota:**Opcionalmente, importe la API de REST mediante el siguiente ejemplo de definición de OpenAPI 2.0 (Swagger). Esta opción preconfigura el ejemplo de Amazon SNS. Asegúrese de reemplazar arn:aws:iam::account-id:role/apigateway-sns-role por el ARN de su rol de IAM. Reemplace región por la región de AWS en la que desee crear la API de REST.
{
  "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:region:sns:action/Publish",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.querystring.TopicArn": "method.request.querystring.TopicArn",
            "integration.request.querystring.Message": "method.request.querystring.Message"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST",
          "type": "aws"
        }
      }
    }
  },
  "definitions": {
    "Empty": {
      "type": "object",
      "title": "Empty Schema"
    }
  }
}

Obtener un ejemplo de solicitud HTTPS

Un ejemplo de solicitud HTTPS de la API del servicio que está integrando puede ayudarle a asignar correctamente los parámetros de la solicitud en API Gateway. Para obtener un ejemplo de solicitud HTTPS, realice una de las siguientes acciones:

Consulte los ejemplos en la documentación de la API. Para la API Publish de Amazon SNS, puede consultar la referencia de la API del servicio para ver un 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
  • o -

Genérela a partir de una llamada a la API. Utilice la CLI de AWS para llamar a la API del servicio y, a continuación, analice el resultado. Determine el comando de AWS CLI correspondiente para la API del servicio que se va a integrar y, a continuación, ejecute una solicitud de prueba con la opción**\ --debug**.

Consejo: consulte la referencia de comandos de la AWS CLI para encontrar el comando de AWS CLI correspondiente.

Para el ejemplo de configuración de Amazon SNS, ejecute este comando:

Nota: Reemplace arn:aws:sns:us-east-1:123456789012:test por el ARN de su tema de Amazon SNS.

$ aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug

El resultado del comando contiene la solicitud HTTPS y los encabezados que se pasan. A continuación, se muestra un ejemplo de lo que debe buscar:

2018-11-22 11:56:39,647 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: sns
2018-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

En este ejemplo, la solicitud se envía como el método POST de HTTP.

Crear un método para la API de API Gateway

  1. En la consola de API Gateway, en el panel API, elige el nombre de su API.
  2. En el panel Recursos, seleccione un recurso. Para el ejemplo de configuración de Amazon SNS, elija el recurso de prueba que ha creado.
  3. Elija Acciones y, a continuación, elija Crear método.
  4. En la lista desplegable, elija el método utilizado por la API de su servicio en el ejemplo de solicitud HTTPS. (Para el ejemplo de configuración de Amazon SNS, elija POST) A continuación, elija el icono de la marca de verificación.
  5. En el panel Configuración, haga lo siguiente:
    En Tipo de integración, elija Servicio de AWS.
    En Región de AWS, elija 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, elija la región de su tema de SNS.
    En Servicio de AWS, elija el servicio que se va a integrar con API Gateway. Por ejemplo, Simple Notification Service (SNS).
    (Opcional) En Subdominio de AWS, introduzca el subdominio que utiliza el servicio de AWS. Consulte la documentación del servicio para confirmar la disponibilidad de un subdominio. Para el ejemplo de configuración de Amazon SNS, déjelo en blanco.
    En Método de HTTP, elija el método que corresponda a la API de servicio de AWS que se va a integrar. Para el ejemplo de configuración de Amazon SNS, elija POST.
    En Tipo de acción, si la API de servicio que está integrando es una acción compatible, seleccione Usar nombre de acción. Consulte la referencia de la API del servicio para obtener una lista de las acciones admitidas. Para Amazon SNS, consulte Acciones.
    En Acción, introduzca el nombre de la API del servicio. Para el ejemplo de configuración de Amazon SNS, introduzca Publish.
    -o-
    En Tipo de acción, si la API del servicio de AWS espera una ruta de recursos en su solicitud, elija Usar sustitución de ruta. Por ejemplo, para la API ListLexicons de Amazon Polly, introduzca /v1/lexicons en Sustitución de ruta (opcional).
    En Rol de ejecución, introduzca el ARN del rol de IAM que ha creado.
    (Opcional) En Tratamiento de contenido y Usar tiempo de espera predeterminado, realice los cambios necesarios para su caso de uso. Para el ejemplo de configuración de Amazon SNS, no cambie esta configuración.
  6. Elija Guardar.

Crear parámetros para la solicitud de método

Determine los parámetros de solicitud obligatorios y opcionales para la API del servicio que se va a integrar. Para identificar estos parámetros, consulte el ejemplo de solicitud HTTPS mostrado anteriormente o consulte la Referencia de API de la API del servicio. Por ejemplo, consulte Publish.

  1. En la consola de API Gateway, en el panel Ejecución de método del método de la API de API Gateway, seleccione Solicitud de método.
  2. (Opcional) En el panel Solicitud de método, en Validador de solicitudes, elija un validador, un cuerpo y encabezados de la solicitud si desea validar los parámetros de la cadena de consulta.
  3. Expanda Parámetros de cadenas de consulta de URL.
  4. Elija Añadir cadena de consulta.
  5. En Nombre, introduce el nombre de un parámetro de solicitud para la API del servicio que se va a integrar.
  6. Elija el icono de la marca de verificación (Crear una nueva cadena de consulta).
  7. Si el parámetro es obligatorio, marque la casilla de verificación junto a Obligatorio.
  8. Repita los pasos 4 a 7 para todos los parámetros de solicitud que quiera incluir. Para el ejemplo de configuración de Amazon SNS, cree un parámetro denominado T****opicArn y otro denominado Message.

Para obtener más información, consulte Configurar un método mediante la consola de API Gateway.

Nota: Para algunas API de servicio, debe enviar los encabezados y el cuerpo necesarios en la solicitud de integración, además de los parámetros obligatorios. Puede 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 va a integrar la API ListCollections de Amazon Rekognition, cree el encabezado X-Amz-Target: RekognitionService.ListCollections. La solicitud tiene el siguiente aspecto:

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 está integrando la API SendMessage de Amazon Simple Queue Service (Amazon SQS), asigne el cuerpo de la solicitud mediante la expresión de asignación method.request.body.JSONPath_EXPRESSION. (Reemplace JSONPath_EXPRESSION por una expresión JSONPath para un campo JSON del cuerpo de la solicitud) En este ejemplo, una solicitud tiene un aspecto similar al siguiente:

{'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}}

Crear parámetros para la solicitud de integración

Asigne los parámetros que creó para la solicitud de método a los parámetros de la solicitud de integración.

  1. En la consola de API Gateway, vuelva al panel Ejecución de método para ver el método de la API de API Gateway y, a continuación, elija Solicitud de integración.
  2. En el panel Solicitud de integración, expanda Parámetros de cadenas de consulta de URL.
  3. Elija Añadir cadena de consulta.
  4. En Nombre, introduce el nombre de un parámetro de solicitud para la API del servicio que se va a integrar.
    Nota: El nombre distingue entre mayúsculas y minúsculas y debe aparecer exactamente como lo espera la API del servicio.
  5. En Asignación de, escriba method.request.querystring.param_name. Reemplace param_name por el nombre del parámetro correspondiente que creó para la solicitud de método. Por ejemplo, method.request.querystring.TopicArn.
  6. Elija el icono de la marca de verificación (Crear).
  7. Repita los pasos 3 a 6 para crear parámetros para la solicitud de integración que correspondan a cada uno de los parámetros que creó para la solicitud de método.

Nota: Si creó los encabezados y el cuerpo necesarios para la solicitud de método, asígnelos también a la solicitud de integración. Créelos en el panel Solicitud de integración junto a Encabezados de HTTP y Plantillas de asignación.

Para obtener más información, consulte Configuración de una solicitud de integración de la API mediante la consola de API Gateway.

(Opcional) Comprobar la configuración de la integración

Para confirmar que la configuración de la integración tiene el aspecto esperado, puede ejecutar el comando get-integrador de la AWS CLI para comprobar que la configuración sea similar a la siguiente:

$ 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:

{
    "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": []
}

En la consola de API Gateway, vuelva al panel Ejecución de método para ver el método de la API de API Gateway y, a continuación, elija PROBAR.

  1. En el panel Prueba de método, haga lo siguiente:
    En Cadenas de consulta, introduzca una cadena de consulta que incluya los parámetros y valores de la solicitud. Para el ejemplo de configuración de Amazon SNS, introduzca TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello". Reemplace arn:aws:sns:us-east-1:123456789012:test por el ARN de su tema de Amazon SNS.
    En Encabezados y Cuerpo de la solicitud, si los creó para su configuración, introduzca los nombres de los encabezados y el cuerpo de solicitud en JSON.
    Elija Probar. Aparece una respuesta en el panel Prueba de método. Si la respuesta es correcta, verá Status: 200. Para el ejemplo de configuración de Amazon SNS, una respuesta correcta incluye un MessageId en el cuerpo de la respuesta.
    Para obtener más información, consulte Uso de la consola de API Gateway para probar un método de la API de REST.
  2. Despliegue su API de REST.
  3. Pruebe la API con la herramienta que prefiera.

Información relacionada

Tutorial: Cree una API de REST de API Gateway con integración de AWS

Configuración de métodos de la API de REST en API Gateway

Configuración de integraciones de la API de REST

Configuración de asignaciones de datos de solicitud y respuesta mediante la consola de API Gateway