yosemite's blog

About technology, books, diary

AWS DynamoDB 入門

DynamoDB

はじめに

経緯

先月、幕張メッセで開催された AWS Summit TOKYO 2019 に参加しました。
そこで割とサーバレスの話が多く、特に印象的なのが「めざせ!サーバレスプロフェッショナル」というセッションでした。

そのセッションでは、AWS SAM や Lambda と一緒に DynamoDB が紹介されていたので、興味があって学習してみることにしました。

概要

まず DynamoDBって何?

Amazon DynamoDB は、規模に関係なく数ミリ秒台のパフォーマンスを実現する、key-value およびドキュメントデータベースです

aws.amazon.com

特徴

  • スケールに応じたパフォーマンス
    • Key-Value 及びドキュメントデータモデル
    • テーブルからの読み取りパフォーマンスを大幅に向上させるインメモリキャッシュである DynamoDB Accelerator(DAX) によってマイクロ秒でのレイテンシーを実現
    • グローバルテーブルによるグローバルレプリケーション
    • DynamoDBストリームを利用したリアルタイムのデータ処理
  • サーバレス
    • 読み込み/書き込みキャパシティモード
    • オンデマンドモード
    • 負荷に対応できるようにスループットを増大、トラフィックが低下するとスケールダウンされるなど Auto Scaling を実現
    • AWS Lambda と統合されており、トリガーによる変更の追跡ができ、それにより通知や指定したアクションを実行可能
  • エンタープライズ対応
    • ACIDトランザクション
    • 保管時のデータは全て暗号化される。
    • ポイントインタイムリカバリを使用することで、テーブルが誤って上書きされたり削除されたりしないようにできます。
    • オンデマンドバックアップおよび復元

コアコンポーネント

  • テーブル、項目、属性
  • プライマリキー
  • セカンダリインデックス
  • DynamoDB ストリーム

本題

取り組んだことリスト

まっさらな状態から僕が取り組んだ内容です。
以下のようなことをざっと1週間くらいでやりました。最初は、簡単なことから躓かないように進めました。

DynamoDB local

セットアップ

Docker

公式のDockerイメージを指定して構築していきます。 amazon/dynamodb-local

  • Dockerfile
FROM amazon/dynamodb-local

WORKDIR /home/dynamodblocal

# UID=1000 → DynamoDB Local の実行ユーザ
RUN mkdir data && chown -R 1000 data
  • Docker-compose.yml
version: '3'

services:
  dynamodb:
    build: ./dynamo
    container_name: dynamodb
    volumes:
      - $PWD/dynamodb_data:/home/dynamodblocal/data
    ports:
      - 8000:8000
    command: -jar DynamoDBLocal.jar -dbPath ./data

DynamoDB local は、デフォルトで -inMemory オプションで起動されるため、コンテナを落とすとテーブル定義を含むデータがすべて消えてしまう。 代わりに -dbPath オプションを指定して起動させることで、コンテナを落としてもデータを失わずに済むらしいです。
以下の記事を参考にしました👇

qiita.com

コンテナの起動

$ docker-compose up -d --build

DynamoDB local のコマンド操作

DynamoDB local は、aws cli をサポートしているので、 $ aws dynamodb コマンドで操作ができる。
今回は、一部のみ紹介します。

公式ドキュメントにコマンド一覧が載っていたのでリンクを貼っておきます。

docs.aws.amazon.com

  • テーブルの作成

    プロジェクト直下に /dynamo/hoge_table.jsonjsonファイルを元にテーブルを作成

$ aws dynamodb create-table --cli-input-json file://dynamo/hoge_table.json --endpoint-url ${DYNAMODB_ENDPOINT}
  • テーブル一覧

    DYNAMODB_ENDPOINT.envrc とかにあらかじめ設定しておく

$ aws dynamodb list-tables --endpoint-url ${DYNAMODB_ENDPOINT}
  • テーブルからレコードの取得

    Id が 1 のレコードを取得

$ aws dynamodb get-item --table-name TableName --key '{"Id":{"N":"1"}}' --endpoint-url ${DYNAMODB_ENDPOINT}

まとめ

今更ではありますが、DynamoDB に入門しました。これまで RDB しか使ったことがなかったので、NoSQL は新鮮です。また、技術的なトレンドとしてもサーバレスにも DynamoDB は、相性がよく今後の需要も伸びてくるのではないのかなと思いました。
まだまだかじった程度の知識しかないので、もう少し使ってみて深い知見が得られたら記事に書こうと思います。

最後まで見てくださりありがとうございました。

それじゃまた🙋‍♂️