下記で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にエンキューされたことが確認できます。