Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 API Gateway 作为其他 AWS 服务的代理?
我想使用 Amazon API Gateway 作为其他 AWS 服务的代理,并将其他服务与 API Gateway 集成。
解决方法
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
AWS 服务 API 是 REST API,您可以向其发出 HTTPS 请求。要将其他服务与 API Gateway 进行集成,请构建从 API Gateway 到服务 API 的 HTTPS 请求。使用此方法时,所有请求参数都会正确映射。
本解决方法描述了当您通过 API Gateway 与 Amazon Simple Notification Service (Amazon SNS) Publish API 集成时的示例设置。使用以下示例概述将 API Gateway 与其他服务进行集成时使用的方法。
设置所需的工具和资源
配置环境并创建使用案例所需的所有 AWS 资源。对于 Amazon SNS 示例设置,请完成以下步骤:
-
创建 Amazon SNS 主题。记下该主题的 Amazon 资源名称 (ARN)。
-
打开 AWS Identity and Access Management (IAM) 控制台,然后创建 AWS 服务代理执行角色。对于 Amazon SNS 示例设置,请允许 sns:Publish 操作。有关详细信息,请参阅在 API Gateway 中控制和管理对 REST API 的访问。
-
要创建 API Gateway REST API,请使用测试资源。有关更多信息和示例,请参阅 Amazon API Gateway 教程和讲习会。
-
要导入 REST API,请使用以下 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" } } }**注意:**请将 arn:aws:iam::account-id:role/apigateway-sns-role 替换为您的 IAM 角色的 ARN,并将 YOUR-TOPIC-ARN 替换为您的 SNS 主题的 ARN。
上述选项预先配置了 Amazon SNS 示例设置的设置。要创建您的 REST API,请将 your-region 替换为您的 AWS 区域。有关详细信息,请参阅 Swagger 网站上的 What is OpenAPI?(什么是 OpenAPI?)。
获取 HTTPS 请求示例
要集成的服务 API 发送的 HTTPS 请求示例可以帮助您在 API Gateway 中映射请求参数。
对于 Amazon SNS Publish API,请参阅该服务的 API 参考,获取请求示例。
要获取 HTTPS 请求,请运行以下请求示例:
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
- or -
通过 API 调用生成示例。使用 AWS CLI 调用服务 API,然后分析输出。针对要集成的服务 API,确定关联的 AWS CLI 命令,然后使用 —debug 选项,运行测试请求。
要从 API 调用生成示例,请运行以下 publish 命令:
aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug
**注意:**请将 arn:aws:sns:us-east-1:123456789012:test 替换为您的 Amazon SNS 主题的 ARN。
输出示例:
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
输出包含 HTTPS 请求、传递的标头,该请求为 POST HTTP 方法。
创建 API Gateway API 方法
完成以下步骤:
- 打开 API Gateway 控制台。
- 在导航窗格中,选择 API,然后选择您的 API 的名称。
- 在 Resources(资源)窗格中,选择资源。对于 Amazon SNS 示例设置,请选择您创建的测试资源。
- 选择 Create method(创建方法)。
- 在新窗口中:
选择您的服务 API 在 HTTPS 请求示例中使用的方法。
对于 Amazon SNS 示例设置,请选择 POST。
对于 Integration type(集成类型),选择 AWS Service(AWS 服务)。
对于 AWS Region(AWS 区域),选择与要集成的服务 API 关联的资源所在的 AWS 区域。
对于 Amazon SNS 示例设置,选择您的 SNS 主题的区域。
对于 AWS Service(AWS 服务),选择要与 API Gateway 集成的服务。例如,使用 Simple Notification Service (SNS) 服务。
对于 AWS Subdomain(AWS 子域),输入 AWS 服务使用的子域。查看服务的文档,确认子域是否可用。
对于 Amazon SNS 示例设置,将该字段留空。
对于 HTTP method(HTTP 方法),选择与要集成的 AWS 服务 API 对应的方法。
对于 Amazon SNS 示例设置,请选择 POST。
对于 Action type(操作类型),如果您集成的服务 API 是支持的操作,请选择 Use action name(使用操作名称)。查看服务的 API 参考,获取一系列支持的操作。
有关 Amazon SNS,请参阅操作。
对于 Action(操作),输入服务 API 的名称。对于 Amazon SNS 示例设置,输入 Publish。
-or-
对于 Action type(操作类型),如果 AWS 服务 API 需要您请求的资源路径,请选择 Use path override(使用路径覆盖)。例如,对于 Amazon Polly ListLexicons API,针对 Path override (optional)(路径覆盖(可选)),输入 /v1/lexicons。
对于 Execution role(执行角色),输入您创建的 IAM 角色的 ARN。 - 选择 Create method(创建方法)。
创建方法请求的参数
针对要集成的服务 API,确定必需和可选请求参数。要明确这些参数,请参阅您之前得到的 HTTPS 请求示例,或参阅服务 API 的 API 参考。例如,请参阅 Publish。
完成以下步骤:
- 打开 API Gateway 控制台。
- 在导航窗格中,选择 API,然后选择您的 API 的名称。
- 在 Resources(资源)页面中,选择您的 Method type(方法类型)。
- 选择 Method request(方法请求)选项卡,然后选择 Edit(编辑)。
- 选择 Request validator(请求验证器)下拉列表,然后选择 Validate body, string parameters, and headers(验证正文、字符串参数和标头)。
- 展开 URL query string parameters(URL 查询字符串参数),然后选择 Add query string(添加查询字符串)。
- 对于 Name(名称),针对要集成的服务 API,输入请求参数的名称。对于 Amazon SNS 示例设置,创建一个名为 TopicArn 的参数和另一个名为 Message 的参数。
- (可选)如果参数为必需参数,请选中 Required(必需)下的复选框。
- 选择 Save(保存)。
有关详细信息,请参阅使用 API Gateway 控制台设置方法。
**注意:**对于某些服务 API,除了必需参数外,还必须在集成请求中发送必需的标头和正文。您可以在 Integration request(集成请求)面板中的 HTTP Request Headers(HTTP 请求标头)和 Request body(请求正文)下创建标头和正文。
例如,如果要集成 Amazon Rekognition ListCollections API,请创建标头 X-Amz-Target: RekognitionService.ListCollections。
代码请求示例:
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 {}
如果要集成 Amazon Simple Queue Service (Amazon SQS) SendMessage API,请使用映射表达式 method.request.body.JSONPath_EXPRESSION,映射请求正文。(对于请求正文的 JSON 字段,将 JSONPath_EXPRESSION 替换为 JSONPath 表达式。)
代码请求示例:
{'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}}
创建集成请求的参数
将创建的方法请求参数映射到集成请求参数。
完成以下步骤:
- 打开 API Gateway 控制台。
- 在导航窗格中,选择 API,然后选择您的 API 的名称。
- 在 Resources(资源)页面中,选择您的 Method type(方法类型)。
- 选择 Integration request(集成请求)选项卡,然后选择 Edit(编辑)。
- 展开 URL query string parameters(URL 查询字符串参数),然后选择 Add query string parameter(添加查询字符串参数)。
- 对于 Name(名称),针对要集成的服务 API,输入请求参数的名称。
**注意:**名称区分大小写,且必须完全符合服务 API 的要求 - 对于 Mapped from(映射自),输入 method.request.querystring.param_name。将 param\ _name 替换为创建的方法请求参数的名称。例如 method.request.querystring.TopicArn。
- 为您创建的各个方法请求参数创建对应的集成请求参数。
- 选择 Save(保存)。
**注意:**如果您创建了方法请求的必需标头和正文,请同时将其映射到集成请求。要为方法请求创建所需的标头和正文,请导航到 Integration request(集成请求)窗格中的 HTTP Headers(HTTP 标头)和 Mapping templates(映射模板)下。
有关详细信息,请参阅使用 API Gateway 控制台设置 API 集成请求。
(可选)检查集成配置
要验证您的集成设置配置是否正确,请运行以下 get-integration 命令:
aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST
对于 Amazon SNS 示例设置,输出显示与以下代码示例类似的内容:
{ "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": [] }
要获得更大的消息有效载荷,请在您的 API 上运行以下 Amazon SNS 集成:
"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)" }
**注意:**Amazon SNS 支持的最大标头大小为 16KB。在向集成发送请求之前,使用请求映射模板将传入的 HTTP 请求转换为其他格式。由于 Amazon SNS 主题 ARN 是硬编码到映射模板中的,因此客户不会在请求中传递 SNS 主题 ARN。
要检查您的集成配置,请完成以下步骤:
- 打开 API Gateway 控制台。
- 在导航窗格中,选择 API,然后选择您的 API 的名称。
- 在 Resources(资源)页面中,选择您的 Method type(方法类型),然后选择 Test(测试)选项卡。
- 在 Test method(测试方法)页面中,完成以下步骤:
对于查询字符串,输入其中包含请求参数及其值的查询字符串。
对于Amazon SNS 集成,输入 TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello"。将 arn:aws:sns:us-east-1:123456789012:test 替换为您的 Amazon SNS 主题的 ARN。
对于使用映射模板的 Amazon SNS 集成,在 Request body(请求正文)中输入消息负载有效载荷 JSON 数据,然后选择 Test(测试)。
**注意:**有效载荷因您的配置而异。 - 收到成功的响应后,部署您的 REST API。
相关信息
- 语言
- 中文 (简体)
