EC2サーバ構築ハンズオン:AWSコンソールでEC2 MySQLのDBサーバを構築する手順【SG参照 / CloudFormation版との比較付き】

AWS Basic
スポンサーリンク
スポンサーリンク

はじめに

「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サーバ・クライアント)を起動する
MariaDBMySQLから派生したオープンソースのデータベース。コマンド・構文・接続方法がMySQLと完全互換
セキュリティグループ(SG)EC2への通信を制御するファイアウォール。今回は2つのSGを作成する
SG参照(SG-to-SG)アクセス元としてIPアドレスではなく別のセキュリティグループを指定する設定。そのSGに属するEC2全体を対象にできる
プライベートIPアドレスAWSのVPC内でのみ使用できるIPアドレス。EC2間の通信にはプライベートIPを使う
UserDataEC2の初回起動時のみ自動実行されるシェルスクリプト。今回は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 ApachePhase 1-2 TomcatPhase 1-3 MySQL(今回)
役割WebサーバーAPサーバーDBサーバー
ポート8080803306
SGのアクセス元自分のIP自分のIPクライアントSG参照
EC2台数1台1台2台(DB + クライアント)

使用するAWSサービス

サービス役割料金
EC2 × 2台DBサーバ + クライアント(各t2.micro)月750時間まで無料枠あり(2台で消費が倍)
セキュリティグループ × 2DBサーバSG / クライアントSGのアクセス制御無料
IAMEC2へのSession Manager接続権限無料
EBS × 2EC2にアタッチされるストレージ(各8GB)月30GBまで無料枠あり

注意: EC2を2台同時に稼働させるため、無料枠の消費が2倍になります。ハンズオン後は必ず2台とも削除してください。


構築するリソース

リソース役割
キーペアSSH接続の認証鍵(DBサーバ・クライアント両方で使用)
IAMロールEC2にSession Manager接続の権限を付与
クライアントSGクライアントEC2(APサーバ役)に適用するSG
DBサーバSGDBサーバEC2に適用するSG(クライアントSGを参照)
DBサーバEC2MariaDBが動作するDBサーバ本体
クライアントEC2mysqlコマンドでDB接続テストを行うEC2(APサーバ役)

全体の作業順序

依存関係があるため、必ずこの順番で作成します。

⓪ 自分のIPアドレスを確認する(重要)
      ↓
① キーペアを作成する
      ↓
② IAMロールを作成する
      ↓
③ クライアントSGを作成する(先に作成する必要がある)
      ↓
④ DBサーバSGを作成する(③のSGを参照する)
      ↓
⑤ DBサーバEC2を起動する
      ↓
⑥ クライアントEC2を起動する
      ↓
⑦ 動作確認(DBサーバ・クライアント)
      ↓
⑧ リソースを削除する

【重要】⓪ 自分のIPアドレスを確認する

セキュリティグループで自分のIPだけを許可するために、正確なIPアドレスを事前に確認します。

方法A: ルーター管理画面で確認(推奨)

  1. ブラウザで以下のURLにアクセスします(ルーターによって異なります)
    http://192.168.0.1  または  http://192.168.1.1
  2. 「ネットワークマップ」または「インターネット」項目を開く
  3. **「インターネット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(変更不要)

インバウンドルール(「ルールを追加」):

タイププロトコルポートソース説明
SSHTCP22203.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 mariadb105MariaDB サーバーとクライアントをインストール
systemctl start mariadbMariaDBを起動
systemctl enable mariadbOS起動時にMariaDBが自動起動するよう設定
SET PASSWORD FOR root@localhostrootパスワードを設定(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 mariadb105

mysqlコマンド(クライアントツール)のみをインストールします。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サーバから切断します。

exit

7-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-instancemy-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.pem

CloudFormation版との比較

コンソール版を体験したら、次は同じ構成を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版 で同じ構成をコードで再現してみてください。


関連記事

-->

コメント