みなさんAWS使っていますか?このシリーズ(IAM AWS User クラウドサービスをフル活用しよう!)はAWSサービスの紹介をする記事を投稿するのですが,今回は番外編で実際に私が行ってみて便利だったAWSの使い方を紹介します.今回は番外編1としてPrivateSubnet上のRDSに踏み台EC2のSSHトンネル経由でローカルからアクセスする方法について紹介します.具体的には以下のようなアーキテクチャを想定しています.
AWSの環境において、セキュリティを強化するためにRDSインスタンスをプライベートサブネットに配置することが一般的である.しかし,プライベートサブネット上のRDSに直接アクセスすることは推奨されないため、踏み台EC2インスタンスを経由してアクセスする方法が必要となる.本記事では,SSHトンネルを用いてローカルマシンからプライベートサブネット上のRDSに接続する手順について詳述する.
シリーズIAM AWS User クラウドサービスをフル活用しよう!
Part1 バックエンドとは何なのか?クラウドコンピューティングとバックエンド開発の関係性を知ろう!
Part2 クラウドとは? & ネットワーク編その1(VPC・サブネット・インターネットゲートウェイ・ルートテーブル・NATゲートウェイ・VPCエンドポイント)
他のシリーズ
様々な言語,フレームワーク,ライブラリなど開発技術の使用方法,基本事項,応用事例を網羅し,手引書として記載したシリーズです.
git/gh,lazygit,docker,vim,go/gorm,typescript,SQL,プルリクエスト/マークダウン,ステータスコード,ファイル操作のチートシート,OpenAI AssistantsAPIがあります.以下の記事に遷移した後,各種チートシートのリンクがあります.
TypeScriptで学ぶプログラミングの世界
プログラミング言語を根本的に理解するシリーズです.
情報処理技術者試験合格への道[IP・SG・FE・AP]
情報処理技術者試験の単語集です.
接続の概要
SSHトンネルを利用することで、ローカルマシンと踏み台EC2インスタンス間にセキュアな通信経路を確立し、その経路を通じてプライベートサブネット内のRDSにアクセスすることが可能となる。この方法により、直接RDSにアクセスする必要がなくなり、セキュリティを向上させることができる。
準備
VPC・パブリックサブネット・プライベートサブネット・ルートテーブル・インターネットゲートウェイなどは用意済みと仮定する.
1. 踏み台EC2インスタンスの準備
- パブリックサブネットにEC2インスタンスを用意する
- EC2インスタンスには SSH(22) のインバウンドを許可したセキュリティグループを設定
2. SSHキーの準備
- EC2インスタンスへの接続をするページでローカルマシンに踏み台EC2インスタンスにアクセスするためのSSHキー(例: example.pem)を取得し,~/.ssh/以下に設置する
- キーのパーミッションが適切に設定されていることを確認する
SSHキーはEC2インスタンスを起動させるためのインスタンス作成ページにSSHキーを作成し,秘密鍵(.pem)を入手できる.公開鍵はAWS側にある.
githubへのssh接続と同じです.
3. RDSの準備
- プライベートサブネットにRDSを用意する(今回はMySQLを使用しました)
- RDSにはEC2のセキュリティグループからの MySQL(3306) のインバウンドを許可したセキュリティグループを設定する
EC2インスタンスにSSH接続するためのコマンドは「インスタンスに接続」のページで「SSHクライアント」のタブに接続方法が記載されている.
SSHトンネルの設定
ローカルマシンで以下のコマンドを用いてSSHトンネルを設定する
ssh -i "~/.ssh/example.pem" -N -L 3307:[RDSのエンドポイント]:3306 ec2-user@[EC2のパブリック IPv4 DNS]
RDSのエンドポイントやEC2のパブリック IPv4 DNSはそれぞれのインスタンスの詳細ページにあります.
コマンドの解説
-
ssh
: SSHプロトコルを使用して接続を確立するコマンド -
-i "~/.ssh/example.pem"
: 接続に使用するSSHキーのパスを指定 -
-N
: リモートコマンドの実行を行わず、トンネルの確立のみを行うオプション -
-L 3307:[RDSのarn]:3306
: ローカルマシンのポート3307をRDSのエンドポイント(ポート3306)に転送する設定 -
ec2-user@[EC2のパブリック IPv4 DNS]
: 踏み台EC2インスタンスのユーザー名とホスト名を指定する
データの移り変わり
どのようにデータの送受信をしていて,ポートフォワーディングをしているかを説明する.
1. ローカルマシン
コマンドの -L 3307:[RDSのエンドポイント]:3306
の指定により,ローカルマシンのポート 3307 がトンネルのエントリーポイントとして機能する.
例えば,MySQLクライアントが 127.0.0.1:3307 に接続を開始すると,この接続がSSHトンネルを通じて踏み台EC2へ送られる.
2. 踏み台EC2インスタンス
踏み台EC2では,SSHトンネルにより受け取ったデータ(ローカルマシンからの接続要求)が指定されたエンドポイント([RDSのエンドポイント]:3306)に転送される
踏み台EC2の役割は,あくまでデータの中継であり,自身がMySQLにアクセスするわけではない
3. RDS(データベース)
踏み台EC2経由で到達した接続要求は,RDSのポート 3306 に到達する
RDSはこの接続を受け入れ,クライアント(ローカルマシン)との間でデータの送受信を行う.
MySQLクライアントからの接続
SSHトンネルが確立された後、以下のコマンドを使用してMySQLクライアントからRDSに接続する。
mysql -h 127.0.0.1 -P 3307 -u admin -p
いつもはポート3306ですが今回は3307なので注意
このコマンドにより、ローカルマシンのMySQLクライアントからセキュアにRDSに接続することが可能となる。
注意点
- セキュリティグループの設定: 踏み台EC2インスタンスおよびRDSのセキュリティグループが適切に設定されていることを確認する必要がある。特に、RDSのセキュリティグループは踏み台EC2からの接続を許可するように設定すること。
- SSHキーの管理: SSHキーは厳重に管理し、不正アクセスを防ぐために必要なパーミッションを設定すること。
- ポートの競合: ローカルマシンのポート3307が他のサービスで使用されていないことを確認すること。必要に応じて別のポートを使用することも検討する。
エラー対応
1. mysqlコマンドを使ってデータベースに接続するときに怒られた
(mysql-clientの最新版に問題があるようです)
brew uninstall mysql-client
brew install mysql-client@8.0
2. sshのpermissionDenied系で怒られる
(.ssh/は適切な権限付与がないと怒られるみたいです)
chmod 600 ~/.ssh/
chmod 600 ~/.ssh/example.pem
chmod 700 ~/.ssh/known_hosts
SSHトンネルを利用することで、プライベートサブネット上のRDSに対してセキュアかつ効率的にアクセスすることが可能となる.本記事で紹介した手順を踏襲することで,ローカル環境から安全にデータベース操作を行うことができる.セキュリティを維持しつつ,柔軟なアクセス方法を実現するために,是非活用してほしい.
それではQiitaアドカレ.24企画の今日のクリスマスツリーです.
詳しくはこちらの記事から