はじめに
インプルの矢島です。
いきなりですが、DynamoDBを触りたいけど、「利用料金かかるから試せないな〜」と思ったことはありませんか?
思っているそこのあなたへ!
DynamoDB Localというツールがあり、その名の通り、DynamoDBをローカル環境で無料でお試しすることができます。
今回はDynamoDB Localを使ってデータを格納するところまで試していきたいと思います。
やること
- DynamoDB Localの環境構築
- sam initで展開されたコードにDynamoDBの操作のコードを書く
- ローカル環境にて動作確認する
DynamoDB Local環境構築
最終的に下記の構成を作ることに決めました。
├── README.md
├── docker-compose.yml
└── serverless_python
├── README.md
├── __init__.py
├── events
├── src
├── template.yaml
└── tests
serveless_pythonディレクトリ以下はsam initされた時のコードとなります。こちらはご自身でコマンドを叩いて構築をお願いいたします。(参考【初心者向け】AWS SAMを使ってAPI GatewayとLambdaのデプロイとローカルで検証してみた )
docker-compose.ymlを作成して以下のコードを記述してください。
version: '3'
networks:
container-link:
name: docker.internal
external: true
services:
dynamodb-local:
image: amazon/dynamodb-local:latest
container_name: dynamodb
user: root
command: -jar DynamoDBLocal.jar -sharedDb -dbPath /data # 永続化するデータのファイルパス
networks:
- container-link
volumes:
- ./dynamodb_data:/data # データの永続化
ports:
- 8000:8000
tty: true
dynamodb-admin:
image: aaronshaf/dynamodb-admin:latest
container_name: dynamodb-admin
environment:
- DYNAMO_ENDPOINT=dynamodb-local:8000
networks:
- container-link
ports:
- 8001:8001
depends_on:
- dynamodb-local
次に下記コマンドでコンテナを起動します。
docker compose up -d //バックグラウンドで起動
dynamodb-adminはローカル環境でdbの情報をGUIで確認するためのツールです。
ローカル環境ではマネジメントコンソールもないので、とても便利ですので一緒に活用することをおすすめします。
導入してhttp://localhost:8001を叩くと、下記のような画面が開くと思います。
こちらの画面から色々操作が可能となります。
Lambdaのコードを編集する
sam initで生成されたapp.pyを下記のように書き換えます。
import json
import boto3
from datetime import datetime
# import requests
def lambda_handler(event, context):
# DynamoDBクライアントを作成する
dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb:8000")
table_name = 'Users'
table = dynamodb.Table(table_name)
id = 'user001'
created_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# テーブルにデータをインサートする
item = {
'id': id,
'created_at': created_at
}
response = table.put_item(Item=item)
return {
"statusCode": 200,
"body" : response
}
endpoint_urlはhttp://(dyanmodbのコンテナ名):(指定したport)で接続します。
コードは適当ですが、お許しください。(笑)
試してみる
それでは実際に動作を確認していきます。
テーブルを作成
下記コマンドを使ってUsersテーブルを作成します。
aws dynamodb create-table \
--table-name Users \
--attribute-definitions \
AttributeName=id,AttributeType=S \
AttributeName=created_at,AttributeType=S \
--key-schema \
AttributeName=id,KeyType=HASH \
AttributeName=created_at,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
--endpoint-url http://localhost:8000
作成に成功したら、dyanmodb-adminからも新たにテーブルが生成されていることを確認できると思います。
curlでLambdaを呼び出してみる
それでは、実際にLambda関数を呼び出してDynamoDBにデータが入るか確認してみましょう。
まず、localでlambdaを起動できるようにします。
※docker-networkでdynamodb localのコンテナのネットワークを指定することで、sam cliで起動したlambda関数から、dynamodb localを呼び出すことができます。
cd serverless_python
sam build
sam local start-api --docker-network docker.internal
次にcurlでapiを叩いてみます。
curl http://127.0.0.1:3000/hello
そしてdynamodb-adminよりデータが格納されていることを確認します。
無事格納されていましたね!
おわり
いかがでしたでしょうか。
ローカルでも簡単に動作確認することができましたね。
local stackでも同様に無料でdynamoDBを試せそうですね。またの機会で試してみたいと思います。