Serverless Frameworkを利用し、DynamoDBを使ってみた。

2021.07.14

こんにちは。イムチェジョンです。
今回はServerless Frameworkを利用してDynamoDBを使ってみるハンズオンをやってみようと思います。 AWS Management Consoleを利用してDynamoDBを使ってみるハンズオンを前にブログで作成したので、よろしかったら、下の青いタイトルをクリックしてください。
NoSQL テーブルを作成してクエリを実行する
今回は上のハンズオンでやったNoSQL テーブルを作成してクエリを実行することをServerless Frameworkを使ってやりたいと思います。

アジェンダ

  1. Serverless Framework 初期設定
  2. DynamoDB テーブルの作成
  3. DynamoDB テーブル操作(関数)
  4. まとめ

1. 初期設定

1-1. サービスを作成

まず、Serverless Frameworkのサービスを作成します。 サービス名は ”dynamoDB-serverless” です。

$ serverless create --template aws-python3 --path dynamoDB-serverless
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "{path}"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v2.48.0
 -------'
Serverless: Successfully generated boilerplate for template: "aws-python3"

1-2. プラグインをインストール

次にServerless Frameworkのサービスのフォルダーに入り、プラグインをインストールします。 serverless-python-requirements : Pythonを使うためのプラグイン

$ cd dynamoDB-serverless
$ sls plugin install -n serverless-python-requirements
Serverless: Creating an empty package.json file in your service directory
Serverless: Installing plugin "serverless-python-requirements@latest" (this might take a few seconds...)
Serverless: Successfully installed "serverless-python-requirements@latest"

1-3. パッケージもインストール

今回に使うパッケージもインストールします。

pipenv install requests boto3

1-4. serverless.yml の初期設定

serverless.yml の初期設定を行います。

service: dynamodb-serverless
frameworkVersion: '2'

provider:
    name: aws
    runtime: python3.8
    lambdaHashingVersion: 20201221
    stage: dev
    region: ap-northeast-2
    iam:
        role:
        statements:
            - Effect: 'Allow'
              Action:
                - 'dynamodb:*'
              Resource:
                - "arn:aws:dynamodb:ap-northeast-2:109054975408:table/*"

functions:
    hello:
        handler: handler.hello

plugins:
    - serverless-python-requirements

provideriamの部分はdynamodbを使うための設定です。

2. DynamoDBの作成

DynamoDBの作成のためserverless.ymlを修正します。

テーブル名:lim-DynamoDB
パーティションキー:id / KeyType: HASH
ソートキー:name / KeyType:RANGE
合計読み込みキャパシティー(ReadCapacityUnits):
合計書き込みキャパシティー(WriteCapacityUnits):

# Create resource
resources:
    Resources:
        # Create DynamoDB
        DynamoDbTable:
            Type: 'AWS::DynamoDB::Table'
            Properties:
                # set Partition Key / Sort Key
                AttributeDefinitions:
                    - AttributeName: id
                      AttributeType: S
                    - AttributeName: name
                      AttributeType: S
                # set the type of key
                KeySchema:
                    - AttributeName: id
                      KeyType: HASH
                    - AttributeName: name
                      KeyType: RANGE
                # set CapacityUnits
                ProvisionedThroughput:
                    ReadCapacityUnits: 1
                    WriteCapacityUnits: 1
                # set table name
                TableName: lim-DynamoDB

DynamoDBが成功的に作成できているのを確認できます。

3. DynamoDBのテーブル操作(関数)

handler.pyに関数を追加し、テーブル操作してみましょう。

3-1. データの登録

テーブルにデータを追加するソースコードです。

import json
import boto3

# DynamoDB object
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('lim-DynamoDB')

def hello(event, context):
    # insert
    put("id-001","john")
    put("id-002","Daniel")
    put("id-003","Adam")
    put("id-004","Donald")
    put("id-005","jeny")
    put("id-006","Humphery")
    put("id-007","Oscar")
    put("id-008","Peter")
    put("id-009","William")
    put("id-010","Vincent")


def put(id,name):
    """
    insert function
    @Param id Partition Key
    @Param name Sort Key
    """
    table.put_item(
        Item = {
            "id" : id,
            "name" : name,
        }
    )

テーブルにデータが入ったことを確認できます。

3-2. データの検索

テーブルのデータを検索するソースコードです。

import json
import boto3

# DynamoDB object
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('lim-DynamoDB')

def hello(event, context):
    # search data
    result = search("id-010","Vincent")

    response = {
        "statusCode": 200,
        "body": json.dumps(result)
    }

    return response


def search(id,name):
    """
    search data function
    @Param id Partition Key
    @Param name Sort Key
    @return search result
    """
    result = table.get_item(
        Key = {
            'id' : id,
            'name' : name,
        }
    )
    return result

$ serverless deployをしてLambdaを実行し、成功しました。

検索関数の中のデータが出ました。

3-3. データの全件取得

テーブルのデータを全て検索するソースコードです。

import json
import boto3

# DynamoDB object
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('lim-DynamoDB')

def hello(event, context):
    # all search
    result = scan()

    response = {
        "statusCode": 200,
        "body": json.dumps(result['Items'])
    }

    return response


def scan():
    """
    all search function
    @return search result
    """
    result = table.scan()
    return result

$ serverless deployをしてLambdaを実行し、成功しました。

テーブルにある全てのデータが結果に出ました。

3-4. データの削除

テーブルのデータを削除するソースコードです。

import json
import boto3

# DynamoDB object
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('lim-DynamoDB')

def hello(event, context):
    # delete data
    delete("id-009","William")

def delete(id, name):
    """
    delete data function
    @Param id Partition Key
    @Param name Sort Key
    """
    response = table.delete_item(
        Key={
            'id': id,
            'name': name
        },
    )

削除関数の中のデータが削除した結果です。

3-5. テーブルの削除

テーブルを削除するソースコードです。

import json
import boto3

# DynamoDB object
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('lim-DynamoDB')

def hello(event, context):
    # delete_table
    delete_table()

def delete(id, name):
    """
    delete table function
    """
    table.delete()

テーブルページを確認すると成功的に削除され、テーブルがない結果を見れます。

4. まとめ

前にAWS Management Consoleでやってみたことを今回はServerless Frameworkを利用して進めてみました。 AWS Management Consoleを利用すると簡単ですけど、やっぱコードでDynamoDBを作ったりする方が面白いと思いました。