AWS DYNAMODBローカル環境で使用(1)



1.目的


SpringBootでAWS DYNAMODBを使用するために開発プロセスを行った.
まず,ローカル環境で構築すべきであると考えたので,コスト的に無効であるため,実際に実行中のAWSのDynamodBをローカル環境でどのように使用するかについて検討した.

2.ローカル環境


AWS DYNAMODB公式ドキュメントを参照すると、3つのタイプが得られる.しかし一般的に使われているdockerを使うことにした.あまり使われているからではなく、これから波止場を利用する部分が多いと思います.

3. Docker Image & Run


ドッキングステーションが提供する正式なイメージがあります.その前に、dockerがアクティブであるかどうかを確認し、次の操作を行います.
$ docker pull amazon/dynamodb-local

// -jar DynamoDBLocal.jar -inMemory -sharedDb (옵션 사용 시)
$ docker run -d -p 8000:8000 amazon/dynamodb-local
-inMemory DBクローズ時にすべてのデータを削除-sharedDb requestの領域が異なっていても同じ空間を使う

4.awscliを使用してdynmodbを操作する


まずawsciをインストールします.
$ brew install awscli
aws configureの設定(IAMとして個別のアカウントを作成することが望ましい)
$ aws configure
AWS Access Key ID [None]: ******************
AWS Secret Access Key [None]: ******************
Default region name [None]: local
Default output format [None]: json

5.awscliを使用してdynmodb接続を検証する

// --endpoint-url http://localhost:8000 는 반드시 사용, 입력하지 않으면 local이 아님
aws dynamodb list-tables --endpoint-url http://localhost:8000
接続が正常である場合、jsonは次のように戻ります.

6. create-table


端末で次の表生成コマンドを作成するとエラーが発生する可能性がありますので、Shellスクリプトを使用して作成します.進行中にいつもいくつかのエラーが発生します.参考にしたブログの内容が省略されている部分があるのかはわかりませんが、最終的には公式文書を参考に書きました.まず、ここでのポイントは--global-secondary-indexsオプションを使うことですが、JSON形式で入力するのはちょっと難しく、投影は使いたくないのですが、値を渡さなければならない形でエラーを返しました.(最終的にはタイプのみALLに渡す)
#!/bin/bash

aws dynamodb create-table \
    --endpoint-url http://localhost:8000 \
    --table-name Comment \
    --attribute-definitions \
        AttributeName=id,AttributeType=S \
        AttributeName=mentionId,AttributeType=N \
        AttributeName=createdAt,AttributeType=S \
    --key-schema AttributeName=id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --global-secondary-indexes \
	"[
	    {
			\"IndexName\": \"byMentionId\",
			\"KeySchema\":[{\"AttributeName\":\"mentionId\", \"KeyType\":\"HASH\"},
					{\"AttributeName\":\"createdAt\", \"KeyType\":\"RANGE\"}],
			\"Projection\": {
				\"ProjectionType\": \"ALL\"
			},
			\"ProvisionedThroughput\": { 
				\"ReadCapacityUnits\": 1,
				\"WriteCapacityUnits\": 1
			}
	    }
	]"