こちらの投稿は2025 Japan AWS Jr.Championsの有志メンバーで作成した『30日間で主要AWSサービスを構築できるようになる』をテーマにした初学者向けのハンズオン問題集のDAY11になります!
問題集の趣旨や作成に至るまでの経緯は以下の記事をご覧いただければと思います。
📝 概要
| 項目 | 内容 |
|---|---|
| 所要時間 | 約1時間 |
| メインサービス | Amazon DynamoDB, Amazon VPC, Amazon EC2, IAM |
| 学べること | DynamoDB の基礎知識(サーバーレス, NoSQL), スキーマレスな設計, 自動マルチAZ |
| 想定費用 | 約50円(※EC2の実行時間により変動します) |
⚠️ 注意:以下のリソースを削除し忘れると課金が継続します。
🎯 課題内容
Amazon DynamoDBテーブルを作成し、VPC内のEC2からのみセキュアにアクセスできる環境を構築します。
その過程で、RDBと異なるNoSQLの「スキーマレス」構造と、DynamoDBがデフォルトで持つ高可用性(マルチAZ)の仕組みを理解します。
📊 アーキテクチャ図
🔧 実装機能
- Amazon DynamoDB テーブルの構築
- VPC、パブリックサブネットの作成
- EC2インスタンス(操作用)の構築とIAMロールの設定
- VPCエンドポイント(ゲートウェイ型)によるDynamoDBへのセキュアな通信経路
- セキュリティグループによるSSHアクセスの制御
💡 実装のヒント
スキーマレス (NoSQL)の特徴
RDB(Auroraなど)では、テーブル作成時に厳密な「スキーマ」(カラム定義)を決めます。DynamoDB (NoSQL) の場合、プライマリキー(PK)以外の属性は自由です。アイテム(行)ごとに追加の属性を持ったり、持たなかったりできます。
VPCエンドポイント
DynamoDBはVPCの「外」にあるサービスです。VPC内のEC2からインターネットを経由せずセキュアにDynamoDBにアクセスするために「VPCエンドポイント(ゲートウェイ型)」を使います。
✅ 完成後のチェックポイント
- DynamoDB テーブル (Users) が作成されている
- EC2インスタンスが起動している
- VPCエンドポイントが作成され、ルートテーブルに関連付けられている
- EC2からAWS CLIを使ってDynamoDBに接続できる
- 異なる属性(スキーマ)を持つ2つのアイテムを、同じテーブルに追加できる
🧰 使用資材
DynamoDBテーブル設定要件
-
テーブル名:
Users -
プライマリキー:
UserID(文字列, パーティションキー) -
テーブル設定: 「デフォルト設定」を使用
- (これにより、キャパシティーモードは「オンデマンド」に、暗号化は「AWS所有のキー」で有効になります)
動作確認用AWS CLIコマンド (EC2接続後に使用)
```bash
# (EC2接続後、リージョンを設定)
# ※東京リージョンの場合
export AWS_REGION=ap-northeast-1
# 接続テスト (SQL: SHOW DATABASES; の代わり)
aws dynamodb list-tables
#
# --- スキーマレス体験 (SQL: INSERT の代わり) ---
#
# 1. UserID と Username を持つアイテムを挿入
aws dynamodb put-item
--table-name Users
--item '{"UserID": {"S": "user001"}, "Username": {"S": "Alice"}}'
# 2. UserID, Username, Email を持つアイテムを挿入
aws dynamodb put-item
--table-name Users
--item '{"UserID": {"S": "user002"}, "Username": {"S": "Bob"}, "Email": {"S": "bob@example.com"}}'
# 3. UserID と Age (数値) を持つアイテムを挿入
aws dynamodb put-item
--table-name Users
--item '{"UserID": {"S": "user003"}, "Age": {"N": "30"}}'
#
# --- データ確認 ---
#
# データ全体確認 (SQL: SELECT * FROM users; の代わり)
# ※アイテムごとに属性がバラバラ(スキーマレス)であることを確認
aws dynamodb scan --table-name Users
# データ個別確認 (SQL: SELECT * FROM users WHERE id = ... の代わり)
aws dynamodb get-item
--table-name Users
--key '{"UserID": {"S": "user002"}}'
```
🔗 リファレンスリンク
🛠️ 解答・構築手順(クリックで開く)
解答と構築手順を見る
✅ ステップ1: VPCとパブリックサブネットの作成
- VPCコンソールで「VPCを作成」→「VPCなど」を選択。
-
設定値:
- 名前タグ:
dynamodb-handson - アベイラビリティーゾーン数: 1 (シンプル化のため)
- パブリックサブネット数: 1
- プライベートサブネット数: 0
- NATゲートウェイ: なし
- VPCエンドポイント: なし (後で手動作成)
- 名前タグ:
- 「VPCを作成」をクリック。
✅ ステップ2: セキュリティグループの作成 (EC2用)
- VPCコンソール > セキュリティグループ で「セキュリティグループを作成」。
-
名前:
dynamodb-handson-ec2-sg -
VPC: ステップ1で作成したVPC (
dynamodb-handson) を選択。 - インバウンドルール: タイプ: SSH, ポート: 22, ソース: マイIP
✅ ステップ3: IAMロールの作成 (EC2用)
- IAMコンソール > ロール で「ロールを作成」。
- 信頼されたエンティティ: 「AWSのサービス」
- ユースケース: 「EC2」を選択し、「次へ」。
-
許可ポリシー:
AmazonDynamoDBFullAccessを検索してチェック。(ハンズオン用) - 「次へ」進み、ロール名に
dynamodb-handson-ec2-roleと入力し、「ロールを作成」。
✅ ステップ4: EC2インスタンスの作成 (操作用)
- EC2コンソールで「インスタンスを起動」。
-
名前:
dynamodb-operator - AMI: Amazon Linux 2023 (無料枠)
-
インスタンスタイプ:
t3.microまたはt2.micro(無料枠) - キーペア: 既存のもの、または新規作成。
-
ネットワーク設定:
- VPC: ステップ1のVPC (
dynamodb-handson) - サブネット: ステップ1のパブリックサブネット
- パブリックIPの自動割り当て: 有効
- セキュリティグループ: ステップ2のSG (
dynamodb-handson-ec2-sg) を選択。
- VPC: ステップ1のVPC (
-
高度な詳細:
-
IAMインスタンスプロファイル: ステップ3のIAMロール (
dynamodb-handson-ec2-role) を選択。
-
IAMインスタンスプロファイル: ステップ3のIAMロール (
- 「インスタンスを起動」をクリック。
✅ ステップ5: DynamoDB テーブルの作成
- DynamoDBコンソール > テーブル で「テーブルの作成」。
-
テーブル名:
Users -
パーティションキー:
UserID, 型:String -
テーブル設定: 「デフォルト設定」のチェックボックスをオンのままにします。
- (ここでPK以外の属性(Username, Emailなど)を定義しないのがRDBとの違いです)
- 「テーブルの作成」をクリック。
✅ ステップ6: VPCエンドポイントの作成
- VPCコンソール > エンドポイント で「エンドポイントの作成」。
-
サービス:
com.amazonaws.ap-northeast-1.dynamodb(「dynamodb」で検索し、Type: Gateway のものを選択) -
VPC: ステップ1のVPC (
dynamodb-handson) を選択。 - ルートテーブル: ステップ1で作成されたパブリックサブネットのルートテーブルのチェックボックスをオンにします。
- 「エンドポイントの作成」をクリック。
✅ ステップ7: 動作確認 (スキーマレス体験)
-
ステップ4で作成したEC2インスタンス (
dynamodb-operator) にSSHで接続します。ssh -i your-key.pem ec2-user@[EC2のパブリックIP] -
「🧰 使用資材」セクションにある AWS CLIコマンド を順番に実行します。
-
aws dynamodb scan --table-name Usersを実行した際、以下のようにアイテムごとに追加した属性が異なっていても、すべて同じテーブルに保存されていることを確認します。{ "Items": [ { "Username": {"S": "Alice"}, "UserID": {"S": "user001"} }, { "Email": {"S": "bob@example.com"}, "Username": {"S": "Bob"}, "UserID": {"S": "user002"} }, { "Age": {"N": "30"}, "UserID": {"S": "user003"} } ], ... }
🧹 片付け(リソース削除)
-
EC2 インスタンスを終了 (
dynamodb-operator) - VPC エンドポイントを削除
-
DynamoDB テーブルを削除 (
Users) -
IAMロールを削除 (
dynamdodb-handson-ec2-role) -
VPC を削除 (
dynamodb-handson) (関連するSG、サブネット、IGWなども一緒に削除されます)
🏁 おつかれさまでした!
この課題では、VPCエンドポイント経由でのセキュアな接続に加え、RDBとは根本的に異なるDynamoDBの「スキーマレス」という柔軟なデータ構造を体験できました。また、AuroraのマルチAZ構成(フェイルオーバー)と比較することで、DynamoDBのデフォルトで高可用なサーバーレスアーキテクチャの利点も理解できたかと思います。
