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に置きました。
- 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}}}
メッセージ到達確認
来てますね。OKです。
おわり
非同期でSQSをポーリングして何かする仕組みは別途用意する感じで。
ServerlessFreamworkのAWS ServiceProxy (2018/05)
2018/5現在でServerlessFreamwork標準でLambda作らずAWS Service Proxyを使う方法は現在無さげです。(関連issue)
今回ほぼCloudFormationしか使っておらず、同じことをやる場合に敢えてServerlessを使う必要はないと思います。今の所はServerlessで既に作成しているAPIと同じエンドポイントを利用したいケース、コード管理でやり方統一したいとき等にはServerlessを使う利点があるかもしれません。