Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
API Gateway を他の AWS サービスのプロキシとして使用するにはどうすればよいですか?
Amazon API Gateway を他の AWS サービスのプロキシとして使用することで、それら他の AWS サービスを API Gateway と統合したいと考えています。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
AWS サービス API は、HTTPS リクエストの宛先に使用できる REST API です。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 のチュートリアルとワークショップ」を参照してください。
-
次の OpenAPI 2.0 (Swagger) 定義例を使用して REST API をインポートします。
{ "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 のウェブサイトで「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
または、
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 名を選択します。
- [リソース] ペインでリソースを選択します。この Amazon SNS 設定例では、作成したテストリソースを選択します。
- [メソッドを作成] を選択します。
- 新しいウィンドウで次の手順を実行します。
HTTPS リクエスト例でサービス API が使用するメソッドを選択します。
この Amazon SNS 設定例では、[POST] を選択します。
[統合タイプ] では、[AWS サービス] を選択します。
[AWS リージョン] では、統合対象のサービス API に関連付けられたリソースの AWS リージョンを選択します。
この Amazon SNS 設定例では、SNS トピックのリージョンを選択します。
[AWS サービス] で API Gateway と統合するサービスを選択します (例: Simple Notification Service (SNS))。
[AWS サブドメイン] にAWS サービスが使用するサブドメインを入力します。サービスの資料を参照し、サブドメインの可用性を確認します。
この Amazon SNS 設定例では、フィールドを空白に維持します。
[HTTP メソッド] で統合する AWS サービス API に対応するメソッドを選択します。
この Amazon SNS 設定例では、[POST] を選択します。
統合するサービス API がサポート対象のアクションである場合は、[アクションタイプ] で [アクション名を使用] を選択します。サポートされているアクションのリストについては、「サービスの API リファレンス」を参照してください。
Amazon SNS については、「アクション」を参照してください。
[アクション] にサービス API の名前を入力します。この Amazon SNS 設定例では、Publish を入力します。
または、
AWS サービス API が、リクエストにリソースパスが含まれることを想定している場合は、[アクションタイプ] で [パスのオーバーライドを使用] を選択します。たとえば、Amazon Polly ListLexicons API では、[パスのオーバーライド (オプション)] に /v1/lexicons を入力します。
[実行ロール] に作成した IAM ロールの ARN を入力します。 - [メソッドを作成] を選択します。
メソッドリクエストのパラメータを作成する
統合するサービス API の必須リクエストパラメータおよび省略可能パラメータを判断します。これらのパラメータを特定するには、前段で取得した HTTPS リクエスト例を参照するか、サービス API の API リファレンスを参照します (例: Publish)。
次の手順を実行します。
- API Gateway コンソールを開きます。
- ナビゲーションペインで [API] を選択し、目的の API 名を選択します。
- [リソース] ページで [メソッドタイプ] を選択します。
- [メソッドリクエスト] タブを選択し、[編集] を選択します。
- [リクエストバリデーター] ドロップダウンリストで [Validate body, string parameters, and headers] (本文、文字列パラメータ、ヘッダーを検証) を選択します。
- [URL クエリ文字列パラメータ] を展開し、[クエリ文字列の追加] を選択します。
- [名前] に統合するサービス API のリクエストパラメータ名を入力します。この Amazon SNS 設定例では、TopicArn というパラメータ、および別途 Message というパラメータを作成します。
- (オプション) 必須のパラメータに対しては、[必須] にチェックを入れます。
- [保存] を選択します。
詳細については、「API Gateway コンソールを使用してメソッドを設定する」を参照してください。
注: 一部のサービス API では、必須パラメータに加えて、統合リクエストで必須のヘッダーと本文を送信する必要があります。ヘッダーと本文は、[統合リクエスト] ペインの [HTTP リクエストヘッダー] と [リクエスト本文] で作成できます。
たとえば、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 を使用するリクエスト本文をマッピングします。(JSONPath_EXPRESSION をリクエスト本文の JSON フィールドの 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 名を選択します。
- [リソース] ページで [メソッドタイプ] を選択します。
- **[統合リクエスト]タブを選択し、[編集]**を選択します。
- [URL クエリ文字列パラメータ] を展開し、[クエリ文字列パラメータの追加] を選択します。
- [名前] に統合するサービス API のリクエストパラメータ名を入力します。
注: この名前はケースセンシティブなため、サービス API が要求する表記と完全一致する必要があります。 - [マッピング元] に method.request.querystring.param_name を入力します。param_name は、メソッドリクエスト用に作成した対応するパラメータの名前に置き換えてください。(例: method.request.querystring.TopicArn)
- メソッドリクエストに作成した各パラメータに対応する、統合リクエストのパラメータを作成します。
- [保存] を選択します。
注: メソッドリクエストに必要なヘッダーと本文を作成した場合は、統合リクエストにマッピングします。メソッドリクエストに必要なヘッダーと本文を作成するには、[統合リクエスト] ペインの [HTTP ヘッダー] と [マッピングテンプレート] に移動します。
詳細については、「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 名を選択します。
- [リソース] ページで [メソッドタイプ] を選択し、[テスト] タブを選択します。
- [テスト方法] ページで次の手順を実行します。
[クエリ文字列] に入力するクエリ文字列には、リクエストパラメータおよび対応する値を含めます。
[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 統合でマッピングテンプレートを使用する場合は、[リクエスト本文] にメッセージペイロードの JSON データを入力し、[テスト] を選択します。
注: ペイロードは構成によって異なります。 - 正常な応答が取得された場合は、REST API をデプロイします。

