2015年10月10日土曜日

Boto3(Python)で"Service Resource"を使ってみた(Lambda)


こちらでPythonのLambdaファンクションとしてSQSにエンキューするコードを
"API Gateway → Lambda → SQS"でJSONデータをエンキューする
こちらでデキュー(Recieve & Delete)するコードを書きました。
SQSのメッセージをLambdaで5分おきに処理する(Scheduled Event)
その時は、下記のようにClientを使っていたのですが、
client = boto3.client('sqs')
次のService Resourceというものを使う方法もあり
sqs = boto3.resource('sqs')
こちらの方が筋が良さそうだったので、上述のLambdaファンクションを
Service Resourceを使った形に書き換えてみました。

SQSにエンキューするLambdaファンクション

import json
import boto3
import logging

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

queueName = 'test'

def lambda_handler(event, context):

    try:
        logger.info(event)
        response = boto3.resource('sqs').get_queue_by_name(
            QueueName = queueName
        ).send_message(
            MessageBody = json.dumps(event)
        )
        logger.info(response)
        return response

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

SQSにデキューするLambdaファンクション

import boto3
import logging

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

queueName = 'test'
maxNumberOfMessages = 10

def lambda_handler(event, context):

    try:
        logger.info(event)

        queue = boto3.resource('sqs').get_queue_by_name(
            QueueName = queueName
        )

        messages = queue.receive_messages(
            MaxNumberOfMessages = maxNumberOfMessages
        )

        entries = []
        for message in messages:
            entries.append({
                "Id": message.message_id,
                "ReceiptHandle": message.receipt_handle
            })

        response = {}
        if len(entries) != 0:
            response = queue.delete_messages(
                Entries = entries
            )

        logger.info(response)
        return response

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

以前よりもスッキリしたんじゃないでしょうか?

0 コメント: