AWS LambdaのSQSへの自前ポーリングをやめてSQSイベントソーストリガーに変更した
以前は、LambdaがSQSからメッセージを受信するには、キューをポーリングしてメッセージを受信する必要がありました。
ポーリングしてキューがあればLambdaを実行するLambdaを動かしたりしていました。
2018年7月にSQSがLambdaのイベントソースとしてサポートされました!
「AWS Lambda がサポートするイベントソースに Amazon Simple Queue Service を追加」
これにより、ポーリングを実装しなくてもよくなりました。
SQSからキューメッセージを受け取ってRedmine APIへデータ登録していたLambdaを改善したいと思います。
本処理をしているLambdaのトリガーをSQSにします。
IAMロールはSQSとCloudWatchに対してのアクセスを許可しました。
目次
event[Records]
eventで渡されるRecordsの中にはすでにキューメッセージも、receiptHandleも含まれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "Records": [ { "messageId": "(messageId)", "receiptHandle": "(receiptHandle)", "body": "", "attributes": { "ApproximateReceiveCount": "", "SentTimestamp": "", "SenderId": "", "ApproximateFirstReceiveTimestamp": "" }, "messageAttributes": {}, "md5OfBody": "", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:************:my_queue", "awsRegion": "us-east-1" } ] } |
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import logging import boto3 import json import traceback import os logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): try: sqs = boto3.client('sqs') sqs_url = os.environ.get('SQS_URL', '') for record in event['Records']: message_body = json.loads(record['body']) #処理 response = sqs.delete_message( QueueUrl=sqs_url, ReceiptHandle=record['receiptHandle'] ) logger.info(response) except: raise Exception(traceback.format_exc()) |
料金
「この機能には追加料金はかかりませんが、Lambda サービスは SQS キューを連続してロングポーリングするため、標準の SQS 価格設定でこれらの API コールに対して課金されます。」とあるので、ポーリングをAWSがやってくれてはいますが、SQSへのリクエスト課金は発生するということですね。
むやみやたらにポーリングしているわけではなく、かしこい頻度調整をしながらロングポーリングをしているようです。
なので自分でコーディングするよりはきっと効率的でしょう。
詳しくは、「AWS Lambda がサポートするイベントソースに Amazon Simple Queue Service を追加」をご参照ください。
これで余分なLambdaも余分なコードも必要なくなりました。
最後までお読みいただきましてありがとうございました!
【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。
【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。
【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。
【PR】 「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター3年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
Amazon SNSサブスクリプションフィルターで優先度別のSQSキューにサブスクライブする
EC2のコンシューマーアプリケーションは優先度の高いキューのメッセージを先に処理 …
-
-
TwilioからのリクエストをAPI Gateway+LambdaでTwimlを返して処理する
Twilioで着信した時のリクエスト先としてTwimlをWebサーバやS3で用意 …
-
-
AWS CDKでクロススタックリファレンスをする
CloudFormationで複数のスタックで参照することがあります。 それをC …
-
-
Amzon Linux のApacheでRedmineとWordPressをバーチャルホストで共存する
EC2とRDSを節約しようと思いまして、Redmineを動かしてるとこに検証用W …
-
-
S3をトリガーにしたときのLambdaのリソースベースポリシー
LambdaのトリガーでS3を設定したとき、自動的にLambdaのリソースベース …
-
-
DynamoDBテーブル項目をS3にエクスポート
DynamoDBテーブルを一時テーブルとして使っていて、毎回使い捨てしてます。 …
-
-
EFSのマウントターゲットがデフォルトで作成されるようになってました
ひさしぶりにAmazon EFSファイルシステムを作成しました。 作成手順がすご …
-
-
Pepperで撮影した写真をAmazon Rekognitionで分析してその結果をPepperがしゃべる ~(1)AWS編~
Pepperの機能を使えるところは使って、何かしたいなあと思ってまして。 目(カ …
-
-
AWS DataLake 構築ハンズオンに行ってきました
AWSJ大阪が増床されて2019年10月限定でAWS pop-up loftとい …
-
-
AWS SSOのIDソースをAD Connectorにしました
オンプレミス想定のActive DirectoryにVPN接続して、AD Con …