こんにちは、エデュケーショナルサービス課の小倉です。
変わらずAWSトレーナーとしてトレーニングを実施していて、最近は生成AIの公式トレーニングを提供できるようになりました。
2年ほど前、インターネット上にあるSaaSからプライベートサブネットのRDSにログインしてデータの連携をさせたく検証していましたので、当時の内容をまとめておきます。
結論としては、パブリックサブネットにNLBを配置して、NLB経由でのログインになります。ログインするだけなら難しいことはないのですが、注意点として、NLBのターゲットにはRDSのエンドポイントではなくIPアドレスを指定するため、RDSのIPアドレスが変わってしまうとログインできなくなってしまうところです。
各サービスの設定値
Network Load Balancer
- セキュリティグループ:送信元に自分の環境のグローバルIPアドレスを許可、ポート3306
- ターゲットグループ:RDSのIPアドレス(エンドポイントに紐づくIPアドレスで、エンドポイントを名前解決すると確認できます)
RDS
- データベースエンジン:MySQL
- セキュリティグループ:送信元にNLBのセキュリティグループID、ポート3306
- パラメータグループ:max_connect_errors 9223372036854775807
※もし本番で使用する場合は要件に応じて適切な値に変更してください
max_connect_errors を小さい値にしているとNLBからのヘルスチェックでたくさんアクセスが来て、NLB経由のログインがブロックされてしまいます。ログイン時に以下のエラーが出た場合は、NLB経由ではない別経路からMySQLにログインし、FLUSH HOSTS;
を実行すればエラーは解消します。
ERROR 1129 (HY000): Host 'xx.xx.xx.xx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
MySQLがインストールされているクライアントからNLBのDNS名を指定するとMySQLにログインすることができます。
$ mysql -u admin -h 20250530-xxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1052 Server version: 8.0.41 Source distribution Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
IAM DB認証
ログインさせるだけならこれで終わりなのですが、当時はセキュリティ面を考慮して、IAM Roles Anywhere を利用してIAM DB認証でログインさせるということを試していました。IAM Roles Anywhere とは、オンプレミスのサーバーとかでもAWSサービスにアクセスするための一時的な認証情報を利用できる機能です。
IAM Roles Anywhereの構築については以下のブログを参考にしてみてください。
IAM DB認証の設定については以下のブログを参考にしてみてください。
実施したこと
- RDSの準備
- RDSにIAMデータベース認証でログインする の以下の手順を実施
- IAMデータベース認証有効化設定
- RDSにログインしてユーザ、データベースを作成
- RDSにIAMデータベース認証でログインする の以下の手順を実施
- EC2 の作成
- EC2 上に 認証局を作成
- オンプレミスのサーバーが、IAM Roles Anywhere のサービスを経由して引き受けるロールの準備
- Condition句で絞ることはできますが、今回は検証だったので、Condition句をすべて削除して作成しました
- 適用するIAMポリシーは、IAM DB認証用に作成したポリシーを適用します
- RDSにIAMデータベース認証でログインする の
アクセストークン取得用IAMポリシーの作成
- RDSにIAMデータベース認証でログインする の
- EC2(認証局)上にあるルート証明書を IAM Roles Anywhere の 信頼アンカー(Trust Anchor)に登録
- オンプレミスのサーバー上に、秘密鍵と証明書署名要求(CSR)を作成
- EC2(認証局)上で、エンドエンティティ証明書を発行
- オンプレミスのサーバー上に、エンドエンティティ証明書を配置し、IAM Roles Anywhere を使用する
- クレデンシャルの設定は毎回設定するのが面倒なので、~/.aws/config ファイルに書き込みました
プロファイルを指定して、クレデンシャルを確認するとIAMロールが使われていました( ~/.aws/config にプロファイル rds に登録しています)。
$ aws sts get-caller-identity --profile rds { "UserId": "xxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxx", "Account": "000000000000", "Arn": "arn:aws:sts::000000000000:assumed-role/RDSlogin/xxxxxxxxxxxxxxxxxxxxxxxx" }
IAM Roles Anywhere と IAM DB認証の設定をして、以下のコマンドを実行するとMySQLにログインできます。
mysql -u iam_db_user -h 20250530-xxxxxxxxxxx.elb.ap-northeast-1.amazonaws.com -p`aws rds generate-db-auth-token --hostname database-1.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com --port 3306 --username iam_db_user --region ap-northeast-1 --profile rds` --enable-cleartext-plugin mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6166 Server version: 8.0.41 Source distribution Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
NLBへのSSL/TLS証明書適用について
NLBにSSL/TLS証明書を適用して、インターネットからNLBまでは暗号化、NLBからRDSは復号して通信するということはサポートされていません。
暗号化する場合はエンドツーエンドで行います。以下のように設定すれば暗号化した通信ができると思っていたのですが、なにも設定せずに通信させても暗号化されているように見えました。このあたりはもう少し調べて改めてまとめます。
ログイン時のパケットキャプチャの結果
まとめ
インターネットからプライベートサブネットのRDSにログインする方法についてまとめました。
今回はインターネット上のSaaSとの連携ということでNLB経由にしましたが、ログインするだけなら以下のブログのようにSystems Managerのポートフォワードを使っても可能です。
RDSのIPアドレスの変更が考慮できていないですが、コードを書いて定期実行することで対応可能かと思いますので、時間のある時に試してみます。
小倉 大(記事一覧)
アプリケーションサービス部エデュケーショナルサービス課 札幌在住
AWSトレーニングの講師をしています。
最近は7歳の息子と遊ぶのが楽しいです!
Twitter: @MasaruOgura