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認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
【PR】 「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第2版」という本を書きました。
【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。
【PR】 「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWS Transit GatewayのAcceleratedサイト間VPN接続確認
Transit GatewayでVPN接続を作成するときに、Global Acc …
-
-
クロスリージョンでEFSをマウントしてみる
ニーズがあるかどうかはさておき、クロスリージョンでのEFSファイルシステムをマウ …
-
-
Amazon SNSサブスクリプションフィルターで優先度別のSQSキューにサブスクライブする
EC2のコンシューマーアプリケーションは優先度の高いキューのメッセージを先に処理 …
-
-
EC2 Linux ユーザーデータ実行ユーザーとカレントディレクトリの確認
きっと、rootなんだろうなあと認識してたのですが、自分の目で確認したことはなか …
-
-
JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを作る側からの物申す〜に参加、運営、登壇しました
先日、JAWS-UG Osaka 第14回勉強会 「DIY」 〜自社内システムを …
-
-
Amazon Route 53プライベートホストゾーン設定
Amazon Route 53プライベートホストゾーンを作成してみました。 Ro …
-
-
Lambda関数からAWS Systems Managerパラメータストアの値を取得して更新する
Lambda関数で自分自身の環境変数を更新する だと、Lambdaのエイリアスと …
-
-
AWS Application Discovery Serviceのエージェントを実行
本来はオンプレミスのサーバーにエージェントをインストールして、自動でアプリケーシ …
-
-
AWS BatchでPandocコンテナイメージを実行する
「ECR(Amazon Elastic Container Registry)に …
-
-
Amazon SESの受信ルールでSNSトピックを追加
SESの受信ルールにSNSトピックを設定してみました。 [View Active …