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入門ガイド」という本を書きました。
i【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。

開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター3年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWS VPC ネットワークACLでHTTP(80)のみ許可する
ユーザーガイドのカスタムネットワーク ACLのうち、HTTP(80)を許可する設 …
-
-
「X-Tech JAWS 【第2回】~9割のX-Techと1割の優しさで切り拓く未来~」に行ってきました
「X-Tech JAWS 【第2回】~9割のX-Techと1割の優しさで切り拓く …
-
-
RDSスナップショットのS3エクスポート結果確認
RDSのスナップショットをS3へエクスポートが日本語マネジメントコンソールでもで …
-
-
AWS CloudFormationでAmazon DynamoDBテーブルを作ってアイテムを追加する
デモ用にDynamoDBテーブルを作って消して、ということをたまにするので、Cl …
-
-
5分でAlexaスキルを作る
「JAWS-UG Osaka 第22回勉強会 東西の中の人が語る!!! Micr …
-
-
プライベートサブネットのEC2でセッションマネージャを使うようVPCエンドポイントを構成する
インターネットゲートウェイへのルートがないルートテーブルに関連付けられたプライベ …
-
-
AWS RDS でMySQLインスタンスを構築する
Amazon Web ServiceにはAmazon Relational Da …
-
-
JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo 2016 アップデート追っかけ会
「JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo …
-
-
Rocket.ChatにAWS Lambda(Python)から投稿する
Rocket.ChatにAPIで投稿するテスト(Postman)をやってみて、使 …
-
-
Amazon Aurora Serverlessを使い始めてみました(1日経過しての課金結果も)
祝!!! Amazon Aurora ServerlessがGAになりました! …