Amazon DynamoDBテーブルと テーブルにレコードを追加する AWS Lambda 関数を作成するための AWS CloudFormation テンプレート

2023.07.30

概要

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