localstackでSQSをトリガーとしたLambdaの実行

http://confrage.jp

localstackでSQSをトリガーとしたLambdaの実行

こんにちは東です。
今回は前回紹介した「localstack」を使ってSQSをイベントトリガーとしたLambdaの簡単なサンプルを作成したいと思います。

各サービスの準備

DynamoDBにテーブルを作成します。
今回は「NoSQL Workbench for Amazon DynamoDB」を利用してテーブルの作成を行います。

  • 「DataModel」でテーブルの内容を定義し

  • 「Visualizer」で作成したデータモデルを選択し「Commit to DynamoDB」を押下

  • localstackのDynamo向きのコネクションを選択し、「Commit」を押下

SQSに、今回利用するQueueを作成します。

$ aws sqs create-queue --queue-name TestQueue --endpoint-url=http://localhost:4576

以下のコマンドで、Queueが作成されている事を確認します。

$ aws sqs list-queues --endpoint-url=http://localhost:4576
{
    "QueueUrls": [
        "http://localhost:4576/queue/TestQueue"
    ]
}

Lambdaを作成します。

$ aws --endpoint-url=http://localhost:4574 lambda create-function --function-name lambda-function --zip-file fileb://lambda-function.zip --handler lambda-function.lambda_handler --runtime python3.8 --role testes
{
    "LastUpdateStatus": "Successful",
    "FunctionName": "lambda-function",
    "LastModified": "2020-05-08T04:56:51.244+0000",
    "RevisionId": "a4787cca-6a1f-4566-8c01-72ae97312232",
    "State": "Active",
    "Version": "$LATEST",
    "Role": "testes",
    "Timeout": 3,
    "Runtime": "python3.8",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "CodeSha256": "VgATLqwAEblVVpT+oFVai3FjrKCREYmFVhXQfQm5Sr0=",
    "Description": "",
    "CodeSize": 433,
    "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:lambda-function",
    "Handler": "lambda-function.lambda_handler"
}

Lambdaの実装は以下の通りです。
SQSから受け取った内容をそのままDynamoへ登録します。

import json
import boto3
dynamodb = boto3.resource('dynamodb',endpoint_url='http://host.docker.internal:4569/')

def lambda_handler(event, context):
    records = event['Records'][0]
    body = json.loads(records['body'])
    table = dynamodb.Table('test')

    for k, v in body.items():
        table.put_item(
            Item={
                'id': k,
                'value': v
            }
        )

LambdaのトリガーにSQSを設定します。

$ aws --endpoint-url=http://localhost:4574 lambda create-event-source-mapping --function-name lambda-function --event-source-arn arn:aws:sqs:us-east-1:000000000000:TestQueue
{
    "UUID": "898341b7-57d1-4e31-ad63-c3492c31979d",
    "StateTransitionReason": "User action",
    "LastModified": 1588918097.0,
    "BatchSize": 10,
    "EventSourceArn": "arn:aws:sqs:us-east-1:000000000000:TestQueue",
    "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:lambda-function",
    "State": "Enabled",
    "LastProcessingResult": "OK"
}

動作確認

CLIからsend-messageを行います。

$ aws sqs send-message --queue-url http://localhost:4576/queue/TestQueue --message-body '{"1":"taro", "2":"jiro", "3":"sabro"}' --endpoint-url=http://localhost:4576
{
    "MD5OfMessageBody": "dba6579919014ddf9b772ba1e129c990",
    "MessageId": "d9414c37-60fa-4820-9d4f-f67189683c23"
}

・実行結果
Dynamoのtestテーブルに、Bodyに指定した内容が登録されていることがわかります。

今回サンプルで載せているコマンドでは毎回endpointの指定を行っていますが、毎回指定を行うのはめんどくさいと思います。
その場合は、awscli-localを利用することで、endpointの指定を省くことが可能です。

使い方は簡単、aws→awslocalに変えるだけです。

$ awslocal sqs list-queues
{
    "QueueUrls": [
        "http://localhost:4576/queue/TestQueue"
    ]
}

コメント

タイトルとURLをコピーしました