概要
このブログでは、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 関数には、重複項目の追加を防ぐための条件式が含まれています。全体として、このアプローチはサーバーレス・アプリケーションを管理するための効率的で費用対効果の高いソリューションを提供します。