DaynamoDB を学習した時の記事、詰まった箇所

2022年の1月から副業業務委託としてtoB SaaSの開発をお手伝いさせて頂いています。

以下の技術スタックで開発してます。

  • Go
  • DynamoDB
  • OpenAPI3

DynamoDB, OpenAPIは初めて触る技術でした。 新しい技術のキャッチアップはかなり負荷のかかる学習ですが、同時に1番楽しいフェーズでもあります。

今回はDynamoDBのキャッチアップで参考になった記事、詰まった箇所を記しておきたいと思います。

参考記事一覧

Future Tech Blog

フューチャーさんのテックブログです。

大変お世話になりました。 DaynamoDBの概要から、Go×DaynamoDBライブラリの使用例まで一通り網羅できます。


入門記事

DaynamoDB✖︎Goのライブラリユースケース


公式Doc

公式Docです。 https://docs.aws.amazon.com/ja_jp/dynamodb/?pg=dynamodbt&sec=hs

主に参考にした記事は以上です。

ネット上にDynamoの記事や教材はまだまだ少ない印象でした。 体系的に学ぶには公式Docが1番良さそうです。

DaynamoDB扱う上で詰まった箇所

実際に開発していて最初詰まった箇所は以下のような感じです。

※DaynamoDBとはなにか?RDBとの違いは?というような記事はたくさんあるのでそういった話は割愛します。

  • データ定義はjsonファイル
  • 操作はAPI経由
  • AWSクレデンシャルで接続する
  • GUIはNoSQL WorkBenchを使う(AWSコンソールからもアクセスできる)
  • 開発環境はDynamoDB-localを使う
  • シングルテーブルに寄せる

順番に説明していきます。

データ定義はjsonファイル

RDBだとマイグレーションファイルを用意してDDLでテーブル定義すると思いますが、 DaynamoDBはjsonファイルを用意する事でテーブルやデータ型を定義できます。

tabledefinition.json

{
    "Artist": {
        "AttributeValueList": [
            {
                "S": "No One You Know"
            }
        ],
        "ComparisonOperator": "EQ"
    },
    "SongTitle": {
        "AttributeValueList": [
            {
                "S": "Call Me Today"
            }
        ],
        "ComparisonOperator": "EQ"
    }
}
$ aws dynamodb create-table --cli-input-json file://tabledefinition.json

操作はAPI経由, AWSクレデンシャルで接続する

DaynamoDBへの指示は基本的にAPI経由になります。

aws cli でcredentialを見て対象のDBを操作する感じですね。

// アイテム(レコード)作成
$ aws dynamodb put-item --table-name {tableName} --item {item}

// スキャン
$ aws dynamodb scan --table-name {tableName}

// アイテム削除
$ aws dynamodb delete-item --table-name {tableName} --key {key}

RDBではデーターベースサーバーに入ってDB自体を操作しているイメージなので aws cli でDBを操作するのは違和感がありました。

cliを叩く時にawsのcredentialをしっかり設定しないと、期待したAWSアカウントを見にいってくれません。 オプションで毎回credentialを指定する事もできますが、アカウント毎に作業ディレクトリ用意するのが個人的には楽に感じました。

GUIはNoSQL WorkBenchを使う(AWSコンソールからもアクセスできる)

参画しているチームでは積極的にNoSQL WorkBenchというGUIを使っています。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/workbench.settingup.html

画面をポチポチするだけでデータが見れたり、SQLのようにAPIが叩けたりします。

jsonファイルに定義してあるテーブルの取り込みもこのツールで行なっています。

ただバグが多く、学習コストも微妙にある印象でした。 ちなみにAWSのマネジメントコンソールからでも似たようなGUIがあります。

今のところAPIよりはGUIで触った方が開発体験が良いです。

開発環境はDynamoDB-localを使う

開発時はDaynamoDB-localを使っています。 dockerでの構築が非常に簡単で前述したGUIとも容易に接続できます。

まだ実践していませんが、複数AWSアカウントへの接続を再現できればもっと良いなと思っています。

docker-compose.yaml

services:
  dynamodb-local:
    container_name: test_dynamodb-local
    image: amazon/dynamodb-local:latest
    user: root
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath /data
    volumes:
      - dynamodb-local-data:/data
    ports:
      - 8000:8000

シングルテーブルに寄せる

設計方針はかなりRDBと異なります。 基本的にDaynamoDBはテーブルを正規化せずにシングルテーブルに寄せていくのが良いとされているようです。

※複数テーブルにまたがるtransactionも出来ない

DaynamoDBに慣れているエンジニアがほとんどおらず、どうしてもRDBを意識してしまうのが現状の課題です。

今回は以上です。 最後に、 このブログではweb開発について発信していくのでまたご覧頂けると嬉しいです。 最後までお読み頂きありがとうございました。