はじめに
「EC2サーバでデータベースを動かしたい」「EC2同士の通信をセキュアに制御したい」——そのステップがこのハンズオンです。
この記事では、AWSコンソール(GUI)のみを使って、MySQL互換のDBサーバー(MariaDB)が動作するEC2インスタンスをゼロから手動構築するハンズオンを紹介します。
インターネット
↓ SSH(22) ← 自分のIPのみ
↓ MySQL(3306) ← 自分のIPのみ(初期テスト用)
my-ec2-mysql-db-sg(DBサーバSG)
↓ MySQL(3306) ← my-ec2-mysql-client-sg に属するEC2のみ ★SG参照
EC2インスタンス(DBサーバ) EC2インスタンス(クライアント)
└── MariaDB 10.5 └── mysqlコマンド(接続テスト用)
└── sampledb(DB) ↑
my-ec2-mysql-client-sg(クライアントSG)
↓ SSH(22) ← 自分のIPのみ
インターネットこのハンズオンで体験できること:
- セキュリティグループの SG参照(SG-to-SG) による EC2間通信制御
- EC2サーバへの MariaDB(MySQL互換)インストールと初期設定
- 2台のEC2(DBサーバ + クライアント)を使った実際のDB接続確認
- IPアドレス指定 vs SG参照の違いを体感
このハンズオンのポイント:
DBサーバのMySQLポート(3306)を「特定のIPアドレス」ではなく「特定のセキュリティグループに属するEC2」だけに開放します。これが SG参照(SG-to-SG) と呼ばれる設定方法で、IPが変わっても自動的に制御できる、本番環境でも使われるセキュアな設計です。
この記事は CloudFormation版ハンズオン の比較記事です。
コンソール操作でSG参照の仕組みを視覚的に学び、CloudFormationとの違いを比較したい方向けです。
-->
キーワード解説
| 用語 | 意味 |
|---|---|
| EC2(Elastic Compute Cloud) | AWSの仮想サーバーサービス。今回は2台(DBサーバ・クライアント)を起動する |
| MariaDB | MySQLから派生したオープンソースのデータベース。コマンド・構文・接続方法がMySQLと完全互換 |
| セキュリティグループ(SG) | EC2への通信を制御するファイアウォール。今回は2つのSGを作成する |
| SG参照(SG-to-SG) | アクセス元としてIPアドレスではなく別のセキュリティグループを指定する設定。そのSGに属するEC2全体を対象にできる |
| プライベートIPアドレス | AWSのVPC内でのみ使用できるIPアドレス。EC2間の通信にはプライベートIPを使う |
| UserData | EC2の初回起動時のみ自動実行されるシェルスクリプト。今回はMariaDBのインストール・初期設定に使う |
| IAMロール | EC2にAWSサービスを利用する権限を付与する仕組み |
IPアドレス指定 vs SG参照
今回のハンズオンで学ぶ「SG参照」がなぜ重要かを確認します。
| 比較項目 | IP指定(前回まで) | SG参照(今回) |
|---|---|---|
| アクセス元の指定方法 | 123.456.78.901/32(IPアドレス) | sg-xxxxx(セキュリティグループID) |
| 対象 | 指定したIPのみ | そのSGに属するEC2全体 |
| IPが変わった場合 | 設定変更が必要 | 自動的に制御(変更不要) |
| EC2を増やした場合 | 追加EC2のIPも個別に設定が必要 | SGに追加するだけで自動的に許可 |
| 用途 | 自分のPCからの接続、外部サービスからの接続 | APサーバ→DBサーバなどEC2間通信の制御 |
前フェーズとの比較
| 比較項目 | Phase 1-1 Apache | Phase 1-2 Tomcat | Phase 1-3 MySQL(今回) |
|---|---|---|---|
| 役割 | Webサーバー | APサーバー | DBサーバー |
| ポート | 80 | 8080 | 3306 |
| SGのアクセス元 | 自分のIP | 自分のIP | クライアントSG参照 |
| EC2台数 | 1台 | 1台 | 2台(DB + クライアント) |
使用するAWSサービス
| サービス | 役割 | 料金 |
|---|---|---|
| EC2 × 2台 | DBサーバ + クライアント(各t2.micro) | 月750時間まで無料枠あり(2台で消費が倍) |
| セキュリティグループ × 2 | DBサーバSG / クライアントSGのアクセス制御 | 無料 |
| IAM | EC2へのSession Manager接続権限 | 無料 |
| EBS × 2 | EC2にアタッチされるストレージ(各8GB) | 月30GBまで無料枠あり |
注意: EC2を2台同時に稼働させるため、無料枠の消費が2倍になります。ハンズオン後は必ず2台とも削除してください。
構築するリソース
| リソース | 役割 |
|---|---|
| キーペア | SSH接続の認証鍵(DBサーバ・クライアント両方で使用) |
| IAMロール | EC2にSession Manager接続の権限を付与 |
| クライアントSG | クライアントEC2(APサーバ役)に適用するSG |
| DBサーバSG | DBサーバEC2に適用するSG(クライアントSGを参照) |
| DBサーバEC2 | MariaDBが動作するDBサーバ本体 |
| クライアントEC2 | mysqlコマンドでDB接続テストを行うEC2(APサーバ役) |
全体の作業順序
依存関係があるため、必ずこの順番で作成します。
⓪ 自分のIPアドレスを確認する(重要)
↓
① キーペアを作成する
↓
② IAMロールを作成する
↓
③ クライアントSGを作成する(先に作成する必要がある)
↓
④ DBサーバSGを作成する(③のSGを参照する)
↓
⑤ DBサーバEC2を起動する
↓
⑥ クライアントEC2を起動する
↓
⑦ 動作確認(DBサーバ・クライアント)
↓
⑧ リソースを削除する【重要】⓪ 自分のIPアドレスを確認する
セキュリティグループで自分のIPだけを許可するために、正確なIPアドレスを事前に確認します。
方法A: ルーター管理画面で確認(推奨)
- ブラウザで以下のURLにアクセスします(ルーターによって異なります)
http://192.168.0.1 または http://192.168.1.1 - 「ネットワークマップ」または「インターネット」項目を開く
- **「インターネットIPアドレス」または「WAN IPアドレス」**の値を控えます
方法B: コマンドで確認
curl https://checkip.amazonaws.com控えておく情報: 自分のIPアドレス(例: 203.0.113.1)
① キーペアの作成
DBサーバとクライアントEC2の両方のSSH接続に使います。1つのキーペアを共用します。
AWSコンソール → EC2 → ネットワーク&セキュリティ → キーペア → 「キーペアを作成」
| 設定項目 | 値 |
|---|---|
| 名前 | my-ec2-mysql-key |
| キーペアのタイプ | RSA |
| プライベートキーファイル形式 | .pem |
「キーペアを作成」をクリックすると my-ec2-mysql-key.pem がダウンロードされます。
C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem注意:
.pemファイルは再ダウンロードできません。紛失した場合は新しいキーペアを作成する必要があります。
② IAMロールの作成
AWSコンソール → IAM → ロール → 「ロールを作成」
| ステップ | 設定項目 | 値 |
|---|---|---|
| 1 | 信頼されたエンティティタイプ | AWSのサービス |
| 1 | ユースケース | EC2 |
| 2 | 許可ポリシー | AmazonSSMManagedInstanceCore |
| 3 | ロール名 | my-ec2-mysql-role |
「ロールを作成」をクリック。
③ クライアントSGの作成
なぜ先に作るか: DBサーバSGの設定でクライアントSGを「参照先」として指定する必要があるため、先に作成しておく必要があります。
AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」
| 設定項目 | 値 |
|---|---|
| セキュリティグループ名 | my-ec2-mysql-client-sg |
| 説明 | MySQL client SG (AP server role) |
| VPC | デフォルトVPC(変更不要) |
インバウンドルール(「ルールを追加」):
| タイプ | プロトコル | ポート | ソース | 説明 |
|---|---|---|---|---|
| SSH | TCP | 22 | 203.0.113.1/32(自分のIP) | SSH from my IP |
アウトバウンドルールを確認します:
SG作成画面の「アウトバウンドルール」欄に以下のルールが自動設定されていることを確認します。
| タイプ | 送信先 |
|---|---|
| すべてのトラフィック | 0.0.0.0/0 |
重要: このアウトバウンドルールがないとEC2がインターネットに出られず、
dnf installでパッケージをダウンロードできなくなります。自動設定されていない場合は「ルールを追加」で追加してください。
「セキュリティグループを作成」をクリック。
④ DBサーバSGの作成(SG参照の設定)
AWSコンソール → EC2 → セキュリティグループ → 「セキュリティグループを作成」
| 設定項目 | 値 |
|---|---|
| セキュリティグループ名 | my-ec2-mysql-db-sg |
| 説明 | MySQL DB server SG |
| VPC | デフォルトVPC(変更不要) |
インバウンドルール(「ルールを追加」で3ルール追加します):
ルール1: SSH(管理用)
| 設定項目 | 値 |
|---|---|
| タイプ | SSH |
| ソースタイプ | カスタム |
| ソース | 203.0.113.1/32(自分のIP) |
ルール2: MySQL(クライアントSGからの接続)← このハンズオンの核心
| 設定項目 | 値 |
|---|---|
| タイプ | MySQL/Aurora |
| ソースタイプ | カスタム |
| ソース | 検索ボックスに my-ec2-mysql-client-sg と入力して選択 |
| 説明 | MySQL from client SG only |
ここがSG参照: ソースとして「IPアドレス」ではなく「セキュリティグループ」を指定しています。
my-ec2-mysql-client-sgに属するEC2からのMySQL接続のみを許可し、インターネットからは接続できません。
ルール3: MySQL(自分のIPからの接続)← 初期テスト・確認用
| 設定項目 | 値 |
|---|---|
| タイプ | MySQL/Aurora |
| ソースタイプ | カスタム |
| ソース | 203.0.113.1/32(自分のIP) |
| 説明 | MySQL from my IP (for initial testing) |
アウトバウンドルールを確認します:
「アウトバウンドルール」欄に「すべてのトラフィック / 0.0.0.0/0」が設定されていることを確認します(クライアントSGと同様)。
「セキュリティグループを作成」をクリック。
⑤ DBサーバEC2の起動
AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」
5-1. 基本設定
| 設定項目 | 値 |
|---|---|
| 名前 | my-ec2-mysql-db-instance |
| アプリケーションおよびOSイメージ | Amazon Linux 2023 AMI(デフォルトで選択済み) |
| インスタンスタイプ | t2.micro(無料枠対象) |
| キーペア | my-ec2-mysql-key |
5-2. セキュリティグループの設定
「ネットワーク設定」→「既存のセキュリティグループを選択する」→ my-ec2-mysql-db-sg を選択します。
注意: 「セキュリティグループを作成する」ではなく「既存のセキュリティグループを選択する」を選びます。④で作成済みの
my-ec2-mysql-db-sgを指定します。
5-3. IAMロールの設定
「高度な詳細」→「IAM インスタンスプロファイル」→ my-ec2-mysql-role を選択します。
5-4. UserDataの設定(MariaDBの自動インストール)
「高度な詳細」の一番下「ユーザーデータ」に以下を貼り付けます。
#!/bin/bash
dnf update -y
dnf install -y mariadb105-server mariadb105
systemctl start mariadb
systemctl enable mariadb
sudo mysql -u root << 'SQLEOF'
SET PASSWORD FOR root@localhost = PASSWORD('Admin1234!');
CREATE USER IF NOT EXISTS 'handson'@'%' IDENTIFIED BY 'Handson1234!';
GRANT ALL PRIVILEGES ON *.* TO 'handson'@'%' WITH GRANT OPTION;
CREATE DATABASE IF NOT EXISTS sampledb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
FLUSH PRIVILEGES;
SQLEOF各コマンドの説明:
| コマンド | 意味 |
|---|---|
dnf install -y mariadb105-server mariadb105 | MariaDB サーバーとクライアントをインストール |
systemctl start mariadb | MariaDBを起動 |
systemctl enable mariadb | OS起動時にMariaDBが自動起動するよう設定 |
SET PASSWORD FOR root@localhost | rootパスワードを設定(Admin1234!) |
CREATE USER 'handson'@'%' | どのホストからでも接続できるユーザーを作成(%は任意のホスト) |
GRANT ALL PRIVILEGES ON *.* | handsonユーザーに全権限を付与 |
CREATE DATABASE sampledb | 動作確認用のデータベースを作成 |
FLUSH PRIVILEGES | 権限設定を即時反映 |
sudo mysql -u rootについて: MariaDB インストール直後の root は unix_socket 認証(OSのrootユーザーとして接続)が有効になっています。-pでパスワードを指定するとERROR 1698 Access deniedになるため、初回設定はsudo mysql -u root(パスワードなし)で接続します。
パスワードについて: このハンズオンでは学習用として
Admin1234!/Handson1234!を使用しています。本番環境では必ず強力なパスワードに変更してください。
5-5. インスタンスを起動する
「インスタンスを起動」をクリック。起動後2〜3分待ちます。
控えておく情報:
- DBサーバのパブリックIPアドレス
- DBサーバのプライベートIPアドレス(クライアントEC2からの接続に使用)
インスタンス詳細 → 「プライベート IPv4 アドレス」を確認してメモします。
⑥ クライアントEC2の起動
AWSコンソール → EC2 → インスタンス → 「インスタンスを起動」
6-1. 基本設定
| 設定項目 | 値 |
|---|---|
| 名前 | my-ec2-mysql-client-instance |
| アプリケーションおよびOSイメージ | Amazon Linux 2023 AMI |
| インスタンスタイプ | t2.micro |
| キーペア | my-ec2-mysql-key |
6-2. セキュリティグループの設定
「ネットワーク設定」→「既存のセキュリティグループを選択する」→ my-ec2-mysql-client-sg を選択します。
6-3. IAMロールの設定
「高度な詳細」→「IAM インスタンスプロファイル」→ my-ec2-mysql-role を選択します。
6-4. UserDataの設定(mysqlクライアントのインストール)
#!/bin/bash
dnf update -y
dnf install -y mariadb105mysqlコマンド(クライアントツール)のみをインストールします。DBサーバ機能(
mariadb105-server)はインストールしません。
6-5. インスタンスを起動する
「インスタンスを起動」をクリック。起動完了まで約2〜3分待ちます。
控えておく情報: クライアントEC2のパブリックIPアドレス
⑦ 動作確認
7-1. DBサーバの動作確認
DBサーバにSSH接続します。
ssh -i C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem ec2-user@(DBサーバのパブリックIP)接続後に以下を実行します。
sudo systemctl status mariadb
# MariaDBのバージョン確認
mysql --version
# rootでログイン(パスワード: Admin1234!)
mysql -u root -pAdmin1234!MariaDBのプロンプト(MariaDB [(none)]>)が表示されたら以下を実行します。
-- ユーザー一覧を確認
SELECT User, Host FROM mysql.user;
-- データベース一覧を確認(sampledb が存在することを確認)
SHOW DATABASES;
-- sampledbに接続
USE sampledb;
-- テスト用のテーブルを作成
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- データを挿入
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
-- データを確認
SELECT * FROM users;
-- MariaDBから切断
EXIT;DBサーバから切断します。
exit7-2. SG参照の確認:クライアントEC2からMySQL接続
クライアントEC2に接続します。
ssh -i C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pem ec2-user@(クライアントのパブリックIP)クライアントEC2からDBサーバのプライベートIPに向けてMySQL接続します。
# DBサーバのプライベートIPに接続(XXX.XXX.XXX.XXX はDBサーバのプライベートIP)
mysql -h XXX.XXX.XXX.XXX -u handson -pHandson1234! sampledb接続成功すると MariaDB [sampledb]> が表示されます。
-- DBサーバで作成したデータが見えることを確認
SELECT * FROM users;
EXIT;exitプライベートIPを使う理由: EC2間の通信は同じVPC内なのでプライベートIPで通信できます。パブリックIPを使うとインターネットを経由してしまい、セキュリティ上も効率上も好ましくありません。
7-3. SG参照の効果を確認する(任意・スキップ可)
前提: ローカルPCに
mysqlクライアントがインストールされている場合のみ実施します。7-2でクライアントEC2からの接続が成功していれば、このハンズオンの学習目的(SG参照によるEC2間通信制御)は達成済みです。
ローカルPCに mysql コマンドがある場合、ローカルターミナルで以下を実行します。
mysql -h (DBサーバのパブリックIP) -u handson -pHandson1234! sampledb補足: 今回のSGにはルール3(自分のIPからのMySQL許可)を追加しているため接続できます。ルール3を削除すると、インターネットからの接続は完全に遮断されます。本番環境ではルール3を削除し、クライアントSG参照のみにするのがベストプラクティスです。
⑧ リソースの削除
課金を止めるために、ハンズオン完了後は必ず削除してください。削除する順番が重要です。
1. EC2インスタンスを終了する(2台)
EC2 → インスタンス → my-ec2-mysql-db-instance と my-ec2-mysql-client-instance を両方選択 → 「インスタンスの状態」→「インスタンスを終了」
状態が「終了済み」になるまで待ちます(2〜5分)。
2. セキュリティグループを削除する(2つ)
注意: 先にDBサーバSGを削除します。クライアントSGはDBサーバSGから参照されているため、先にDBサーバSGを削除しないとエラーになります。
① DBサーバSGを先に削除します:
EC2 → セキュリティグループ → my-ec2-mysql-db-sg を選択 → 「アクション」→「セキュリティグループを削除」
② クライアントSGを削除します:
EC2 → セキュリティグループ → my-ec2-mysql-client-sg を選択 → 「アクション」→「セキュリティグループを削除」
3. IAMロールを削除する
IAM → ロール → my-ec2-mysql-role を選択 → 「削除」→ ロール名を入力して確認
4. キーペアを削除する(任意)
EC2 → キーペア → my-ec2-mysql-key を選択 → 「アクション」→「削除」
ローカルの .pem ファイルも手動で削除します。
C:\Users\ユーザー名\.ssh\my-ec2-mysql-key.pemCloudFormation版との比較
コンソール版を体験したら、次は同じ構成をCloudFormation(コード)で再現してみましょう。特にSGの依存関係管理が自動化される点を体験できます。
| 作業 | コンソール(手動) | CloudFormation |
|---|---|---|
| SG×2台の作成(依存関係あり) | 順序を意識して個別に手動作成 | template.yaml に定義済み(順序自動管理) |
| EC2×2台の起動 | 2回インスタンス起動操作 | コマンド1本(並列作成) |
| SG削除(依存関係あり) | DBサーバSG → クライアントSGの順で手動管理 | delete-stack 1本(自動解決) |
| 再現性 | 低い | 高い |
| バージョン管理 | 不可 | Gitで管理可能 |
コンソール版で実感できたポイント:
- SGを削除する際にDBサーバSG → クライアントSGの順番が必要なことを体験できる
- SG参照の設定でソースにIPではなくSGを指定する操作の意味が視覚的に理解できる
- プライベートIPで通信している様子を直接確認できる
CloudFormation版でも試してみる: EC2サーバ構築をIaC化:CloudFormationでEC2 MySQLのDBサーバを自動デプロイする手順
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
| クライアントEC2からMySQLに接続できない | DBサーバSGのSG参照ルールが正しく設定されていない | SGのインバウンドルールでMySQL(3306)のソースが my-ec2-mysql-client-sg になっているか確認 |
| クライアントEC2からMySQLに接続できない | クライアントEC2が my-ec2-mysql-client-sg に属していない | クライアントEC2のセキュリティグループを確認 |
ERROR 2003: Can't connect to MySQL server | プライベートIPではなくパブリックIPを指定している | DBサーバのプライベートIPアドレスを指定する |
| MariaDBに接続できない(DBサーバ内) | UserDataのインストールが完了していない | sudo cat /var/log/cloud-init-output.log でインストール状況を確認 |
Access denied for user 'handson' | パスワードが違うorユーザーが作成されていない | rootでログインして SELECT User,Host FROM mysql.user; で確認 |
| SGが削除できない(依存関係エラー) | クライアントSGをDBサーバSGより先に削除しようとしている | DBサーバSG(my-ec2-mysql-db-sg)を先に削除してからクライアントSGを削除する |
| EC2インスタンスが「使用中」でSGを削除できない | インスタンスがまだ終了していない | インスタンス「終了済み」になってから再試行 |
まとめ
今回のハンズオンで体験できたこと:
| 確認項目 | 内容 |
|---|---|
| SG参照の設定 | DBサーバSGのMySQL(3306)ルールのソースにクライアントSGを指定 |
| MariaDBのセットアップ | UserDataでインストール・起動・ユーザー作成・DB作成を自動化 |
| EC2間通信の確認 | クライアントEC2からプライベートIPを使ってDBサーバに接続 |
| SG削除の依存関係 | DBサーバSG → クライアントSGの順番で削除する必要があることを体験 |
| 2台のリソース管理 | EC2とSGをそれぞれ2つ管理する手間を体験(CloudFormationの必要性を実感) |
SG参照を手動で設定・確認することで、CloudFormationが裏で何を自動化しているかが理解できます。ぜひ次は CloudFormation版 で同じ構成をコードで再現してみてください。
関連記事
-->
コメント