Amazon API Gateway の Integration Type には、
- Lambda Function
- HTTP Proxy
- AWS Service Proxy (Advanced)
の3つがある。
3つ目については、ドキュメントのWalkthrough: API Gateway and an AWS Service Proxy で触れられているが、パラメータを渡さずに ListTopics をするだけのサンプルとなり、正直あまり参考にならない。
SNS の Publish を例として、API にパラメータを与えるにはどうすればいいのかを検証した。
POSTメソッドを作る
先ほどのWalkThroughでいう、Step 2: Create the GET Methodで、2. For the HTTP method, choose GET, and then save your choice.
の代わりに、POSTメソッドを作成する。
Step 4: Specify Method Settings and Test the Methodの 6. For Action, type ListTopics.
の代わりに、Publish としておく。
とりあえず Save して Test を押すと
{
"Error": {
"Code": "InvalidParameter",
"Message": "Invalid parameter: TopicArn or TargetArn Reason: no value for required parameter",
"Type": "Sender"
},
"RequestId": "d2612a98-55d9-50ae-989d-64a2a1812b1c"
}
というエラーになる(まぁそうでしょう、TopicArnは必須パラメータですし)。
パラメータを足す
ログを見てみると、
Endpoint request URI: https://sns.us-west-2.amazonaws.com/?Action=Publish
と、QueryStringでパラメータを渡しているようなので、TopicArnとMessageを与えられるようにしてみる。
まず入力部分の MethodRequest の URL Query String Parameters に topicArn と message を足す。
次にAPIコールをする設定 Integration Request の URL Query String Parameters に、 TopicArn と Message を足す。
テスト
再度 Test 画面に行き、Query String の message と topicArn を入力 (Request Bodyは空)、Testボタンを押す。
すると、
{
"PublishResponse": {
"PublishResult": {
"MessageId": "44c1e791-6722-5dca-a4c1-a9ab91bbd63e"
},
"ResponseMetadata": {
"RequestId": "c2f22e0a-04c7-51fc-be50-6030f25eca08"
}
}
}
のようなレスポンスが返り、SNSメッセージがPublishされた。
Deployして、curlでも確かめる。
$ curl -X POST 'https://xxxxxxxx.execute-api.us-west-2.amazonaws.com/dev/mydemoawsproxy?topicArn=arn:aws:sns:us-west-2:123456789012:apigw&message=HelloFromCurl'
{"PublishResponse":{"PublishResult":{"MessageId":"83f40b1c-82a6-550e-a542-4526758fc6a0"},"ResponseMetadata":{"RequestId":"d92f2d00-a890-5612-85a4-633a5fb9a5bc"}}}
無事にPublishする事が出来た。
ちなみにスペースを入れるときは、3回エスケープしなくてはいけないようで、スペース1つが %252520 (-> %2520 -> %20 -> ' ') となる。
$ curl -X POST 'https://xxxxxxxx.execute-api.us-west-2.amazonaws.com/dev/mydemoawsproxy?topicArn=arn:aws:sns:us-west-2:123456789012:apigw&message=Hello%252520From%252520Curl'
QueryString じゃなくて Request Body で渡したい?
AWS CLIだと、下記のようなJSON を Request Body として / にPOSTしているようなので、同じようにやりたい。
{'Action': u'Publish', u'Message': u'Hello from AWS CLI', 'Version': u'2010-03-31', u'TopicArn': u'arn:aws:sns:us-west-2:123456789012:apigw'}
ところが Integration Request の Action Type が Use action name だと Action 以外のパラメータをJSONに入れて Request Bodyに入れて送っても無視されてしまう。
そこで Use path override にして、Path override を / にすると、
Endpoint request URI: https://sns.us-west-2.amazonaws.com//
に POST しようとしてしまう。
Path override を ? にすると
Endpoint request URI: https://sns.us-west-2.amazonaws.com/?
に POST できるが、Signatureがミスマッチとなる。
Path override を空欄にすると
Endpoint request URI: https://sns.us-west-2.amazonaws.com/null
に POST しようとしてしまう。
つまり、 / にPOSTする事が出来ない ><
どうすればいいんでしょうかね...コレ。
Path override を空欄にしたときに https://sns.us-west-2.amazonaws.com/ にPOST出来ればよいのですが。