AWS - DynamoDB
概要
AWS DynamoDBは、AWSが提供するフルマネージド型のNoSQLデータベースサービスである。
キー・バリュー型およびドキュメント型のデータモデルをサポートし、高速で予測可能なパフォーマンスとシームレスなスケーラビリティを実現する。
主な特徴を以下に示す。
- フルマネージド
- サーバ管理、ソフトウェアパッチ、セットアップ不要
- 高パフォーマンス
- 一桁ミリ秒のレスポンスタイム
- 自動スケーリング
- トラフィックに応じて自動的に容量を調整
- 高可用性
- 複数のAZに自動的にデータを複製
- 柔軟なスキーマ
- 各アイテムが異なる属性を持つことが可能
AWS DynamoDBのデータモデルを以下に示す。
- テーブル
- データを格納する最上位のコンテナ
- アイテム
- テーブル内の個々のレコード
- 属性
- アイテムを構成するデータフィールド (カラムに相当)
- プライマリキー
- パーティションキー (必須) と ソートキー (オプション) で構成
AWS DynamoDBは永続的な無料利用枠を提供しており、個人利用や小規模なアプリケーションであれば無料枠内で運用できることが多い。
DynamoDBの無料枠について
無料枠の内容
- ストレージ : 25[GB]まで無料
- 読み込みリクエスト
- 月200万リクエスト (25 RCU相当)
- 書き込みリクエスト
- 月200万リクエスト (25 WCU相当)
- データ転送
- 同一リージョン内は無料、1[GB]/月のアウトまで無料
※注意
- この無料枠は12ヶ月限定ではなく、永続的に利用可能である。
- DynamoDBオンデマンドモードでも無料枠が適用される。
- グローバルテーブル、バックアップ、ストリームは別料金が掛かる。
料金体系
無料枠を超えた場合の料金 (東京リージョンの例)
- オンデマンドモード
- 書き込み: $1.4464 / 100万リクエスト
- 読み込み: $0.28928 / 100万リクエスト
- ストレージ: $0.285 / GB / 月
- プロビジョンドモード
- 書き込みキャパシティ: $0.000742 / WCU / 時間
- 読み込みキャパシティ: $0.000148 / RCU / 時間
- ストレージ: $0.285 / GB / 月
DynamoDBの停止
DynamoDBには 停止 という概念がない。
EC2 や RDS のようなインスタンスベースのサービスとは異なり、DynamoDBはフルマネージドのサーバーレスデータベースで、ユーザ側でサーバやインスタンスを管理する必要がないためである。
コストを抑える方法
使用していない場合のコストを抑えるには、以下の選択肢がある。
1. オンデマンドモードを使用
- リクエストした分だけ課金される。
- アクセスがなければリクエスト料金は発生しない。
- ストレージは25[GB]まで永続的に無料である。
2. テーブルを削除
- 完全に使用しない場合は削除する。
- 必要に応じてバックアップから復元可能。
3. プロビジョニングモードの調整
- プロビジョニングモードを使用している場合は、最小限のキャパシティ (読み込み 1、書き込み 1) に設定する。
- ただし、この場合も最小限の課金は発生する。
ストレージ料金について
無料枠内 (25[GB]以下) の場合
- ストレージ料金は発生しない(永続的な無料枠)
- オンデマンドモードでアクセスがなければ、基本的にコストは0円
無料枠を超える場合 (25[GB]超え)
- 超過分に対して$0.285/GB/月が課金される。
- 例 : 30[GB]のデータがある場合は、5[GB]分の料金 (約$1.43/月) が発生する。
コストを下げる方法
- ストレージコスト
- データが25[GB]以下であれば永続的に無料である。
- 25[GB]を超える場合のみ超過分の料金が発生。
- バックアップ
- テーブル削除前にオンデマンドバックアップやPoint-in-Time Recovery (PITR) を検討する。
- データエクスポート
- S3へのエクスポートも選択肢の1つである。
完全に無料にするには、データが25[GB]以下でオンデマンドモードを有効にして、データベースにアクセスしないこと。
DynamoDBテーブルの作成
マネジメントコンソールでの作成
- AWSマネジメントコンソールにログインする。
- リージョンを選択する。
- 東京リージョン : ap-northeast-1
- 検索バーに "DynamoDB" と入力して選択する。
- [テーブルの作成]を選択する。
テーブル設定
- テーブル名を入力する。
- 例 : MyTable
- パーティションキーを設定する。
- 属性名を入力(例:
id) - 型を選択:「文字列」、「数値」、「バイナリ」のいずれか
- 属性名を入力(例:
- ソートキー (オプション)
- 必要に応じて追加する。
- パーティションキーとソートキーの組み合わせが一意になる。
- テーブルクラス
- [DynamoDB Standard]を選択する。(推奨)
- キャパシティモード
- オンデマンド (推奨)
- アクセスパターンが不規則な場合
- プロビジョンド
- 安定したアクセスパターンの場合
- オンデマンド (推奨)
- [テーブルの作成]を選択する。
ステータスが"アクティブ"になれば使用可能である。
テーブル設定の確認
作成したテーブルを選択して、以下に示す項目を確認する。
- 概要タブ
- テーブルのARN、作成日時、項目数
- インデックスタブ
- グローバルセカンダリインデックス (GSI) の追加が可能
- モニタータブ
- リクエスト数、レイテンシー等のメトリクス
- アラームタブ
- CloudWatchアラームの設定
以下、MediaWiki形式で記述します: mediawiki== 概要 ==
このドキュメントでは、AWS DynamoDBの無料枠の詳細とテーブルの作成方法、Linux PCからのアクセス設定、基本的な操作方法について説明します。DynamoDBは永続的な無料利用枠を提供しており、個人利用や小規模なアプリケーションであれば無料枠内で運用できることがほとんどです。
DynamoDBの無料枠について
無料枠の内容
AWS無料利用枠(永続的):
- ストレージ: 25 GBまで無料
- 読み込みリクエスト: 月200万リクエスト(25 RCU相当)
- 書き込みリクエスト: 月200万リクエスト(25 WCU相当)
- データ転送: 同一リージョン内は無料、1 GB/月のアウトまで無料
注意点:
- この無料枠は12ヶ月限定ではなく、永続的に利用可能
- DynamoDBオンデマンドモードでも無料枠が適用されます
- グローバルテーブル、バックアップ、ストリームは別料金
料金体系
無料枠を超えた場合の料金(東京リージョンの例):
オンデマンドモード:
- 書き込み: $1.4464 / 100万リクエスト
- 読み込み: $0.28928 / 100万リクエスト
- ストレージ: $0.285 / GB / 月
プロビジョンドモード:
- 書き込みキャパシティ: $0.000742 / WCU / 時間
- 読み込みキャパシティ: $0.000148 / RCU / 時間
- ストレージ: $0.285 / GB / 月
個人利用であれば、無料枠内で十分収まることがほとんどです。
DynamoDBテーブルの作成
マネジメントコンソールでの作成
手順:
- AWSマネジメントコンソールにログイン
- リージョンを選択(東京リージョン:
ap-northeast-1推奨) - 検索バーに「DynamoDB」と入力して選択
- 「テーブルの作成」をクリック
テーブル設定:
- テーブル名を入力(例:
MyTable) - パーティションキーを設定:
- 属性名を入力(例:
id) - 型を選択:「文字列」、「数値」、「バイナリ」のいずれか
- 属性名を入力(例:
- ソートキー(オプション):
- 必要に応じて追加
- パーティションキーとソートキーの組み合わせが一意になります
テーブル設定:
- テーブルクラス:「DynamoDB Standard」を選択(推奨)
- キャパシティモード:
- オンデマンド(推奨):アクセスパターンが不規則な場合
- プロビジョンド:安定したアクセスパターンの場合
- 「テーブルの作成」をクリック
作成には数秒かかります。ステータスが「アクティブ」になれば使用可能です。
テーブル設定の確認
作成したテーブルをクリックして、以下を確認:
- 概要タブ: テーブルのARN、作成日時、項目数
- インデックスタブ: グローバルセカンダリインデックス(GSI)の追加が可能
- モニタータブ: リクエスト数、レイテンシーなどのメトリクス
- アラームタブ: CloudWatchアラームの設定
Linux PCからのアクセス設定
AWS CLIのインストール
方法1 : pip経由 (推奨)
Python3をインストールする。
sudo apt update sudo apt install python3 python3-pip -y
AWS CLIをインストールする。
pip3 install awscli --user
正常にインストールされているかどうかを確認する。
aws --version
方法2 : 公式インストーラ
AWS CLIをダウンロードおよびインストールする。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
正常にインストールされているかどうかを確認する。
aws --version
アクセスキーの作成
- AWSマネジメントコンソールで "IAM" を検索する。
- [ユーザ] - 作成したIAMユーザを選択する。
- [セキュリティ認証情報]タブを選択する。
- [アクセスキーを作成]を選択する。
- ユースケース : [コマンドラインインターフェイス (CLI)]を選択する。
- 確認のチェックボックスにチェックを入力する。
- [次へ]を選択する。
- 説明タグを入力する。(オプション)
- 例 : MyLinuxPC
- [アクセスキーを作成]を選択する。
- 重要 : アクセスキーIDとシークレットアクセスキーを控えておく。
- シークレットキーは後で確認できない。
- .csvファイルをダウンロードして安全に保管する。
AWS CLIの設定
設定コマンドを実行する。
aws configure
以下に示すものを順番に入力する。
- AWS Access Key ID
- 作成したアクセスキーID
- AWS Secret Access Key
- シークレットアクセスキー
- Default region name
- 例 : ap-northeast-1 (東京リージョン)
- Default output format
- json (推奨)
設定ファイルの場所は以下の通りである。
- ~/.aws/credentials
- アクセスキー情報
- ~/.aws/config
- リージョンや出力形式
接続テスト
DynamoDBテーブル一覧を取得する。
aws dynamodb list-tables
特定のテーブルの情報を取得する。
aws dynamodb describe-table --table-name MyTable
DynamoDBの基本操作 (CLI)
データの追加
# 単一アイテムの追加
aws dynamodb put-item \
--table-name MyTable \
--item '{
"id": {"S": "001"},
"name": {"S": "山田太郎"},
"age": {"N": "30"},
"email": {"S": "yamada@example.com"}
}'
データの取得
# 単一アイテムの取得
aws dynamodb get-item \
--table-name MyTable \
--key '{
"id": {"S": "001"}
}'
データのクエリ
# パーティションキーでのクエリ
aws dynamodb query \
--table-name MyTable \
--key-condition-expression "id = :id" \
--expression-attribute-values '{
":id": {"S": "001"}
}'
データのスキャン
# テーブル全体のスキャン (注意 : 大きなテーブルでは高コスト)
aws dynamodb scan \
--table-name MyTable \
--limit 10
データの更新 (UpdateItem)
# 既存アイテムの更新
aws dynamodb update-item \
--table-name MyTable \
--key '{
"id": {"S": "001"}
}' \
--update-expression "SET age = :newage" \
--expression-attribute-values '{
":newage": {"N": "31"}
}'
データの削除 (DeleteItem)
# 単一アイテムの削除
aws dynamodb delete-item \
--table-name MyTable \
--key '{
"id": {"S": "001"}
}'
Python SDK (boto3) の使用
以下の例では、Pythonを使用してAWS DynamoDBを操作している。
まず、boto3をインストールする。
pip3 install boto3 --user
# dynamodb_example.pyファイル
import boto3
from boto3.dynamodb.conditions import Key
# DynamoDBリソースの作成
dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
table = dynamodb.Table('MyTable')
# データの追加
def put_item():
response = table.put_item(
Item={
'id': '002',
'name': '佐藤花子',
'age': 25,
'email': 'sato@example.com'
}
)
print("PutItem成功:", response)
# データの取得
def get_item():
response = table.get_item(
Key={
'id': '002'
}
)
item = response.get('Item')
print("取得したアイテム:", item)
# データのクエリ
def query_items():
response = table.query(
KeyConditionExpression=Key('id').eq('002')
)
items = response.get('Items', [])
print("クエリ結果:", items)
# データの更新
def update_item():
response = table.update_item(
Key={
'id': '002'
},
UpdateExpression='SET age = :val',
ExpressionAttributeValues={
':val': 26
}
)
print("UpdateItem成功:", response)
# データの削除
def delete_item():
response = table.delete_item(
Key={
'id': '002'
}
)
print("DeleteItem成功:", response)
# メイン処理
if __name__ == '__main__':
put_item()
get_item()
update_item()
query_items()
# delete_item() # 削除する場合はコメント解除
# 実行方法 python3 dynamodb_example.py
デバッグ方法
# AWS CLIのデバッグモード
aws dynamodb list-tables --debug
# boto3のログ設定
import logging
logging.basicConfig(level=logging.DEBUG)
セキュリティ
アクセスキーの管理
- アクセスキーをコードに直接記述しない。
- GitHubなどにアクセスキーをコミットしない。
- 定期的にアクセスキーをローテーションする。(90日ごと推奨)
- 不要になったアクセスキーは削除する。
IAMポリシーの最小権限
- AWS DynamoDB専用のIAMユーザを作成する場合
{
"Version": "2026-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:ap-northeast-1:*:table/MyTable"
}
]
}
VPCエンドポイントの利用 (オプション)
EC2等のAWSリソースからアクセスする場合は、VPCエンドポイントを使用するとインターネットを経由せずにDynamoDBにアクセスすることができる。
トラブルシューティング
エラー : "An error occurred (AccessDeniedException)"
- 原因
- IAM権限不足
- 解決
- IAMユーザに適切なポリシーをアタッチする。
エラー : "ResourceNotFoundException"
- 原因
- テーブルが存在しない、またはリージョンが違う
- 解決
- テーブル名とリージョンを確認する。
エラー : "ValidationException"
- 原因
- データ型の不一致や必須キーの欠如
- 解決
- スキーマ定義を確認する。