AWS
sqs
APIGateway
serverless

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

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を使う利点があるかもしれません。

参考