下記でSQSにエンキューする部分を作ったので、

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

今度はデキューする部分を作ってみます。

今まではEC2を起動して、その中で定期的にSQSをポーリングするプログラムを
実行していましたが、今ならLambdaのScheduled Eventを使うことで、
EC2無しに定期的にSQSをポーリングすることができます。

絵にすると、下記のような感じです。
(上段は前述のリンクの記事で作成したので今回は下段のLambdaを作成します)

Untitled%284%29+%282%29

Lambdaの設定

コードは以下のとおりです。

import boto3
import logging

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

queueUrl = 'https://sqs.ap-northeast-1.amazonaws.com/000000000000/test'
maxNumberOfMessages = 10

def lambda_handler(event, context):

    try:
        logger.info(event)
        client = boto3.client('sqs')

        receiveResponse = client.receive_message(
            QueueUrl = queueUrl,
            MaxNumberOfMessages = maxNumberOfMessages
        )
        logger.info(receiveResponse)
        response = receiveResponse

        if receiveResponse.has_key('Messages'):
            entries = []
            for message in receiveResponse['Messages']:
                entries.append({
                    "Id": message['MessageId'],
                    "ReceiptHandle": message['ReceiptHandle']
                })
            deleteResponse = client.delete_message_batch(
                QueueUrl = queueUrl,
                Entries = entries
            )
            logger.info(deleteResponse)
            response = deleteResponse

        return response

    except Exception as e:
        logger.error(e)
        raise e

“receive_message”で最大10件メッセージを受け取って”delete_message_batch”で
まとめて削除しています。

タイムアウトの時間も1分に変更しています。

2015-10-09_11-06-08-1

Lambdaのテスト

まず、キューにメッセージが存在することを確認して、

2015-10-09_11-10-20

Lambdaをテストします。

2015-10-09_11-13-03

下記のように二つのメッセージの削除が成功したというレスポンスが返ってきて、

{
  "Successful": [
    {
      "Id": "c820ef92-7d8d-4aa4-94a0-0843e683d158"
    },
    {
      "Id": "52fa1240-bd8b-43bf-ac43-739118e613e1"
    }
  ],
  "ResponseMetadata": {
    "HTTPStatusCode": 200,
    "RequestId": "257f3292-d917-517b-8995-7c00dc7bbaa0"
  }
}

実際にキューを確認すると、メッセージ数も0になっています。

2015-10-09_11-11-52

Scheduled Eventの設定

上記の処理を5分ごとに実行するためにLambdaのScheduled Eventの設定を行います。

2015-10-09_11-14-34

2015-10-09_11-19-30

2015-10-09_11-20-31

これで5分毎にSQSをポーリングし、メッセージがあれば、
最大10件まで削除するようになったはずです。

CloudWatchでの確認

最後にキューの中のメッセージの推移をCloudWatchで確認します。

2015-10-09_11-25-03

2015-10-09_12-25-47

2015-10-09_12-16-21

60程度のメッセージが5分毎に10程度ずつ減少していることが確認できます。

元記事はこちら

SQSのメッセージをLambdaで5分おきに処理する(Scheduled Event)