{Lambda}チュートリアル: Amazon DynamoDB Streams で AWS Lambda を使用する

-- 1. コマンド等のインストール

-- 1.1 aws cli version 2 インストール

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

aws --version

-- 1.2 jqインストール
sudo yum -y install jq

 

-- 2. IAMロール作成
vim role01.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

aws iam create-role \
--role-name role01 \
--assume-role-policy-document file://role01.json


-- 3. ポリシーをロールにアタッチ
aws iam attach-role-policy \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole \
--role-name role01

-- 4. Lambda関数作成

vim test.js

console.log('Loading function');

exports.handler = function(event, context, callback) {
    console.log(JSON.stringify(event, null, 2));
    event.Records.forEach(function(record) {
        console.log(record.eventID);
        console.log(record.eventName);
        console.log('DynamoDB Record: %j', record.dynamodb);
    });
    callback(null, "message");
};

chmod 755 test.js
zip test.zip test.js


aws lambda create-function \
--function-name func01 \
--zip-file fileb://test.zip \
--handler test.handler \
--runtime nodejs12.x \
--role arn:aws:iam::999999999999:role/role01

aws lambda list-functions | grep func01
aws lambda get-function --function-name func01

-- 5. Lambda 関数をテストする

vim input.txt
{
   "Records":[
      {
         "eventID":"1",
         "eventName":"INSERT",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"111",
            "SizeBytes":26,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"2",
         "eventName":"MODIFY",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"222",
            "SizeBytes":59,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"3",
         "eventName":"REMOVE",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"333",
            "SizeBytes":38,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      }
   ]
}

aws lambda invoke \
--function-name func01 \
--payload file://input.txt \
output.txt \
--cli-binary-format raw-in-base64-out

cat output.txt


-- 6. ストリーミングが有効になった DynamoDB テーブルを作成する

aws dynamodb create-table \
--table-name tab1 \
--attribute-definitions \
    AttributeName=col1,AttributeType=S \
    AttributeName=col2,AttributeType=S \
--key-schema \
    AttributeName=col1,KeyType=HASH \
    AttributeName=col2,KeyType=RANGE \
--billing-mode=PAY_PER_REQUEST \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

aws dynamodb list-tables
aws dynamodb describe-table --table-name tab1

 

-- 7. Lambdaイベントソースマッピング作成

aws lambda create-event-source-mapping \
--function-name func01 \
--batch-size 1 \
--starting-position LATEST \
--event-source arn:aws:dynamodb:ap-northeast-1:999999999999:table/tab1/stream/2022-02-12T08:06:38.407

aws lambda list-event-source-mappings


-- 8. セットアップをテストする

aws dynamodb put-item \
--table-name tab1  \
--item \
    '{"col1": {"S": "val11"}, "col2": {"S": "val12"}, "col3": {"S": "val13"}}'

aws dynamodb put-item \
--table-name tab1 \
--item \
    '{"col1": {"S": "val21"}, "col2": {"S": "val22"}, "col3": {"S": "val23"}}'

aws dynamodb delete-item \
--table-name tab1 \
--key '{ "col1": {"S": "val21"}, "col2": {"S": "val22"}}'

 


-- 9. クリーンアップ


-- Lambdaイベントソースマッピング削除

aws lambda list-event-source-mappings \
--function-name func01


aws lambda delete-event-source-mapping \
--uuid 70197fb9-5a6d-4929-97x2-2ee3292cf234


-- dynamodbテーブル削除
aws dynamodb list-tables
aws dynamodb delete-table --table-name tab1


-- Lambda関数の削除
aws lambda get-function --function-name func01
aws lambda delete-function --function-name func01

-- ロールの削除
aws iam list-roles | grep role01

aws iam detach-role-policy \
--role-name role01 \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole

aws iam delete-role --role-name role01