Posted at

HTTP POSTでAPI Gatewayを経由してSQSにエンキューする

More than 1 year has passed since last update.

APIGatewayのAWS Service Proxy(API Integration/AWS Service)を使うと割と簡単にSQSの入り口をAPIGatewayで自作出来るのでServerless Framework利用してやる方法を書きます。

イメージ

client ==HttpPost(json)==> API Gateway ==AwsServiceProxy==> SQS

ServerlessFreamwork使うのであれば、API Gateway -> Lambda -> SQSという方法も取れますがAPI GatewayのAWS Service Proxyを使えばLambdaを間に作る必要がありません。自作APIに対するリクエスト増えた場合、Lambda介さない方が圧倒的に安価です。複雑な認証など必要としないならばAWS Service Proxy使う方をお薦めします。

AWS Service Proxyの難点としては設定項目が分かり難い所ですかねぇ。


設定

serverlessの導入やserverlessを叩くiam周りは省きます。


serverless.yml

ほぼCloudFormationです。ymlはGistに置きました。

APIGateway->SQS · GitHub


  • ServerlessからAPI Gatewayを作るため、利用しないLambdaProxy作成(mock)

  • 後でSQSのメッセージ属性に任意値付与できるようにjsonでpost

  • CORS用にMock統合タイプで OPTIONSメソッド設定

  • APIGatewayのAPIKey不要と記載しているが基本的に利用推奨

  • IAM PolicyはSQS FullAccessでガバガバ


deploy

$ serverless deploy

言わずもがな


テスト

端末からAPIエンドポイントにPOSTでJSON文字列を送りつけて確認する

request(post)

$ curl -i -X POST -d "{"message":"test"}" \

-H "Content-Type: application/json" \
https://<apigateway-endpint>/dev/send

response

HTTP/1.1 200 OK

Content-Type: application/json
Content-Length: 276
Connection: keep-alive
Date: Sun, 06 May 2018 17:17:22 GMT
......

......

{"SendMessageResponse":{"ResponseMetadata":{"RequestId":"50238bdd-aa56-55b7-9675-d8b490b428b5"},"SendMessageResult":{"MD5OfMessageAttributes":null,"MD5OfMessageBody":"098f6bcd4621d373cade4e832627b4f6","MessageId":"ac3b9630-cd8c-4ae5-89db-5699c7874fda","SequenceNumber":null}}}


メッセージ到達確認

マネジメントコンソールから

sendsqs-dev-message-test.jpg

来てますね。OKです。


おわり

非同期でSQSをポーリングして何かする仕組みは別途用意する感じで。


ServerlessFreamworkのAWS ServiceProxy (2018/05)

2018/5現在でServerlessFreamwork標準でLambda作らずAWS Service Proxyを使う方法は現在無さげです。(関連issue)

今回ほぼCloudFormationしか使っておらず、同じことをやる場合に敢えてServerlessを使う必要はないと思います。今の所はServerlessで既に作成しているAPIと同じエンドポイントを利用したいケース、コード管理でやり方統一したいとき等にはServerlessを使う利点があるかもしれません。


参考