Amazon DynamoDBテーブルと テーブルにレコードを追加する AWS Lambda 関数を作成するための AWS CloudFormation テンプレート
概要
このブログでは、Amazon DynamoDB テーブルと AWS Lambda 関数を作成する CloudFormation テンプレートを設計します。 Amazon DynamoDB テーブルには、Primaryキーとして「item_code」属性を持つアイテムが保存されます。 AWS Lambda 関数は、「item_code」に基づいて重複を防ぐための条件付きチェックを使用して、DynamoDB テーブルに新しい項目を追加するために割り当てられます。 AWS Lambda 関数は Python 3.8 で記述されており、AWS SDK (Boto3) を利用して Amazon DynamoDB と通信します。
CloudFormation テンプレート
AWSTemplateFormatVersion: '2010-09-09' Description: CloudFormation template for creating Lambda function to put_item in a DynamoDB table Resources: DynamoDBItemsTable: Type: AWS::DynamoDB::Table Properties: TableName: DynamoDBItemsTable AttributeDefinitions: - AttributeName: item_code AttributeType: S KeySchema: - AttributeName: item_code KeyType: HASH BillingMode: PAY_PER_REQUEST LambdaExecutionRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: 'sts:AssumeRole' Policies: - PolicyName: DynamoDBAccess PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - dynamodb:PutItem - dynamodb:GetItem Resource: !GetAtt DynamoDBItemsTable.Arn LambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: items_put Runtime: python3.8 Handler: index.lambda_handler Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: | import json import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('DynamoDBItemsTable') def lambda_handler(event, context): if not event.get("item_code"): return { 'statusCode': 400, 'body': 'Input must contain item_code' } item_code = event.get('item_code') try: table.put_item(Item=event, ConditionExpression='attribute_not_exists(item_code)') return { 'statusCode': 200, 'body': 'Item added successfully' } except dynamodb.meta.client.exceptions.ConditionalCheckFailedException: return { 'statusCode': 400, 'body': 'Item with item_code already exists' }
リソース
- DynamoDBItemsTable: Primary キー「item_code」(String) と請求モードを「PAY_PER_REQUEST」に設定して Amazon DynamoDB テーブルを作成します。
- LambdaExecutionRole: AWS Lambda 関数の IAM ロールを定義し、「DynamoDBItemsTable」へのデータの読み書きを許可します。
- LambdaFunction: Python 3.8 ランタイムで AWS Lambda 関数「items_put」を作成します。この関数は、重複を避けるためのConditionチェックを使用してitemsを Amazon DynamoDB テーブルに追加します。
CloudFormationスタックをデプロイする
- AWS CloudFormation テンプレートを使用してスタックを作成します。
- 次のコマンドを使用してスタックをデプロイします。スタック名と AWS CloudFormation テンプレート ファイルへのパスを指定します。
aws cloudformation create-stack --stack-name dynamodb-putitems-stack --template-body file://ddb_items_put.yaml --capabilities CAPABILITY_NAMED_IAM --profile <YOUR_AWS_PROFILE_NAME> --region ap-northeast-1
ノート: 次の値を、AWS 環境に一致する実際の値に置き換えてください。
- stack-name
- template-body「例えば、file://XXXX」
- profile
- region
テスト
- CloudFormationスタックが正常に作成されたことを確認します。
-
「Resources」タブをクリックして、作成されたリソースを確認します。
- 作成されたAWS Lambda関数「items_put」を次のJSON入力イベントでテストします。
{ "item_code": "B0C2BSVMTZ", "item_name": "おーいお茶", "price": 2066 }
- Amazon DynamoDB テーブルにレコードが正常に追加されました。
まとめ
このブログでは、AWS CloudFormation を正常に作成およびデプロイして、AmazonDynamoDB テーブルと AWS Lambda 関数を作成しました。 AWS Lambda 関数には、重複項目の追加を防ぐための条件式が含まれています。全体として、このアプローチはサーバーレス・アプリケーションを管理するための効率的で費用対効果の高いソリューションを提供します。