2015年10月10日土曜日

"API Gateway → Lambda → SQS"でJSONデータをエンキューする


下記でAPI GatewayとLambdaを連携させてみました。
"API Gateway"のバックエンドを"Lambda"にしてJSONデータをエコーさせる
今回はLambdaから更に別のAWSコンポーネントと連動させてみたいと思います。
(つまりLambdaのPythonのBotoの練習です)

具体的には下記のようにJSONデータをAPI GatewayにPOSTして、
バックエンドのLambdaが、そのJSONデータをSQSにエンキューさせてみます。


基本的には上記リンクのLambdaファンクションの部分を
POSTされたJSONデータをSQSにエンキューするように修正した形となります。

Lambdaのコード


下記のように実装しました。(今回はロギングまわりも改善しています)
import json
import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        logger.info(event)
        response = boto3.client('sqs').send_message(
            QueueUrl = 'https://sqs.ap-northeast-1.amazonaws.com/00000000000/test',
            MessageBody = json.dumps(event)
        )
        logger.info(response)
        return response
    except Exception as e:
        logger.error(e)
        raise e


IAMの設定


Lambdaファンクションには"lambda_basic_execution"という
IAMロールをつけていますが、このロールにSQSの処理を行うための
ポリシーをアタッチする必要があります。


Lambdaのテスト


まずはテスト用のJSONデータを設定します。


そして、実際にテストです。


実行結果のログはCloudWatch Logsで確認します。
([INFO]等のロギングまわりの改善も確認できます)


実際にSQSのキューにメッセージ(JSONデータ)が溜まっていることも確認できます。


API Gatewayのテスト


実際にCURLでAPI Gatewayにアクセスしてテストしてみます。
$ curl -d '{"key1":"value7","key2":"value8","key3":"value9"}' https://8vdagewkwe.execute-api.ap-northeast-1.amazonaws.com/prod
{"MD5OfMessageBody": "ee7ad5a858124910f959a2823d4ceab0", "ResponseMetadata": {"HTTPStatusCode": 200, "RequestId": "98eac97c-7480-52c6-b661-87ed97272520"}, "MessageId": "a4185f6a-6861-44b3-995e-e0f2d07bedb5"}

この時のJSONデータもSQSにエンキューされたことが確認できます。


0 コメント: