localstackでSQSをトリガーとしたLambdaの実行
こんにちは東です。
今回は前回紹介した「localstack」を使ってSQSをイベントトリガーとしたLambdaの簡単なサンプルを作成したいと思います。
各サービスの準備
DynamoDBにテーブルを作成します。
今回は「NoSQL Workbench for Amazon DynamoDB」を利用してテーブルの作成を行います。
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"
]
}
元々Javaエンジニアからはじまり、気付けばJS(ES6)、AWS、Python3.6、OutsystemsPlatform、PHPと色々やってました。
得意技: Java、JS(ES6)、AWSの一部リソース
勉強中: AWSの各種リソースと、Python3.6
MarkDownからASCiiDocへ目覚めつつある今日この頃。
座右の銘は「一言芳恩」「華麗奔放」「不決断こそ最大の害悪である」です。
コメント