Hello,DynamoDB
はじめに
DynamoDBを業務で使用しているが、知識が整理できていない部分があります。
なので今回は、DynamoDBについて基本的な内容をまとめたページを作成し、知識の整理を行おうと思います。
DynamoDBって何?
AWSのフルマネージド型NoSQLデータベースサービスのこと。
NoSQLなのでRDSとは異なる仕組みとなっているが、ACIDトランザクションやデータの暗号化を対応している。あとNoSQL WorkbenchでGUIベースでデータの中身を確認することができるようになっているみたい。(NoSQL Workbench今後使ってみよう)
特徴
DynamoDBの特徴として、以下の4つが挙げられる。
特にストレージの容量制限がないのはすごいと思う。
- フルマネージド型サービス
- 保存時に3つのAZに保存するため信頼性が高い
- デフォルトだと2つのAZに保存できた時点で、レスポンスを返す
- Auto Scalingやオンデマンドキャパシティといった設定も可能
- ストレージの容量制限がない
テーブル構造の仕組み
RDSでいうテーブルに該当する部分だが、DynamoDBではRDSとは仕組みが異なっている。
DynamoDBでは、「値(Value)」と取得するための「キー(Key)」だけを格納するシンプルな構造となっていてシンプルな構造のため、単純なデータモデルと高速な読み取り/書き込みに向いている。(例:キャッシュ、セッション管理..)
概念
DybnamoDBにはtable、items、attributeの3つの概念が存在し、従属する形で「キー」と「インデックス」が存在する。
table
RDSのテーブルに該当するもので、DynamoDBでは「item」の集合体のことを言う。
そしてtableには「パーティションキーのみを使用したテーブル」と「パーティションキー+ソートキーを使用したテーブル」の2種類に分類することができる。
- パーティションキー
- item同士を識別するための項目のこと
- ソートキー
- item同士をソートする際に使用するキーのこと
プライマリーキーについて
DynamoDBで は 2 種類の異なるプライマリキーをサポートしている。
プライマリーキーがあることにより、1つのitemを特定することができ、DynamoDBではプライマリーキーを「パーティションキー」のみで表現する場合、「パーティションキー+ソートキー」で表現する場合があります。
またプライマリーキーにはnot null 制約があり、必ず値をいれないといけない。
items
RDSで言うところのrow(行)に該当するが、RDSのように正規化は行う必要がないみたいで
1つのJSONオブジェクトで表現できるデータがitemsに相当するみたいです。
attribute
RDSのcolumm(列)に相当するもの。
データとして文字列でも配列でも問題なく、RDBと違いアイテム間で不揃いでも問題ないです。
(下記の例ではageがあるitemとないitemが存在することになる)
{
"Id": 101,
"Name": "Tom",
"sex": 1
"age": 28,
}
{
"Id": 203,
"Name": "Mike",
"sex": 0,
}
インデックス
プライマリーキー以外の属性で、効率的にitemにアクセスすることができるようにする仕組みのことをセカンダリインデックスといい、GSIとLSIの2種類が存在する。
ソートキー以外でデータの絞り込みを行う際はセカンダリインデックスを使用する必要があり、セカンダリインデックスを作成すると既存のテーブルとは別のテーブルが作成される。(ベーステーブルとは同期を取っている)
GSI(グローバルセカンダリインデックス)
テーブル作成時に設定したパーティションキー・ソートキーとは別のパーティションキー・ソートキーを設定することができる仕組みのこと
LSI(ローカルセカンダリインデックス)
デフォルトで設定したパーティションキーはそのままの状態にして、ソートキーだけデフォルトで設定したものとは別のキーを設定することができる仕組みのこと
※テーブル作成後の追加はできない(グローバルセカンダリインデックスは後から設定できる
DynamoDBの設計の基本
DynamoDBはスキーマレスだが、アクセスパターンに基づいて事前の設計は必要と言われていて、RDSとは設計の考え方が違っている。
RDS | Head |
---|---|
使い方見えてなくてもテーブル設計できる | どのキーで検索してどういう情報取得するか見えてないと設計できない |
正規化を行う | 正規化は行わずになるべく少ないテーブルで管理するようにする |
インデックスを使用すること検索性を高くすることができる | RDSと同様にインデックスを使用することで検索性を高くすることができる |
DynamoDBでテーブルを作成してみる
実際にDynamoDBをテーブル作成を行なってみる
登録する情報は以下の"ユーザー情報"を登録してみる
userId:数値
name:文字
sex:数値(任意)
age:数値(任意)
AWSマネジメントコンソールの場合
DynamoDBのマネジメントコンソールを開いていて、テーブルの作成をクリック
テーブルの作成に必要な情報を入力していく。
今回はデフォルトのままの設定で問題ないが、実際の業務では細かい設定が必要になってくると思う。
テーブル作成ができました!
左のサイドメニューからテーブルの設定やデータの検索ができるみたいです。
CDKの場合
次にCDK(TypeScript)を使用してテーブルの構築を行なってみます。
実際の業務では、マネジメントコンソールからテーブルを作成することはほとんどないと思いますので、実業務に近い形で構築してみます。
import * as cdk from "aws-cdk-lib";
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import { Construct } from "constructs";
export class DynamodbStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// DynamoDB
new dynamodb.Table(this, "sample-user-table", {
tableName: "user-table", // テーブル名の定義
partitionKey: {
name: "userId", //パーティションキーの名前
type: dynamodb.AttributeType.STRING, // データ型の指定
},
sortKey: { // ソートキーの定義
name: "name",
type: dynamodb.AttributeType.STRING,
},
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, // 請求方法の指定
pointInTimeRecovery: true, // PITRを有効化
timeToLiveAttribute: "expired", // TTLの設定
removalPolicy: cdk.RemovalPolicy.DESTROY, // cdk destroyでDB削除可にするために必要
});
}
}
CDKの設定はそこまで難しくないと思いますが、マネジメントコンソールとは違い"請求方法"、"削除ポリシー"など設定しないといけない項目がありました。(設定しないとデフォルトの設定が構築されるみたいです)
一応マネジメントコンソール画面上でも作成されたことを確認。
その他
マネジメントコンソールで出てきた言葉やわからない用語について学習した内容をメモしておきます。
-
グローバルテーブル
DynamoDB のリージョンレベルでのレプリカテーブルを作成する機能。
基本手には3AZにデータが保存されるようになっているが、それをその他リージョンに保存することができる機能。 -
DynamoDB Stream
これは、DynamoDBにデータの更新があった際、Lambda関数を起動して非同期で処理を行うことができるというもの。
※DynamoDB Streamで起動したLambda関数では、INSERT(作成)、MODIFY(更新)、REMOVE(削除)のイベントと、新旧のデータを受け取ることができ他にはKinesisにデータを送信する機能も存在する。 -
DynamoDBのスループット
書き込みと読み込み別々にスループットが管理されている。 -
DynamoDBの料金体系
料金を決める要素には、以下の3つがあります。- キャパシティユニット(読み込み・書き込み容量)
- ストレージ容量
- データ転送量(インは無料)
-
Amazon DynamoDB Accelerator (DAX)
Amazon DynamoDB 用に構築されたフルマネージド型で可用性の高いキャッシュサービス。
DAX は、1 秒あたり数百万のリクエストにおいても、ミリ秒からマイクロ秒へと最大 10 倍のパフォーマンス向上を実現します。
最後
DynamoDBについて基本的な内容を記載していきましたが、このページは今後勉強していく中で更新して行きたいと思います。
参考サイト
-
DynamoDBの基礎的な内容がわかりやすく記載されている
https://blog.serverworks.co.jp/2023/08/17/160708 -
AWS公式サイトのスライドを見ることができる
https://speakerdeck.com/_kensh/dynamodb-design-practice?slide=32 -
CDK参考ページ
https://qiita.com/yamato1491038/items/f388afa3aa4f701321f5
https://itotetsu.hatenablog.com/entry/amazon-dynamodb-via-aws-cdk -
AWS公式サイトのスライドを見ることができる
https://speakerdeck.com/_kensh/dynamodb-design-practice?slide=32
Discussion