この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。イムチェジョンです。
今回は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を作ったりする方が面白いと思いました。