Serverless Frameworkを利用し、DynamoDBを使ってみた。
こんにちは。イムチェジョンです。
今回はServerless Frameworkを利用してDynamoDBを使ってみるハンズオンをやってみようと思います。
AWS Management Consoleを利用してDynamoDBを使ってみるハンズオンを前にブログで作成したので、よろしかったら、下の青いタイトルをクリックしてください。
NoSQL テーブルを作成してクエリを実行する
今回は上のハンズオンでやったNoSQL テーブルを作成してクエリを実行することをServerless Frameworkを使ってやりたいと思います。
アジェンダ
- Serverless Framework 初期設定
- DynamoDB テーブルの作成
- DynamoDB テーブル操作(関数)
- まとめ
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
provider
のiam
の部分はdynamodb
を使うための設定です。
2. DynamoDBの作成
DynamoDBの作成のためserverless.yml
を修正します。
テーブル名:lim-DynamoDB
パーティションキー:id
/ KeyType: HASH
ソートキー:name
/ KeyType:RANGE
合計読み込みキャパシティー(ReadCapacityUnits):1
合計書き込みキャパシティー(WriteCapacityUnits):1
# 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を作ったりする方が面白いと思いました。