DynamoDB Localの導入からGUIでのテーブル作成手順 (Windows10)

# はじめに
2020年12月現在のDynamoDBLocalの導入・GUIでのテーブル作成手順を紹介します。
DynamoDBLocalはAWS上のリソースを使わず、ローカルでDynamoDBの検証ができるので非常に便利です。
LinuxやMacを使った導入手順は既に多くの記事があるので、この記事ではWindowsを使った導入手順～テーブル作成の手順をまとめます。
※Dockerではなく通常のパッケージを使ったやり方です。


# 環境
- Windows10 Home
- JRE 8.027
- Node.js v14.15.0

# DynamoDB Localの導入
## 1. ダウンロード
以下AWS公式リンクからzipファイルをダウンロードし、任意のプロジェクトフォルダに展開。
(アジアパシフィック (東京) リージョン)
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html
   
## 2. JREの導入
DyanamoDB LocalはJRE(Java Runtime Environmen)8.x以降で動作するため、
ローカル内にJREがない場合は以下リンクからダウンロードして実行する。
https://www.java.com/ja/download/

## 3. 実行
1. PowrShellを開き、DynamoDB Localを展開したフォルダに移動。
2. 以下のコマンドを実行

```
java -D"java.library.path=./DynamoDBLocal_lib" -jar DynamoDBLocal.jar -sharedDb
```

## 4. JavaScript consoleでの確認
DynamoDB Localには「JavaScript console」というJavaScriptでDBを操作する機能が備わっています。
上記コマンドでDynamoDBLocalを起動したら、ブラウザで「 http://localhost:8000/shell/ 」にアクセスするだけで確認できます。
![DynamoDBJavaScriptShell.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316090/2a42a81a-f6f9-5810-6123-11a3fc285f18.png)
後程、より簡単にテーブル作成ができるツールを紹介するので、ここではshellの説明は割愛します。
興味がある方は以下の記事等が参考になります。
https://dev.classmethod.jp/articles/dynamodb-local-shell-console/#toc-2
https://dev.classmethod.jp/articles/try_dynamodb_local/#toc-4

※ 右側のコンソールで「 tutorial.start() 」を実行するとDynamoDBのチュートリアルを始めることもできます(英語)

# dynamodb-admin でのテーブル作成
先ほどのJavaScript consoleではjavaScriptを使ったDB操作が可能でしたが、検証で使うのに複雑なJavaScriptを書いてテーブル作成をしていては大変ですよね。
そこで、有志がOSSで開発してくれた「dynamodb-admin」の使い方を紹介します。
これはGUIでのテーブル作成を可能にしてくれるツールです。
https://github.com/aaronshaf/dynamodb-admin

## 1. Node.jsの構築
dynamodb-adminはNode.js上で動作します。
既にローカルマシンにNode.jsが存在すれば問題ありません。
もしまだNode.js環境が無い方は以下の記事などを参考に導入してみてください。
[Windows 10へNode.jsをインストールする](https://qiita.com/echolimitless/items/83f8658cf855de04b9ce)

## 2. 導入
PowrShellなどで以下のコマンドを実行し、dynamodb-adminを導入します。

```
npm install -g dynamodb-admin
```

## 3. 環境変数設定
以下のコマンドを実行し、環境変数をセットしてください。

```
set DYNAMO_ENDPOINT=http://localhost:8000
```

## 4. 実行
dynamodb-adminを実行するには、以下のコマンドを実行するだけです。
先ほどのDynamoDBLocalを実行したのと別のshellを立ち上げて実行してみてください。

```
dynamodb-admin
```

実行できたでしょうか？
私の環境では以下のエラーが出てしまい実行できませんでした。

```
このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\$user_name\AppData\Roaming\npm\dynamodb-admin.ps1 を読み込むことができません。
詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ dynamodb-admin
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

Windows の初期設定では PowerShell のスクリプトの実行が実行ポリシーによって許可されていないことが原因です。
詳細は[こちら](https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)を参照してみてください。

これを解決するセキュアな実行コマンドはこちらです。

```
PowerShell -ExecutionPolicy RemoteSigned dynamodb-admin
```
これは一時的にdynamodb-adminスクリプトに権限を与えて実行するコマンドです。
私はこれをメモしてコピペで使っていますが、毎度これを打つのが面倒という方は
「PowerShell Set-ExecutionPolicy RemoteSigned」このコマンドで恒久的に実行ポリシーを変更できます。
※恒久的なポリシーの変更はあまりお勧めできません。

それでは、実行ログに表示されたアドレス(http://localhost:8001) にブラウザでアクセスしてみてください。
私の環境では既にいくつかのテーブルを作成しているため、このように起動後の画面ではテーブルの一覧が表示されています。
![dynamodb-admin.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316090/7efbd2fb-2661-670a-df60-70631ae93aeb.png)


## 5. テーブル作成
それでは実際にテーブルを作っていきます。
dynamodb-admin起動後のブラウザ画面で「Create table」ボタンを押してください。

![dynamodb-admin-create.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316090/f4059a1e-cd60-0362-79f2-7486b719e4c4.png)

ここでいくつか名称に関する注意点があります。
参考に2020年12月時点のAWS DynamoDBのコンソール画面を載せます。
![AWS-dynamo.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316090/744c0477-da85-47ce-db42-9260e9728ab6.png)

見ての通りdynamodb-adminではキーの名称が古いです。
簡単な対応表を記載します。

| dynamodb-admin       | AWS dynamoDB(2020/12) | 
| -------------------- | --------------------- | 
| Hash Attribute  | パーティションキー | 
| Range Attribute | ソートキー | 

上記に注意して、キーの作成をしてみてください。
テーブル名、パーティションキー、必要であればソートキー・インデックスを追加し「submit」を押すだけでテーブルを作成できます。

## 6. 補足
- ReadCapacityUnits: 一秒ごとに何回 strongly consistent reads 出来るか。(eventually consistent read はその二倍)
- WriteCapacityUnits: 一秒ごと何回 書き込めるか。
- LSI: 簡単に言うとソートキーをもう1つ増やすイメージ。
- GSI: RDBでいう射影の概念で、簡単に言うと別の条件で検索するためキーを追加する。

※dynamodb-adminでは左下の「New Secondary Index」を押すことで、LSI,GSIを設定できます。

# おわりに
以上でWindowsでのDynamoDBLocalの導入、dynamodb-adminでのテーブル作成の手順は終了です。
DynamoDBはNoSQLベースなのでRDBとは全く異なり、キー設計(データアクセス設計)が非常に重要になります。
また時間があればDynamoDBの設計に関する記事を書きたいと思います。