DynamoDBで学ぶべきこと
DynamoDBで学ぶべきこと
目次
- DynamoDBの中心的な概念
- なぜDynamoDBを使うのか
- DynamoDBのユースケース
- NoSQLデータベースの理解
- データの設計
- APIの操作
- インデックス
- スループットの管理
- DynamoDBの統合
- セキュリティ
DynamoDBの中心的な概念
DynamoDBは、AWSが提供するフルマネージド型のNoSQLデータベースサービスであり、キー/値ストアとドキュメント型データベースの両方の機能を持っています。以下は、DynamoDBの主要な概念についての説明です。
- テーブル
DynamoDBの基本的なデータ構造であり、テーブル内には複数のアイテムが格納されます。テーブルは、一意の名前と主キーで定義されます。
- アイテム
DynamoDBテーブル内に格納される実際のデータのことで、JSON形式で表現されます。各アイテムには、主キーと1つまたは複数の属性が含まれます。
- 主キー
アイテムを特定するために使用される一意の識別子であり、必ず指定する必要があります。主キーには、単一のパーティションキーまたは複数のパーティションキーとソートキーの組み合わせが使用されます。
- パーティションキー
DynamoDBは、アイテムを複数のパーティションに分割して保存し、スケーリングと負荷分散を実現します。パーティションキーは、アイテムを分割するために使用されます。
- ソートキー
ソートキーは、パーティション内でアイテムをソートするために使用されます。複数のアイテムが同じパーティションキーを持つ場合、ソートキーの値によって並べ替えられます。
- 属性
アイテムに格納される値のことで、属性は名前と値のペアとして定義されます。属性は、スカラー値(文字列、数値、ブール値)またはセット(文字列、数値、バイナリ)のいずれかであることができます。
- インデックス
DynamoDBは、2つのタイプのインデックスをサポートしています。グローバルセカンダリインデックス(GSI)とローカルセカンダリインデックス(LSI)です。これらのインデックスは、クエリとスキャンのパフォーマンスを向上させるために使用されます。
以上が、DynamoDBの主要な概念です。これらの概念を理解することで、DynamoDBを効果的に使用し、スケーラブルでパフォーマンスの高いアプリケーションを開発することができます。また、DynamoDBの機能を最大限に活用するためには、パーティションキーとソートキーの設計やインデックスの使用など、設計上の考慮事項も理解する必要があります。
なぜDynamoDBを使うのか
DynamoDBは、以下のような理由から選択されることがあります。
- スケーラビリティ
DynamoDBは、非常にスケーラブルであり、アプリケーションの負荷が増加しても、ユーザーからはほとんど影響を受けずにサービスを継続できます。DynamoDBは、自動的にパーティションを分割して分散処理することで、大規模なデータセットを処理することができます。
- 操作の簡単さ
DynamoDBは、AWSが提供するフルマネージド型のデータベースサービスであり、サービスのセットアップや管理についてはほとんど心配する必要がありません。また、AWS SDKを使用することで、アプリケーションからDynamoDBへのアクセスが容易になります。
- フレキシビリティ
DynamoDBは、キー/値ストアとドキュメント型データベースの両方の機能を備えており、必要に応じてスキーマレスであることができます。このため、データ構造が変更された場合でも、スキーマを再設計する必要がありません。
- 高可用性
DynamoDBは、AWSのグローバルなインフラストラクチャーに基づいており、高可用性を備えています。複数のリージョンにデータを複製することもできるため、データの耐久性を高めることができます。
- コスト効率
DynamoDBは、使用料金が従量制であるため、使用した分だけの料金しか発生しません。また、最小のキャパシティーユニットである1つの読み取りキャパシティーユニット(RCU)または書き込みキャパシティーユニット(WCU)を使用することができるため、小規模なアプリケーションでもコストを抑えることができます。
これらの理由から、DynamoDBは、スケーラビリティ、操作の簡単さ、フレキシビリティ、高可用性、コスト効率などの観点から、多くのアプリケーション開発者によって選択されています。
DynamoDBのユースケース
DynamoDBは、柔軟性とスケーラビリティを備えたAWSのフルマネージドNoSQLデータベースサービスであり、さまざまなユースケースで使用されています。以下は、代表的なDynamoDBのユースケースの例です。
- ウェブアプリケーションやモバイルアプリケーションのバックエンド
DynamoDBは、高可用性と耐久性を備えたスケーラブルなデータベースサービスであるため、ウェブアプリケーションやモバイルアプリケーションのバックエンドに使用されます。ユーザー情報、セッションデータ、購入履歴などのデータを格納することができます。
- ゲームの進行状況の管理
DynamoDBは、高速かつリアルタイムなデータ処理が可能であり、リアルタイムにデータを読み書きすることができます。そのため、ゲームの進行状況の管理に使用されます。例えば、プレイヤーのアイテムやスコア、ランキング情報などを格納することができます。
- IoTデータのストリーミング
DynamoDBは、ミリ秒単位のレイテンシでデータを処理することができます。そのため、IoTセンサーからのリアルタイムデータをストリーミングして、データを保存、処理、分析することができます。
- 広告のパーソナライズ
DynamoDBは、高速なクエリ処理が可能であり、複雑な条件での検索やフィルタリングが簡単に行えます。そのため、広告のパーソナライズに使用されます。例えば、ユーザーの属性、行動履歴、地理情報などに基づいて、ターゲット広告を配信することができます。
- ログの保存
DynamoDBは、大量のデータを格納することができます。そのため、ログの保存に使用されます。例えば、Webサーバーのログ、アプリケーションのログ、セキュリティイベントログなどを格納することができます。
これらは、DynamoDBが使用される代表的なユースケースの一部です。DynamoDBは柔軟性が高く、スケーラビリティに優れたデータベースサービスであるため、さまざまな業界やアプリケーションで使用されることができます。
NoSQLデータベースの理解
NoSQLデータベースは、従来のリレーショナルデータベースとは異なるアーキテクチャを持つデータベースです。リレーショナルデータベースは、表形式の構造でデータを保存することができ、SQL(Structured Query Language)を使用してデータを取得することができます。一方、NoSQLデータベースは、より柔軟でスケーラブルなデータモデルを採用しています。
NoSQLデータベースの主な特徴は以下の通りです。
- スケーラビリティ
NoSQLデータベースは、水平方向にスケーラブルであるため、大規模なデータの処理に向いています。リレーショナルデータベースでは、単一のマシンに蓄積されるため、処理が困難になる可能性があります。一方、NoSQLデータベースは、複数のマシンにデータを分散することができ、データのロードバランシングやフェイルオーバーが自動的に行われます。
- 柔軟性
NoSQLデータベースは、データモデルを自由に設計することができます。リレーショナルデータベースでは、表の構造があらかじめ定義されているため、データの柔軟性に欠ける場合があります。NoSQLデータベースでは、キー値ペア、ドキュメント、グラフなど、さまざまな形式でデータを保存することができます。
- 高速なデータアクセス
NoSQLデータベースは、大量のデータに対して高速にアクセスできます。リレーショナルデータベースでは、データが複数のテーブルに分散しているため、データを検索するためにJOIN操作が必要になることがあります。一方、NoSQLデータベースでは、データが単一のドキュメントに格納されているため、データのアクセスが高速になります。
NoSQLデータベースには、いくつかの種類があります。例えば、キー値ストア、ドキュメントストア、グラフデータベース、カラムファミリーデータベースなどがあります。それぞれのデータベースには、利点や欠点があり、適切なユースケースがあります。
NoSQLデータベースの種類と特徴
キー値ストア
キー値ストアは、単純なキーと値のペアでデータを格納するデータモデルを持ちます。キーを指定することで、対応する値を取得することができます。このデータモデルは、非常にシンプルで効率的であり、高速なアクセスが可能であるため、大量のデータを扱うことができます。
キー値ストアは、分散システムに適しているため、データのスケーリングが容易であるという利点があります。また、一般的な操作に対する応答時間が非常に速いため、ウェブアプリケーションやモバイルアプリケーションなどの高速なアプリケーションで利用されることが多く、パフォーマンスの要件が高い場合にも適しています。
代表的なキー値ストアとしては、以下のものが挙げられます。
- Amazon DynamoDB
Amazon Web Services(AWS)が提供するフルマネージドのキー値ストアデータベースです。スケーラブルな設計で、高い可用性とパフォーマンスを提供します。
- Redis
高速なインメモリキャッシュとして利用されることが多いですが、キー値ストアとしても利用できます。Redisは、リスト、セット、ソートされたセットなど、様々なデータ構造もサポートしており、柔軟なデータモデルを持っています。
キー値ストアの欠点としては、リレーショナルデータベースよりも複雑なクエリを実行することができないため、特定のアプリケーションには向いていない場合があることです。また、トランザクションの処理が複雑であるため、複数のキーと値を同時に操作する必要がある場合には、他のNoSQLデータベースよりも適していない場合があります。
ドキュメントストア
ドキュメントストアは、非常に柔軟なデータモデルを持ち、JSON、XML、BSONなどのドキュメント形式でデータを保存します。一般的に、1つのドキュメントには複数のフィールドが含まれ、複数のドキュメントをコレクションに格納します。
ドキュメントストアはスキーマレスであるため、フィールドを自由に追加できます。そのため、オブジェクト指向的な開発に向いています。また、ネストされた構造を持つドキュメントもサポートしており、リレーショナルデータベースのようにJOIN操作をする必要がないため、高速なデータアクセスが可能です。
一方、ドキュメントストアにはいくつかの欠点があります。例えば、データの整合性を保つことが難しいことや、複数のドキュメントを更新する場合にはトランザクションがサポートされていないことが挙げられます。しかし、これらの問題はNoSQLデータベース全体に共通する問題であり、ドキュメントストアに限ったものではありません。
代表的なドキュメントストアには、MongoDBやCouchbaseがあります。MongoDBは、柔軟性とパフォーマンスに優れたオープンソースのドキュメントストアであり、JSON形式のドキュメントを保存することができます。Couchbaseは、高可用性やスケーラビリティに優れたドキュメントストアであり、JSONやBSON形式のドキュメントをサポートしています。
グラフデータベース
グラフデータベースは、データをグラフの形式で表現するデータモデルを採用しています。ノード(節点)とエッジ(辺)の2つの要素から構成されます。ノードは、実体や概念を表現する要素であり、エッジは、ノード間の関係性を表現する要素です。
例えば、ソーシャルネットワークの友達関係をグラフで表現する場合、ノードは個々のユーザーを表し、エッジは友達関係を表します。グラフデータベースは、ノードやエッジに対して、属性(プロパティ)を付加することができます。属性は、その要素が持つ値を表現するためのもので、例えば、ユーザーの名前や年齢、友達関係の強さなどが考えられます。
グラフデータベースの主な特徴は、以下の通りです。
- 複雑な関係性の表現が可能
グラフデータベースは、ノードとエッジの関係性を利用して、複雑なデータを表現することができます。例えば、複雑な社会ネットワークやセンサーデータ、生化学反応ネットワークなどが考えられます。
- 高速なクエリ実行が可能
グラフデータベースは、ノードやエッジの関係性に基づいて、高速なクエリ実行が可能です。例えば、あるノードから他のノードまでの最短経路を求めるといったクエリを効率的に実行できます。
- 拡張性が高い
グラフデータベースは、ノードやエッジの追加、削除が容易であり、スキーマレスであるため、データモデルの変更にも柔軟に対応できます。
代表的なグラフデータベースとしては、Neo4jやOrientDBが挙げられます。Neo4jは、Javaで実装されており、オープンソースで利用できます。OrientDBは、NoSQLとしての機能だけでなく、リレーショナルデータベースの機能も備えているため、幅広い用途で利用されています。
カラムファミリーデータベース
カラムファミリーデータベースは、複数のカラムを扱うことができるため、時系列データやセンサーデータなどの大量のデータを処理するのに適しています。カラムファミリーデータベースでは、列ごとに索引が作成されるため、列単位でデータを取得することができます。これにより、特定の列に関する検索や集計などの処理を高速に行うことができます。また、カラムファミリーデータベースは、スケーラビリティが高く、大量のデータを分散処理することができるため、クラウドコンピューティングやビッグデータ処理にも向いています。
例えば、Apache Cassandraは、分散型データベースであり、複数のサーバーにデータを分散して格納することができます。また、HBaseは、Hadoopエコシステムの一部であり、大規模なデータ処理に適したデータベースです。これらのカラムファミリーデータベースは、ビッグデータ処理や時系列データの保存に適しています。しかし、データモデルが特殊であるため、一般的なリレーショナルデータベースに比べて学習コストが高い場合があります。
データの設計
DynamoDBは、キーと値のペアでデータを格納するキー値ストア型のNoSQLデータベースです。データの設計には以下のポイントがあります。
- パーティションキーの設計
DynamoDBは、データをパーティションに分割し、分散処理することでスケーラビリティを実現しています。そのため、パーティションキーの設計が非常に重要です。パーティションキーは、データを一意に識別するためのキーであり、データがどのパーティションに属するかを決定します。パーティションキーの設計には、以下のポイントがあります。
ユニークであること
一様に分散すること
クエリのしやすさ
- ソートキーの設計
DynamoDBでは、パーティションキーとソートキーの2つのキーでデータをソートすることができます。ソートキーは、パーティションキーとともに、パーティション内のデータをソートするためのキーです。ソートキーの設計には、以下のポイントがあります。
クエリのしやすさ
ユニークである必要はない
範囲クエリをサポートすることができる
- データの正規化
DynamoDBでは、1つのテーブルに複数のアイテムを保存することができます。しかし、アイテムに対して1つの属性に対して複数の値を持たせると、データの柔軟性が下がります。そのため、データの正規化を行うことで、データの柔軟性を高めることができます。
- データの分散
DynamoDBは、データを自動的に複数のパーティションに分割するため、データの分散が行われます。そのため、データの分散が均等に行われるように設計することが重要です。
以上が、DynamoDBのデータの設計についてのポイントです。データの設計を適切に行うことで、高速かつスケーラブルなアプリケーションを実現することができます。
APIの操作
DynamoDB APIは、Amazon Web Services (AWS)のマネージド型NoSQLデータベースであるDynamoDBを操作するためのAPIです。DynamoDBは、キー値ストア型のデータベースであり、高速でスケーラブルなアプリケーションを構築するためのツールとして利用されます。以下では、DynamoDB APIの主な操作について説明します。
CreateTable
CreateTable操作は、DynamoDBテーブルを作成するために使用されます。以下は、CreateTableで指定できる主なパラメータです。
- TableName
作成するテーブルの名前を指定します。
- KeySchema
テーブルのプライマリキーを定義します。プライマリキーは、DynamoDBテーブル内のすべてのアイテムを一意に識別するために使用されます。KeySchemaには、ハッシュキー(Partition Key)と、オプションであるソートキー(Sort Key)を指定できます。
- AttributeDefinitions
テーブルで使用される属性を定義します。これには、KeySchemaで使用される属性や、それ以外の属性が含まれます。
- ProvisionedThroughput
テーブルの書き込み容量と読み取り容量を定義します。DynamoDBは、ProvisionedThroughputの設定に基づいて、テーブルのスループットを自動的に管理します。
例えば、以下のコードは、"Books"という名前のテーブルを作成し、"isbn"をハッシュキー、"title"をソートキーとして、ProvisionedThroughputを指定しています。
import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.create_table(
TableName='Books',
KeySchema=[
{
'AttributeName': 'isbn',
'KeyType': 'HASH' # Partition key
},
{
'AttributeName': 'title',
'KeyType': 'RANGE' # Sort key
}
],
AttributeDefinitions=[
{
'AttributeName': 'isbn',
'AttributeType': 'S'
},
{
'AttributeName': 'title',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
この例では、"Books"という名前のテーブルを作成し、プライマリキーに"isbn"と"title"を使用しています。また、ProvisionedThroughputには、読み取り/書き込みの容量が10に設定されています。
DeleteTable
DeleteTable操作は、指定されたテーブルを完全に削除するために使用されます。この操作は、テーブル内に格納されているすべてのデータ、テーブルの設定、インデックス、およびバックアップを削除します。削除操作は、非常に危険であるため、注意が必要です。
DeleteTable操作を使用するには、AWS SDKやDynamoDB APIを使用して、削除するテーブルの名前を指定する必要があります。削除操作は、テーブルがアクティブな場合に実行できません。テーブルがアクティブな場合は、まずUpdateTable操作を使用して、テーブルを非アクティブにする必要があります。
DeleteTable操作が成功すると、テーブルが完全に削除され、以降アクセスすることはできなくなります。削除操作は、すべてのリソースが完全に解放されるまで数分かかる場合があります。
なお、削除したテーブルは一度削除すると復元することができませんので、削除前に注意が必要です。また、誤ってテーブルを削除することを防ぐために、AWSマネジメントコンソールでのアクセス制限の設定などの対策を取ることが重要です。
PutItem
PutItem操作は、DynamoDBテーブルに新しいアイテムを追加するために使用されます。この操作では、以下のようにアイテムの属性値を指定します。
-
テーブル名:アイテムを追加するテーブルの名前
-
アイテム属性:アイテムの属性名と値のペアを指定する、JSONオブジェクトまたはマップ
例えば、以下のようにPutItem操作を実行することができます。
import boto3
# DynamoDBクライアントを初期化
dynamodb = boto3.client('dynamodb')
# 新しいアイテムを追加するためのPutItem操作を定義
response = dynamodb.put_item(
TableName='my-table',
Item={
'id': {'N': '1'},
'name': {'S': 'John'},
'age': {'N': '30'}
}
)
# レスポンスを出力
print(response)
この例では、'my-table'という名前のテーブルに、id、name、およびageの属性を持つ新しいアイテムを追加しています。アイテム属性は、各属性の名前と値のペアを指定する辞書形式で定義されています。ここでは、id属性は数値型('N')、name属性は文字列型('S')、age属性も数値型('N')であることを示すために、それぞれの値に対して型指定子が指定されています。
もしアイテムがすでに存在している場合、PutItem操作は既存のアイテムを更新します。ただし、更新する属性を指定する場合は、UpdateItem操作を使用することをお勧めします。
GetItem
GetItem操作は、指定されたプライマリキーを持つアイテムを取得するために使用されます。DynamoDBでは、テーブル内のアイテムを一意に識別するためにプライマリキーが必要です。GetItem操作を使用すると、指定されたプライマリキーに一致する単一のアイテムを取得できます。
GetItem操作のリクエストには、取得するアイテムのテーブル名とプライマリーキーが含まれます。プライマリーキーは、単一のスカラー値または複合キーで構成されます。複合キーは、複数の属性から構成され、2つの部分で構成されます。パーティションキーとソートキーです。
GetItem操作は、指定されたプライマリーキーに一致する単一のアイテムを取得します。アイテムが見つからない場合は、空の応答が返されます。GetItem操作は、ConsistentReadパラメータを使用して一貫性を制御できます。このパラメータをtrueに設定すると、最新の書き込みを反映するデータが返されます。falseに設定すると、最新の書き込みを反映しない可能性がありますが、読み取り操作の処理時間を短縮できます。
GetItem操作の例として、以下のようなリクエストを送信できます。
{
"TableName": "myTable",
"Key": {
"id": {"N": "12345"}
},
"ConsistentRead": true
}
この例では、myTableテーブルのプライマリキーであるid属性が12345であるアイテムを取得し、一貫性を保証しています。
UpdateItem
UpdateItem操作は、既存のアイテムの属性値を更新する場合に使用されます。この操作では、UpdateExpressionパラメータを使用して、更新する属性の名前と値を指定します。この操作では、UpdateExpressionパラメータに条件式も含めることができます。これにより、特定の条件が満たされた場合にのみ属性を更新することができます。
たとえば、以下のようなUpdateItem操作を考えてみましょう。
aws dynamodb update-item
--table-name MyTable
--key '{"id": {"N": "123"}}'
--update-expression "set #attrName = :attrValue"
--expression-attribute-names '{"#attrName": "name"}'
--expression-attribute-values '{":attrValue": {"S": "John Doe"}}'
この例では、MyTableという名前のテーブルにあるプライマリキーが"id"で"123"のアイテムの"name"属性を"John Doe"に更新しています。"#attrName"と":attrValue"はExpressionAttributeNamesおよびExpressionAttributeValuesパラメータで置き換えられます。
条件式を含めたUpdateItem操作の例を見てみましょう。
aws dynamodb update-item
--table-name MyTable
--key '{"id": {"N": "123"}}'
--update-expression "set #attrName = :attrValue"
--condition-expression "attribute_exists(#attrName)"
--expression-attribute-names '{"#attrName": "name"}'
--expression-attribute-values '{":attrValue": {"S": "John Doe"}}'
この例では、"name"属性が存在する場合にのみアイテムの属性を更新します。これにより、存在しない属性を更新しようとしてエラーが発生するのを防ぎます。
DeleteItem
指定されたテーブル内の指定されたプライマリキーを持つアイテムを削除します。この操作では、テーブル名とプライマリキーを指定します。アイテムが存在しない場合、この操作は空の応答を返します。また、この操作を使用する際には、条件式を使用してアイテムを削除することができます。条件式によって、削除するアイテムをフィルタリングすることができます。詳細については、AWSの公式ドキュメントを参照してください。
Query
Query操作は、指定された条件に基づいてテーブル内のアイテムをクエリするために使用されます。Query操作は、主にテーブル内の特定のアイテムを取得するために使用されます。
Query操作の主なパラメータは、テーブル名、インデックス、および条件です。インデックスを指定することにより、テーブル内の任意の属性に対して高速にクエリを実行できます。
Query操作には、フィルタ式を使用して、クエリの結果をフィルタリングすることもできます。フィルタ式を使用することにより、アイテムが返される前にクエリの結果をフィルタリングすることができます。
Query操作は、複数のアイテムを返す可能性があります。返されたアイテムは、クエリの条件とフィルタ式に基づいてソートされます。
Query操作は、DynamoDBでよく使用される操作の1つであり、高速な検索を実現するために使用されます。
Scan
Scan操作は、指定されたテーブル内のすべてのアイテムをスキャンし、指定されたフィルター条件に一致するアイテムを返します。Scan操作は、テーブル内のすべてのアイテムを処理するため、大量のデータがある場合には時間がかかることがあります。また、Scan操作は、クエリ操作と比較して一般的に高いコストがかかります。
BatchWriteItem
BatchWriteItem操作は、最大25個のPutItemまたはDeleteItem要求を一度に処理できます。複数のアイテムを一度に書き込むことにより、効率的にデータを更新できます。BatchWriteItem操作では、複数のPutItemまたはDeleteItem要求を含むリクエストを指定し、DynamoDBはリクエストを処理して、各要求の結果を返します。BatchWriteItem操作では、要求を最適化するために、複数のテーブルに対する操作も指定できます。ただし、DynamoDBは、最大容量制限を超えないように、各テーブルに対して最大25個のアイテムを処理することができます。
BatchGetItem
BatchGetItem操作は、複数のテーブルから一度に複数のアイテムを取得するために使用されます。この操作では、複数のテーブル名、各テーブルから取得するプライマリキーのリスト、およびその他のオプションを指定します。また、一度に取得できるアイテムの数には制限があります。
BatchGetItem操作は、GetItem操作とは異なり、複数のテーブルから取得できるため、複雑なデータモデルの場合に有用です。ただし、一度に取得できるアイテム数には制限があるため、大量のデータを取得する場合には、複数回のリクエストが必要になる場合があります。
以上が、DynamoDB APIの主な操作になります。これらの操作を使うことで、高速でスケーラブルなアプリケーションを構築することができます。また、DynamoDB APIは、AWS SDKを介して多数のプログラミング言語で使用することができます。
インデックス
DynamoDBには、テーブルのデータに基づいて検索を高速化するために使用される2つの種類のインデックスがあります。
ローカルセカンダリインデックス(LSI)
ローカルセカンダリインデックス(LSI)は、DynamoDBテーブル内のプライマリキーに基づいて作成されるセカンダリインデックスの一種です。LSIは、テーブル内のアイテムの一部の属性でクエリを実行する場合に役立ちます。
LSIは、テーブル内の各アイテムのプライマリキー属性をコピーし、新しいインデックス内でそれらをセカンダリキーとして使用します。LSIのセカンダリキーは、テーブル内のアイテムのプライマリキーの一部に基づくものであり、単一の属性または複数の属性の組み合わせになることができます。
例えば、DynamoDBテーブル内に「user_id」というプライマリキーがある場合、そのプライマリキーを使用してLSIを作成することができます。この場合、LSIのセカンダリキーは、テーブル内のアイテムの「last_name」と「first_name」の組み合わせに基づくものになることができます。このようにして、テーブル内のアイテムを「last_name」と「first_name」でクエリすることができるようになります。
LSIは、テーブル内のプライマリキーに基づいて作成されるため、各パーティションキー内のアイテムのみをインデックス化することができます。そのため、LSIはテーブル内の小規模なアイテムのサブセットに対して効果的なインデックスであり、大量のデータがある場合は、グローバルセカンダリインデックス(GSI)を使用することが推奨されます。
グローバルセカンダリインデックス(GSI)
グローバルセカンダリインデックス(GSI)は、テーブル内の任意の属性に基づいて作成され、テーブル内のすべてのアイテムを含めて特定の属性でクエリを実行する場合に役立ちます。GSIを使用すると、テーブル内のアイテムを検索するための新しい方法を提供することができます。例えば、GSIを使用して、顧客の住所や注文日などの属性に基づいてテーブル内のアイテムを検索することができます。GSIは、テーブルのプライマリキー以外の属性を検索する場合に特に役立ちます。
両方のインデックスは、テーブル作成時または後で追加できます。インデックスは、DynamoDBテーブル内のアイテムを参照するための別の方法を提供します。インデックスにより、テーブルへのアクセスが高速化され、クエリやスキャンの処理が改善されます。ただし、インデックスを使用すると、ストレージとクエリ処理のコストが増加する場合があります。
スループットの管理
DynamoDBは、スループットモデルを採用しています。このモデルでは、各テーブルには読み取りキャパシティーユニット(RCU)と書き込みキャパシティーユニット(WCU)が割り当てられています。これらのキャパシティーユニットは、1秒あたりの読み取りおよび書き込み操作の数を表します。
各テーブルのRCUおよびWCUの割り当ては、初期に設定され、後で変更することができます。ただし、変更には時間がかかり、変更が反映されるまでに最大5分間待つ必要があります。
DynamoDBでは、一部の操作が複数のRCUまたはWCUを消費することがあります。たとえば、QueryおよびScan操作は、取得するアイテム数に応じてRCUを消費します。同様に、PutItemおよびUpdateItem操作は、更新するアイテムのサイズに応じてWCUを消費します。
DynamoDBは、スループットの制限を超えた場合、制限を超えた分のリクエストはサービスによって自動的にスロットリングされます。これは、過剰な負荷によるサービスの遅延やエラーを防ぐためです。
スループットの制限を回避するためには、以下の方法があります。
-
スループットの割り当てを増やす
-
テーブルのパーティションキーを工夫する
-
QueryおよびScan操作のフィルター条件を最適化する
-
一意のIDを生成して、同じキーに対する重複した書き込みを回避する
これらの方法を使用することで、DynamoDBのスループットを最適化し、高いパフォーマンスを実現できます。
DynamoDBの統合
DynamoDBは、多くのAWSサービスと統合されることができます。以下にいくつかの例を示します。
AWS Lambda
AWS LambdaとDynamoDBを統合することで、DynamoDBのテーブル上で発生する特定のイベントに対して自動的に処理を実行できます。例えば、DynamoDBに新しいアイテムが挿入されたとき、Lambdaを使用してそのアイテムに基づく特定の処理を自動的にトリガーできます。
以下は、DynamoDBとLambdaの統合方法の概要です。
-
DynamoDBのテーブルを作成する。
-
Lambda関数を作成する。
-
Lambda関数内で、DynamoDBのテーブルに対するイベントトリガーを設定する。
-
Lambda関数を保存し、テストする。
テーブルに新しいアイテムが挿入された場合、Lambda関数が自動的にトリガーされ、指定された処理が実行される。
例えば、以下のようなLambda関数を作成できます。
exports.handler = async function(event, context) {
// 新しいアイテムがDynamoDBテーブルに挿入された場合
if (event.Records[0].eventName == 'INSERT') {
// 新しいアイテムを取得
const newItem = event.Records[0].dynamodb.NewImage;
// 新しいアイテムに基づいた処理を実行
// ...
}
};
このLambda関数は、DynamoDBテーブルに新しいアイテムが挿入された場合にトリガーされます。新しいアイテムを取得し、必要に応じて処理を実行します。Lambda関数の詳細な設定やトリガーの設定方法などは、AWSのドキュメントを参照してください。
Amazon Kinesis
Amazon Kinesisは、ストリームデータを処理するための完全にマネージドされたプラットフォームであり、DynamoDBと統合して使用することができます。DynamoDBとKinesisを組み合わせることで、リアルタイムストリームデータを収集し、分析、保存、または処理することができます。
Kinesisは、ストリームデータをリアルタイムで処理するための多数のツールを提供しています。ストリームデータをDynamoDBに保存する場合、Kinesisを使用してストリームデータを処理し、その結果をDynamoDBに書き込むことができます。このプロセスにより、高速でリアルタイムなストリームデータ処理を実現することができます。
また、DynamoDBとKinesisを組み合わせることで、ストリームデータの変更を監視し、必要に応じてDynamoDBテーブルを更新することもできます。例えば、Kinesisを使用してセンサーデータをストリーム配信し、そのデータをDynamoDBに保存する場合、Kinesisを使用してデータを処理し、必要に応じてDynamoDBテーブルの属性を更新することができます。
このように、DynamoDBとKinesisを組み合わせることで、リアルタイムなストリームデータの収集、分析、保存、処理が容易になります。
Amazon S3
DynamoDBとAmazon S3は、両方ともAWSのデータストレージサービスであり、異なる目的に使用されます。
DynamoDBは、NoSQLデータベースであり、高速でスケーラブルなデータの保存とアクセスを提供します。DynamoDBは、ミリ秒単位でスケーリングでき、数百万のリクエストを処理できるため、大規模なWebアプリケーションやモバイルアプリケーションのバックエンドとして使用されます。
一方、Amazon S3は、オブジェクトストレージサービスであり、静的ファイルの保存と配信に使用されます。画像、動画、音楽、ドキュメントなど、あらゆる種類のデジタルコンテンツを保存できます。また、Amazon S3は、バックアップやアーカイブなどの用途にも使用されます。Amazon S3は、膨大な量のデータを安全かつ低コストで保存することができ、静的なウェブサイトのホスティングにも使用されます。
DynamoDBとAmazon S3を組み合わせることもできます。たとえば、DynamoDBからアイテムを取得し、それをJSON形式でAmazon S3に書き込んだり、Amazon S3に保存されたファイルのURLをDynamoDBのアイテムに埋め込んだりすることができます。また、Amazon S3に保存されたデータをDynamoDBに取り込むこともできます。
Amazon EMR
Amazon EMR(Elastic MapReduce)は、Amazon Web Services(AWS)でホストされるApache HadoopおよびSparkフレームワークの管理サービスです。EMRを使用すると、大規模なデータセットを処理し、分析するために必要な計算リソースを動的にプロビジョニングできます。
DynamoDBは、NoSQLデータベースであり、高速かつスケーラブルなデータアクセスを提供します。EMRとDynamoDBを組み合わせることで、大規模なデータセットを分析することができます。EMRジョブは、DynamoDBからデータを読み取り、それを処理してAmazon S3などの別のストレージに保存することができます。EMRジョブは、MapReduceやSparkのような分散処理フレームワークを使用して、データの並列処理を行います。
例えば、ある企業がDynamoDBに貯蔵されている膨大な量のデータを分析したい場合、EMRを使用してMapReduceを実行することで、複数のクラスターインスタンスを使用してデータを分割し、分散処理することができます。EMRがクエリ結果を返す前に、DynamoDBのスキャンを最小限に抑えるために、EMRがクエリフィルタリングを使用することもできます。
EMRとDynamoDBを組み合わせることで、高速でスケーラブルなデータ分析を行うことができます。
AWS Glue
AWS Glueは、ETLジョブを実行するためのフルマネージドのETL(Extract, Transform, Load)サービスです。DynamoDBとAWS Glueを組み合わせることで、DynamoDBのデータを処理して、別のAWSサービスに移行することができます。
AWS Glueを使用すると、DynamoDBテーブルからデータを抽出し、必要に応じて変換して、異なるストレージやデータベースに書き込むことができます。AWS Glueでは、スケーラブルで分散型のETLジョブを設定でき、ジョブ実行中に発生するトラブルのトラブルシューティングや解決も可能です。
AWS Glueを使用してDynamoDBを処理する場合、AWS Glueのジョブ定義内でDynamoDBテーブルをソースとして指定し、ジョブの出力先をS3などの他のストレージに指定することができます。ジョブ内で実行する変換処理は、PythonまたはScalaのApache Sparkコードとして記述されます。これにより、柔軟性と高度なカスタマイズ性が得られます。
これらの統合により、DynamoDBデータを処理し、保存、変換、分析することができます。
セキュリティ
DynamoDBは、AWSが提供する高度にセキュアなサービスであり、多層セキュリティ機能があります。以下にDynamoDBの主なセキュリティ機能をいくつか紹介します。
AWS Identity and Access Management(IAM)
AWS Identity and Access Management(IAM)は、DynamoDBのセキュリティを確保するための重要なツールの1つです。IAMを使用すると、AWSアカウント内のユーザー、グループ、およびロールに対して、DynamoDBテーブルのアクセス許可を個別に設定できます。IAMを使用して、アクセスレベルの制御とセキュリティ設定を実装することで、機密性の高いデータが不正にアクセスされたり、変更されたりすることを防ぐことができます。IAMを使用することで、プリンシパルごとに異なるアクセス権限を設定することができ、最小限の特権の原則に従ったアクセスを実現することができます。
VPCエンドポイント
VPCエンドポイントは、AWSのVirtual Private Cloud(VPC)内のリソースへのプライベートなアクセスを可能にするサービスです。DynamoDBでは、VPCエンドポイントを使用することで、VPC内のEC2インスタンスなどのリソースからDynamoDBテーブルにアクセスできます。このアクセスは、パブリックインターネットを介して行われるわけではなく、VPC内で完結するため、より高いセキュリティを実現できます。
VPCエンドポイントを使用するには、まずVPCを作成し、そのVPCにエンドポイントを設定する必要があります。その後、DynamoDBテーブルに対してVPCエンドポイントを設定することができます。これにより、VPC内のEC2インスタンスからDynamoDBテーブルにアクセスすることができます。
VPCエンドポイントを使用すると、DynamoDBテーブルにアクセスする際にインターネットを経由する必要がなくなるため、ネットワーク遅延やネットワーク帯域幅の問題を回避することができます。また、パブリックインターネットを介さないため、セキュリティ上のリスクも低減されます。
Encryption at Rest
DynamoDBでは、暗号化キーの作成、保管、および管理をAWS Key Management Service (KMS)に委任し、AWSマネージドハードウェアセキュリティモジュール(HSM)で保護された暗号化キーを使用してデータを暗号化します。この暗号化キーは、DynamoDBテーブルごとに個別に設定され、KMSキーを使用することにより、カスタマーマスターキー(CMK)として設定することもできます。データの暗号化により、データが保存、バックアップ、および復元される場合にも、安全性を確保することができます。
Encryption in Transit
DynamoDBは、暗号化されたクライアントとサーバー間の接続を提供するためにSSL/TLSを使用しています。これは、データが送信されるときに保護されることを意味します。DynamoDBの場合、データが暗号化されていることを示すために、エンドポイントのURLが「https」で始まります。この暗号化により、ネットワーク上でデータが傍受された場合でも、データを読み取ることができなくなります。
テーブル単位のアクセス制御
DynamoDBではテーブル単位だけでなく、アイテム単位でアクセス制御を設定できます。アイテムレベルのアクセス制御を使用すると、異なるユーザーに対してテーブル内の異なるアイテムに異なるレベルのアクセス許可を付与できます。たとえば、あるユーザーには、テーブル内の特定のアイテムにのみ読み取りアクセス許可を付与できます。これにより、アプリケーションの要件に応じて、細かいレベルのアクセス制御を実装できます。また、DynamoDBは、AWS Identity and Access Management(IAM)を使用して、アクセス許可を管理することができます。IAMを使用すると、AWSアカウント内のユーザー、グループ、およびロールに対して、DynamoDBテーブルへのアクセス許可を制御することができます。
CloudTrailログ
CloudTrailは、AWSのサービスAPI呼び出しを記録し、S3バケットなどのログファイルに保存します。DynamoDBのAPI呼び出しも、CloudTrailログに記録されます。これにより、誰が、いつ、どのような操作を行ったかを追跡でき、セキュリティアクセス監査やトラブルシューティングに役立ちます。ただし、CloudTrailを有効にするには、別途設定が必要です。
Amazon Inspector
Amazon Inspectorは、AWSのセキュリティの評価サービスで、DynamoDBを含む様々なAWSのサービスの脆弱性スキャンやセキュリティ評価を自動化することができます。Inspectorは、AWSリソースの自動評価を実行するエージェントレスのサービスであり、脆弱性、セキュリティ違反、適切なパッチの不足などを監視することができます。
DynamoDBにおいては、Inspectorは、DynamoDBテーブルにアクセスするためのアクセス許可が正しく設定されているかどうか、データが適切に暗号化されているかどうか、DynamoDBテーブルで実行されるAPI呼び出しについて、セキュリティベストプラクティスが遵守されているかどうかを監視することができます。また、Inspectorは、自動で脆弱性スキャンを実行し、可能な脆弱性やセキュリティ上の問題を特定することができます。
Inspectorは、DynamoDBテーブルに対して定期的な評価を実行することができ、結果はAWSマネジメントコンソールやAPIを通じて表示されます。Inspectorの結果に基づいて、必要な対応策を取ることができます。
これらのセキュリティ機能は、DynamoDBが高度にセキュアで信頼性の高いデータストアであることを保証するために使用されます。
Discussion