【RDS】ローカル環境からAmazon RDSインスタンスへSSL接続してみた
はじめに
開発者見習い1年目のkuraoと申します。
ある日突然RDSと繋がりたくなったため、自身のローカル環境からAmazon RDSインスタンス
へ接続しようとしたことがありました。
前提条件が意外とあったり(当たり前)したため、忘れないようその接続方法について備忘録的に残しておこうと思います。
ちなみに、公式のリファレンス参考のみで全然上手くいきます。が、SSL化
何か誤った認識や記述をしている箇所などあれば、ご指摘頂けますと幸いです。
環境
- Mac OS 10.15
- MySQL 8.0.26
進め方
- SSL接続する理由について
- SSL証明書のダウンロード
-
自身のローカルPCからRDSインスタンスへ接続可能かのチェック
- 既に接続可能であれば、「接続コマンドの実行」まで飛んでしまって大丈夫です🙆♂️
-
必須な設定項目についての確認
- 各項目について、設定の仕方を説明します
- 設定完了後、接続コマンドの実行
- 非SSLでRDSインスタンスへ接続(おまけ)
1. SSL接続する理由
簡潔に言いますと、なりすまし攻撃からインスタンスを保護するためです。
(参考:SSL/TLS を使用した DB instance への接続の暗号化)
2. SSL証明書のダウンロード
以下のリンクをクリックするとローカルへダウンロードされます。
こちらの証明書を使って、インスタンへ接続します。
https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
3. RDSインスタンスへ接続可能かのチェック
RDSインスタンスへ接続可能かどうかチェックします。
成功しているようであれば、そのまま「接続コマンドの実行」まで飛ばしてしまってください。
接続確認コマンドの実行
ローカルPCから以下のコマンドを叩いて確認できます。
RDSインスタンスのエンドポイント・ポート番号をどこで見るかについては、この下で示します。
nc -zv <RDSインスタンスのエンドポイント> <RDSポート番号>
# 接続可能な場合、以下のようなサクセスメッセージが表示されます。
Connection to <RDSインスタンスのエンドポイント> port <ポート番号> [tcp/mysql] succeeded!
# 接続不可能な場合、エラーが表示されるので設定が必要ということです。
Connection to <RDSインスタンスのエンドポイント> port <ポート番号> (tcp) failed: <エラーメッセージ>
エンドポイントとポート番号の確認
こちらの確認方法ですが、以下の2つの方法のどちらかで確認できます。(別の方法については試していないので、ここでは割愛します)
1. AWS CLIで確認する場合
以下のコマンドをそのままコピペして実行ですぐに確認できます。
エンドポイントをコピペする際、ダブルクォーテーションはいりません。
aws rds describe-db-instances \
--filters "Name=engine,Values=mysql" \
--query "*[].[DBInstanceIdentifier,Endpoint.Address,Endpoint.Port,MasterUsername]"
# 出力結果(例)
[
[
"mydb1",
"mydb1.123456789012.us-east-1.rds.amazonaws.com",
3306,
"admin"
],
[
"mydb2",
"mydb2.123456789012.us-east-1.rds.amazonaws.com",
3306,
"admin"
]
]
2. AWSマネージドコンソールで確認する場合
- AWSマネージドコンソールへログインし、Amazon RDS コンソール を開きます。
- サイドバーから、
データベース
を選択してDB インスタンスのリストを表示します。 - 確認したいRDSインスタンスの名前を選択して、その詳細を表示します。
-
接続とセキュリティ
タブを開くと、エンドポイント
とポート
が表示されているはずですので、そちらを使用してください。
4. 必須な設定項目の確認
- 4.1. ローカルPC
- 4.1.1. MySQLコマンドラインクライアントが使用できる。
- 4.2. RDS インスタンス
- 4.2.1. RDSインスタンスのエンジンがMySQLであること。
- 4.2.2. RDSインスタンスの設定が「パブリックにアクセス可能」であること。
- 4.2.3. RDSインスタンスの「セキュリティグループのインバウンドルール」に「マイIP」として自身の環境のIPアドレスが追加されていること。
- 4.2.4. 上記の設定が済んだ上で、RDSインスタンスの「ステータス」が利用可能であること。開始中や停止中だと接続できません。
では、1個ずつ確認していきましょう。
4.1. ローカルPC
4.1.1. MySQLコマンドラインクライアントが使用できる
ターミナルを開き、以下のコマンドを実行してバージョン表示がされることを確認。
mysql: command not found
と出力されて場合は、インストールする必要があります。(インストール方法については割愛)
mysql --version
mysql Ver 8.0.26 for macos10.15 on x86_64 (Homebrew)
4.2. RDS インスタンス
4.2.1. RDSインスタンスのエンジンがMySQL
確認手順は以下です。
- Amazon RDSコンソールを開きます
- サイドバーの
テータベース
をクリックすると、使用しているインスタンスについて表示されるので、今回使用するRDSインスタンスの名前
をクリックします - 詳細ページが開きます。概要部分に
エンジン
の項目があるのでそこで確認します。
4.2.2. RDSインスタンスの設定「パブリックにアクセス可能」であること
- 上記と同様インスタンスの詳細ページを開きます。
-
接続とセキュリティ
タブを選択します。 -
パブリックアクセス可能
の欄があるのでそこで確認します。(あり
になっていれば大丈夫です)
「パブリックアクセス」の設定
もしあり
になっていない場合、設定が必要です。設定の手順については以下です。
-
同じく詳細ページにて、上部にある
変更
ボタンをクリック
-
設定画面が表示されるので、
接続
の項目までスクロールし、追加設定
のトグルをクリックして開きます。するとパブリックアクセス
の選択項目が現れるので、パブリックアクセス可能
を選択します。
-
ページ下部の
続行
をクリックで設定を更新して、この項目の設定は完了です。
4.2.3. RDSインスタンスの「セキュリティグループのインバウンドルール」に「マイIP」として自身の環境のIPアドレスが追加されていること
- こちらも上記同様、詳細ページを開きます。
-
接続とセキュリティ
タブを開きます。 -
セキュリティ
欄にあるVPCとセキュリティグループ
のリンクをクリックします。
- セキュリティグループに関する設定画面が表示されたと思います。こちらの下段に
インバウンドルール
という項目があるので、そちらを選択します。 - 既に設定されている
インバウンドルール
の中に、自身のPCが所属しているIPアドレスを持つインバウンドルールが存在するかどうかを確認してください。あればOK。なければ設定が必要です。
インバウンドルールの設定
インバウンドルール
に自身のIPアドレスを設定する手順について説明します。
-
上記と同様のページを開きつつ、
インバウンドルール
タブを開き、インバウンドのルールを編集
をクリックします。
-
インバウンドのルールを編集
という画面が開きます。ページ内にあるルールを追加
をクリックします。 -
ここで、以下の項目を選択します。
-
タイプ
:カスタムTCP →MySQL/Aurora
-
ソース
:カスタム →マイIP
-
-
ルールを保存
をクリックして設定を保存してください。
4.2.4. 上記の設定が済んだ上で、RDSインスタンスの「ステータス」が利用可能であること。
- 上記同様、詳細ページを開きます。
-
概要
にて確認します。
以上で設定が完了しました。次はローカルPCからRDSインスタンスへ接続してみましょう。
5. 接続用のコマンドを実行
RDSインスタンスへSSL接続
RDSインスタンスへSSLで接続するには、以下のコマンドを実行します。
--ssl-ca
というオプションに、「SSL証明書のダウンロード」にてダウンロードした、SSL証明書のフルパスを渡します。
mysql -h <DBインスタンスのエンドポイント> -u root -p --ssl-ca=/<フルパス>/global-bundle.pem --ssl-mode=VERIFY_IDENTITY
パスワードを要求されるので、入力して実行します。成功したら以下のように見慣れたが画面が表示されます。
Enter password:
# 成功
Welcome to the MySQL monitor. Commands end with ; or \g.
・・・
mysql>
無事にSSL接続できました👏
最後に接続のSSL化が有効になっているかの確認
mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
1 row in set (0.04 sec)
6. 非SSLでの接続(おまけ)
非SSLで接続する場合は、以下をチェック。
クライアントとサーバーが同じ VPC にあり、ネットワークが信頼されている場合に限り、暗号化されていない MySQL 接続を使用します。暗号化された接続の使用については、「SSL を使用した MySQL コマンドラインクライアントからの接続 (暗号化)」を参照してください。
from 公式リファレンス
コマンドについては、SSL接続の時よりも単純で、以下になります。
mysql -h <DBインスタンスのエンドポイント> -P <ポート番号> -u root -p
パスワードを入力して実行しましょう。
Enter password:
# 成功
Welcome to the MySQL monitor. Commands end with ; or \g.
・・・
mysql>
説明については以上になります。
参考
MySQL データベースエンジンを実行している DB インスタンスへの接続
VPC のパブリックサブネットまたはプライベートサブネットを使用する Amazon RDS DB インスタンスへの接続問題を解決するには、どうすれば良いですか?
Amazon RDS のトラブルシューティング
SSL証明書を使用してRDSインスタンスへ接続する
SSL 接続を使用して Amazon RDS インスタンスに正常に接続するにはどうすればよいですか?
Amazon RDS for MySQL または Aurora DB インスタンスに接続するときの ERROR 2026 SSL 接続エラーを解決する方法を教えてください。
Discussion