インターネットからプライベートサブネットのRDSにログインする方法

記事タイトルとURLをコピーする

こんにちは、エデュケーショナルサービス課の小倉です。
変わらず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の構築については以下のブログを参考にしてみてください。

blog.serverworks.co.jp

IAM DB認証の設定については以下のブログを参考にしてみてください。

blog.serverworks.co.jp

実施したこと

プロファイルを指定して、クレデンシャルを確認すると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は復号して通信するということはサポートされていません。
暗号化する場合はエンドツーエンドで行います。以下のように設定すれば暗号化した通信ができると思っていたのですが、なにも設定せずに通信させても暗号化されているように見えました。このあたりはもう少し調べて改めてまとめます。

docs.aws.amazon.com

ログイン時のパケットキャプチャの結果

まとめ

インターネットからプライベートサブネットのRDSにログインする方法についてまとめました。
今回はインターネット上のSaaSとの連携ということでNLB経由にしましたが、ログインするだけなら以下のブログのようにSystems Managerのポートフォワードを使っても可能です。

blog.serverworks.co.jp

RDSのIPアドレスの変更が考慮できていないですが、コードを書いて定期実行することで対応可能かと思いますので、時間のある時に試してみます。

小倉 大(記事一覧)

アプリケーションサービス部エデュケーショナルサービス課 札幌在住

AWSトレーニングの講師をしています。

最近は7歳の息子と遊ぶのが楽しいです!

Twitter: @MasaruOgura