ステップ3:EC2,Aurora PostgreSQLを利用した注文情報の保存
今回のステップの概要とECサイトとの関連について
このステップでは、前回構築したEC2上のWebサイトにデータベース機能を追加します。具体的には、AWS Aurora PostgreSQLを使って、ECサイトの注文情報を保存・管理できるようにします。
ECサイトにとって、データベースは「お店の在庫管理システムや売上記録」のような役割を果たします。お客さんが商品を注文すると、その情報をデータベースに保存することで、注文履歴の管理や在庫の更新などができるようになります。
ステップ2では「お店の建物」を作りましたが、このステップ3では「お店の管理システム」を構築することになります。これにより、ECサイトの基本的な機能が完成します。
このステップで学ぶこと
- Aurora PostgreSQLデータベースの作成方法
- データベースのセキュリティ設定
- EC2インスタンスからデータベースへの接続方法
- Next.jsアプリケーションとデータベースの連携方法
リソースの関わりと構成説明
ステップ3で作成するリソースは、ECサイトのデータ管理機能を構築するものです。それぞれのリソースがECサイトにどのように関わるのかを説明します。
Aurora PostgreSQLとECサイトの関わり
Aurora PostgreSQLデータベース「ECサイトDBクラスター」は、ECサイトの「バックヤード」に相当します。お客さん(ユーザー)の情報、商品情報、注文情報などを保存・管理する場所です。これにより、ECサイトは単なる情報表示だけでなく、実際の商取引を行うことができるようになります。
データベースセキュリティグループとECサイトの関わり
セキュリティグループ「ECサイトDBSG」は、データベースの「セキュリティゲート」のような役割を果たします。EC2インスタンス(Webサーバー)からのアクセスのみを許可し、インターネットからの直接アクセスを禁止することで、データベースのセキュリティを確保します。これは、お店のバックヤードに店員しか入れないようにするのと同じです。
データベーステーブルとECサイトの関わり
データベーステーブル(orders, order_items)は、ECサイトの「帳簿」のような役割を果たします。
- ordersテーブル:注文情報を管理します。誰が、いつ、いくらの商品を注文したかを記録します。
- order_itemsテーブル:注文の詳細情報を管理します。1つの注文に含まれる商品の種類や数量を記録します。
Next.jsアプリケーションとデータベースの連携
Next.jsアプリケーションとデータベースの連携は、「店員」がバックヤードから商品を取り出したり、注文情報を記録したりするような役割を果たします。アプリケーションはデータベースからデータを取得して表示したり、ユーザーの操作に応じてデータベースにデータを保存したりします。
実際の手順
実際の手順では、たくさんの設定値を入力することになります。 本文中に設定値が指定されていない場合は、デフォルト値のまま作業を進めてください。
1. Aurora PostgreSQLデータベースの作成
1-1. RDSダッシュボードにアクセス
1-2. データベースの作成
- 左側のメニューから「データベース」をクリックします。
- 「データベースの作成」ボタンをクリックします。
- 「データベース作成方法の選択」:「標準作成」を選択します。
- 「エンジンのオプション」:
- エンジンタイプ:「Amazon Aurora」を選択します。
- エディション:「Amazon Aurora PostgreSQL 互換エディション」を選択します。
- 利用可能なバージョン:最新の推奨バージョンを選択します。

【解説】Auroraを選ぶ理由とRDSとの違い
AuroraはAWSが提供する高性能なデータベースサービスで、従来のRDS(リレーショナルデータベースサービス)よりも高速で信頼性が高いのが特徴です。MySQLやPostgreSQLと互換性があり、既存のアプリケーションもそのまま使えます。Auroraは自動でデータを複数の場所に保存し、障害が起きてもすぐに復旧できる仕組みがあります。また、必要に応じて自動でストレージ容量が増えるので、運用の手間が少なくなります。コスト効率も高く、パフォーマンスと安全性を両立したい場合におすすめです。
1-3. テンプレートの選択
- 「テンプレート」:「開発/テスト」を選択します。
(注:実際の本番環境では「本番稼働」を選択しますが、学習目的では「開発/テスト」が適しています)
【解説】開発/テストテンプレートを選ぶ理由
学習や検証目的では「開発/テスト」テンプレートを選ぶことで、コストを抑えながら必要な機能を試すことができます。本番環境用の設定では高い可用性や冗長構成が自動で有効になり、複数インスタンスが起動して料金が高くなりがちです。まずはシンプルな構成で始め、必要に応じて本番用に切り替えるのが安心です。Auroraの高い可用性や信頼性についてはAWS公式ドキュメント も参考にしてください。
1-4. 設定
- 「DBクラスター識別子」:「ec-site-db-cluster」と入力します。
- 「認証情報の設定」:
- 「AWS Secrets Manager で管理」を選択します。

【解説】Secrets Managerで認証情報を管理する理由
データベースのユーザー名やパスワードを安全に管理するために、AWS Secrets Managerを使うのが推奨されています。Secrets Managerを使うと、認証情報を暗号化して安全に保存でき、必要なときだけ自動でアプリケーションに渡すことができます。これにより、パスワードの漏洩リスクが減り、セキュリティが大きく向上します。手作業で設定ファイルに書くよりも安全で、運用も簡単になります。
1-5. インスタンスの設定
- 「インスタンスの設定」:
- 「DBインスタンスクラス」:「Serverless v2」を選択します。
- クラスターストレージ設定:「スタンダード」を選択します。
- 最小キャパシティ:「0」と入力します。
- 最大キャパシティ:「1」と入力します。

【解説】最小ACUと自動一時停止でコスト最適化(Aurora Serverless v2)
Aurora Serverless v2 は最小キャパシティを 0 ACU に設定し、非アクティブ時間(5分〜24時間)を指定すると、アイドル時に自動一時停止してコンピューティング課金をゼロにできます。利用再開時は自動で起動し、負荷に応じて ACU が秒単位でスケールします。開発・検証や夜間アイドルの多い環境では「Min=0 ACU」「Max は想定負荷に合わせる」構成が有効です。料金は一時停止中でもストレージ等が発生する点、特定の構成では一時停止できない場合がある点に留意してください。詳しくは「Aurora Serverless v2 の自動一時停止と再開」「Aurora 料金」を参照してください(公式ガイド 、料金 )。
1-6. 接続
- 「EC2コンピューティングリソースに接続」を選択します。
- 「EC2インスタンス」でec-site-webを選択します。
- 「DBサブネットグループ」で自動セットアップを選択します。
- 「VPCセキュリティグループ(ファイアウォール)」で新規作成を選択し、「ec-site-db-sg」をグループ名で指定します。

1-7. データベースの作成
- 「データベースの作成」ボタンをクリックします。
- データベースの作成には10〜15分程度かかります。ステータスが「利用可能」になるまで待ちます。
- ec-site-db-cluster と ec-site-db-cluster-instance-1の2つが表示されるはずです。

【解説】ClusterとCluster-instanceの違い
Auroraでは「クラスター」と「クラスターインスタンス」という2つの単位が表示されます。クラスターはデータの本体や設定をまとめたグループで、クラスターインスタンスは実際にデータベースとして動くサーバーのことです。1つのクラスターに複数のインスタンスを追加して、障害時の自動切り替えや負荷分散ができる仕組みになっています。これにより、高い可用性と拡張性を実現しています。
2. セキュリティグループの設定
2-1. EC2セキュリティグループの確認
- EC2ダッシュボードに移動します。
- 左側のメニューから「セキュリティグループ」をクリックします。
- ステップ1で作成した「ec-site-web-sg」を選択します。
- セキュリティグループIDをメモします(例:sg-0123456789abcdef)。
2-2. RDSセキュリティグループの設定
- RDSダッシュボードに戻ります。
- 左側のメニューから「データベース」をクリックし、作成したデータベース「ec-site-db-cluster」を選択します。
- 「接続とセキュリティ」タブをクリックします。
- 「接続されたコンピューティングリソース」の「rds-ec2-*」と「ec2-rds-*」があることを確認します。
- 「rds-ec2-2」は作成した「ec-site-db-cluster」にアタッチされているセキュリティグループです。
- 「ec2-rds-2」は作成した「ec-site-web」にアタッチされているセキュリティグループです。
- rds-ec2-2にはec2-rds-2から5432ポートの接続ができるように設定が施されています。

TODO: TBDわかりやすく図を表示する
3. EC2インスタンスからデータベースへの接続
3-1. DB接続情報の取得
- RDSダッシュボードに戻ります。
- 左側のメニューから「データベース」をクリックし、作成したデータベース「ec-site-db-cluster」を選択します。
- 「設定」タブをクリックします。

- 「マスター認証情報ARN」の「Secrets Manager で管理する」をクリックすると別タブが開きます。
- 「概要」タブの「シークレットの値を取得する」を押すと「username」と「password」が記載されているのでメモをします。

3-2. EC2インスタンスへのSession Manager接続
- EC2ダッシュボードの「インスタンス」画面で、ステップ1で作成したインスタンス「ec-site-web」を選択します。
- 「接続」ボタンをクリックします。
- 「接続方法」画面で「Session Manager」タブを選択します。
- 「接続」ボタンをクリックします。
- 新しいブラウザタブが開き、EC2インスタンスのターミナルセッションが表示されます。
3-3. PostgreSQLクライアントのインストール
- 以下のコマンドを実行して、PostgreSQLクライアントをインストールします:
sudo dnf install postgresql16 -y3-4. データベースエンドポイントの確認
- RDSダッシュボードの「データベース」画面で、作成したデータベース「ec-site-db-cluster」を選択します。
- 「接続とセキュリティ」タブで、「エンドポイント」をメモします。 (例:ec-site-db-cluster.cluster-abcdefghijkl.us-east-1.rds.amazonaws.com)

3-5. データベース接続テスト
- EC2インスタンスのSession Managerターミナルで、以下のコマンドを実行してデータベースに接続します:
- {username}は3-1でメモしたものです。
- {エンドポイント}は3-4でメモしたものです。
psql -h {エンドポイント} -U {username}
# 以下のようなコマンドになります。
# 例)psql -h ec-site-db-cluster.cluster-xxx.us-east-1.rds.amazonaws.com -U postgres- パスワードを求められたら、3-1でメモしたパスワードを入力します。
- 接続に成功すると、PostgreSQLのプロンプト(postgres=>)が表示されます。
以下のような出力が表示されればOKです。
[root@ip-10-2-1-174 bin]# psql -h ec-site-db-cluster.cluster-abcdefghijkl.us-east-1.rds.amazonaws.com -U postgres
Password for user postgres: <---ここでパスワードを入力
psql (15.13, server 16.6)
WARNING: psql major version 15, server major version 16.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
postgres=>
- 以下のコマンドを実行して、接続を確認します:
SELECT current_database(), current_user;以下のような出力が表示されればOKです。
postgres=> SELECT current_database(), current_user;
current_database | current_user
------------------+--------------
postgres | postgres
(1 row)\qと入力してPostgreSQLを終了します。
4. データベーステーブルの作成
4-1. テーブル設計の確認
今回は、ECサイトに必要な基本的なテーブルを作成します。一般的なECサイトでは以下のようなテーブルが必要です:
- orders(注文情報)
- order_items(注文商品詳細)
4-2. テーブル作成スクリプトの作成
- EC2インスタンスのSession Managerターミナルで、以下のコマンドを実行しDBに接続します。
psql -h {エンドポイント} -U {username}
# 以下のようなコマンドになります。
# 例)psql -h ec-site-db-cluster.cluster-xxx.us-east-1.rds.amazonaws.com -U postgres- パスワードを求められたら、3-1でメモしたパスワードを入力します。
- 接続に成功すると、PostgreSQLのプロンプト(postgres=>)が表示されます。
- 以下のコマンドを実行して、テーブルを作成します。
-- 注文テーブル
CREATE TABLE public.orders (
id SERIAL PRIMARY KEY,
user_id INTEGER,
total_amount DECIMAL(10, 2) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'pending',
shipping_address TEXT,
payment_method VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 注文商品テーブル
CREATE TABLE public.order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER REFERENCES orders(id),
product_id INTEGER,
quantity INTEGER NOT NULL,
price DECIMAL(10, 2) NOT NULL
);
-
\dt コマンドを実行しテーブルが作成されたか確認します。
# 例 postgres=> \dt List of relations Schema | Name | Type | Owner --------+--------------------+----------+---------- public | order_items | table | postgres public | orders | table | postgres (2 rows) -
\qと入力してPostgreSQLを終了します。
5. Next.jsアプリケーションとデータベースの連携
5-1. DB接続情報の取得
- RDSダッシュボードに戻ります。
- 左側のメニューから「データベース」をクリックし、作成したデータベース「ec-site-db-cluster」を選択します。
- 「設定」タブをクリックします。
- 「マスター認証情報ARN」の「Secrets Manager で管理する」をクリックすると別タブが開きます。
- 「シークレットの詳細」の「シークレットのARN」をメモをします。 (注釈:このARNをWebアプリケーションに伝え、接続情報を自動で取得してもらいます。)

5-2. 管理者権限で接続
- ここから先はroot権限で作業することが多いので特権管理者になりましょう
sudo suroot@ip-xx-xx-xx-xxxのように@の左がrootと表示されていればOKです。
(注意:特権管理者モードではOSにまつわる各種ファイルの変更削除もできるようになっています。業務で利用する場合は知らないコマンドは実行しないようにしましょう。)
5-3. ECサイトのソースコードの取得と設定
- ホームディレクトリに移動します:
cd ~- 準備されているNextjsのECサイトのソースコードをコピーし解凍します:
aws s3 cp s3://tenarai-blueprint-sample-code-983911888049-us-east-1/ec-site-tenarai-sample/ecommerce-app-v1.zip ~/ecommerce-app-v1.zip
unzip ecommerce-app-v1.zipll以下のように所有者(3列目)がroot、ecommerce-app-v1が表示されていればOKです。
[root@ip-xx-xx-xx-xxx ~]# ll
total 4836
drwxr-xr-x. 3 root root 56 Jun 1 06:20 __MACOSX
drwx------. 8 root root 16384 Jun 1 05:45 ecommerce-app-v0
-rw-r--r--. 1 root root 4934796 Jun 1 05:45 ecommerce-app-v0.zip
drwx------. 8 root root 16384 Jun 1 05:45 ecommerce-app-v1
-rw-r--r--. 1 root root 4934796 Jun 1 05:45 ecommerce-app-v1.zip- プロジェクトディレクトリに移動します:
cd ecommerce-app-v1echo 'AURORA_SECRET_ARN=${シークレットARN}' > .env
# 例) echo 'AURORA_SECRET_ARN=arn:aws:secretsmanager:us-east-1:123456789012:secret:rds-db-credentials/aurora-postgresql-cluster-xxxxxx' > .env以下のような出力が表示されればOKです。
[root@ip-10-2-1-174 ecommerce-app-v1]# cat .env
AURORA_SECRET_ARN=arn:aws:secretsmanager:us-east-1:615402060229:secret:rds!cluster-702dea55-2c16-4bd0-8ae3-ccc5b7cea14f-xklW9xpnpm install
pnpm build5-4. アプリケーションの再起動
- 既存のアプリケーションをすべて削除します:
pm2 delete all
pm2 unstartup systemd以下のような出力が表示されればOKです。
[root@ip-10-2-1-174 ecommerce-app-v1]# systemctl status pm2-root.service
Unit pm2-root.service could not be found.- 以下のコマンドを実行して、PM2でアプリケーションを再起動します:
pm2 start以下のような出力が表示されればOKです。
[root@ip-10-2-1-174 ecommerce-app-v1]# pm2 start
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2][WARN] Applications ecommerce-app-v1 not running, starting...
[PM2] App [ecommerce-app-v1] launched (1 instances)
┌────┬─────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├────┼─────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ ecommerce-app-v1 │ default │ N/A │ fork │ 4134 │ 0s │ 0 │ online │ 0% │ 33.4mb │ root │ disabled │
└────┴─────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘pm2 save
pm2 startup- 以下のコマンドを実行して、アプリケーションのログを確認します:
pm2 logsエラーが表示されなければ、正常に起動しています。Ctrl+Cでログ表示を終了します。
6. 動作確認
- ブラウザを開き、EC2インスタンスのパブリックIPアドレスにアクセスします(例:http://xx.xx.xx.xx)。
- ECサイトのトップページが表示されることを確認します。

- 商品一覧や商品詳細ページが正常に表示されることを確認します。
- 商品をカートに追加し、注文処理が正常に行われることを確認します。

- 注文完了後、データベースに注文情報が保存されていることを確認します:
psql -h <エンドポイント> -U postgres -c "SELECT * FROM public.orders;"
# 以下のような結果が表示されるはずです
# 例)
# [root@ip-10-0-7-123 ecommerce-app-v1]# psql -h ec-site-db-cluster.cluster-c67r3f8qmkpo.us-east-1.rds.amazonaws.com -U postgres -c "SELECT * FROM public.orders;"
# Password for user postgres:
# id | user_id | total_amount | status | shipping_address | payment_method | created_at
# ----+---------+--------------+---------+-------------------+-------------------+----------------------------
# 1 | | 175000.00 | pending | aaa, aa, aa, 日本 | dummyBankTransfer | 2025-06-07 14:14:10.905522
# 2 | | 215500.00 | pending | a, a, a, 日本 | dummyBankTransfer | 2025-06-07 14:14:25.701663
# (2 rows)このステップで何をしたのか
このステップでは、ECサイトにデータ永続化機能を追加するためにAurora PostgreSQLデータベースを構築しました。プライベートサブネットにデータベースを配置し、セキュリティグループを設定してEC2インスタンスからのみアクセスできるようにしました。また、ユーザー情報、商品情報、注文情報などを管理するためのテーブルを作成し、Next.jsアプリケーションとデータベースを連携させました。
ECサイトでどのような影響があるのか
データベースの追加により、ECサイトは単なる情報表示だけでなく、実際の商取引を行えるようになりました。ユーザーが商品を注文すると、その情報がデータベースに保存され、後から参照できるようになります。また、商品の在庫管理や顧客情報の管理も可能になり、ECサイトとしての基本的な機能が完成しました。これは、お店にレジシステムと在庫管理システムが導入された状態に相当します。
実践チェック:画面キャプチャで証明しよう
以下のチェック項目について、実際にAWSマネジメントコンソールで設定ができていることを確認し、各項目ごとに該当画面のスクリーンショットを撮影して提出してください。
- Aurora PostgreSQLデータベース「ECサイトDBクラスター」が正常に作成され、ステータスが「利用可能」になっている
- データベースセキュリティグループ「ECサイトDBSG」が正しく設定されている(EC2からの接続のみ許可)
- EC2インスタンスからデータベースに接続できる
- 必要なテーブル(orders, order_items)が正しく作成されている
- Next.jsアプリケーションがデータベースと連携し、正常に動作している
- ECサイトで商品を注文すると、データベースに注文情報が保存される
- EC2を再起動しても同じWebアプリケーションが表示される
提出方法: 各項目ごとにスクリーンショットを撮影し、まとめて提出してください。 ファイル名やコメントで「どの項目か」が分かるようにしてください。
構成図による理解度チェック
ステップ2の構成図に、このステップで作成したデータベースリソースを追記して、現在のインフラ構成を完成させましょう。
なぜ構成図を更新するのか?
- コンポーネントの追加: Webサーバー(EC2)に加えて、データを永続化するためのデータベースがどのようにシステムに組み込まれるかを理解します。
- ネットワーク分離の理解: なぜデータベースを直接インターネットに接続できないプライベートサブネットに配置するのか、そのセキュリティ上の重要性を視覚的に把握します。
- セキュリティ設定の可視化: EC2インスタンスからデータベースへの通信をどのようにセキュリティグループで制御しているかを図で確認します。
構成図の書き方(追記)
ステップ2で作成した構成図をベースに、以下のリソースを追記してみましょう。
- Aurora PostgreSQL: プライベートサブネット(例:
ec-site-private-us-east-1a)の中にAurora DBクラスターを描きます。 - データベースセキュリティグループ: 作成したDBクラスターを囲むようにセキュリティグループ(
ec-site-db-sg)を描きます。 - 通信経路: パブリックサブネットにあるEC2インスタンスから、プライベートサブネットにあるDBクラスターへの通信経路を矢印で示します。この矢印が、2つのセキュリティグループ(
ec-site-web-sgとec-site-db-sg)を通過することを示します。
💡 ヒント: このステップのポイントは、「Webサーバー(フロント)」と「データベース(バックエンド)」が異なるネットワーク領域に配置され、セキュリティグループによって安全に通信している様子を表現することです。
理解度チェック:なぜ?を考えてみよう
AWSの各リソースや設計には、必ず“理由”や“目的”があります。 下記の「なぜ?」という問いに自分なりの言葉で答えてみましょう。 仕組みや設計意図を自分で説明できることが、真の理解につながります。 ぜひ、単なる暗記ではなく「なぜそうなっているのか?」を意識して考えてみてください。
Q. なぜデータベースを直接インターネットに接続できないプライベートサブネットに配置するのでしょうか?
Q. データベースを自分でEC2サーバーの中に作るのではなく、AWSの「RDS」や「Aurora」といったマネージドサービスを使うのはなぜでしょうか? (ヒント:自分でサーバーを管理する場合と、Auroraのようなマネージドサービスを使う場合の違いを考えてみましょう)
Q. RDSやAuroraでは、「読み取り専用(リーダー)」と「書き込み専用(ライター)」のように、役割の違うインスタンスを分けて使うのはなぜでしょうか? (ヒント:全部1台でやる場合と、役割を分ける場合のメリット・デメリットを考えてみましょう)
今回のステップで利用したAWSサービス名一覧
- EC2 (Elastic Compute Cloud):仮想サーバーを提供するサービス
- Systems Manager:AWSリソースを安全に管理するためのサービス
- Aurora PostgreSQL:高性能なマネージドリレーショナルデータベースサービス
- RDS (Relational Database Service):Auroraを含むリレーショナルデータベースを管理するサービス
- VPC (Virtual Private Cloud):AWS上に構築する仮想ネットワーク
- セキュリティグループ:トラフィックの許可ルールを定義し、EC2やAuroraやALBなどのAWSリソースへの通信を制御する仮想ファイアウォール
