はじめに
SSMのポートフォワーディングを利用することで、ローカルの端末からプライベートサブネット内のRDSに簡単に接続することができます。
AWS CLIでは接続に踏み台EC2のインスタンスIDとRDSのホスト名を指定する必要があるのですが、マネージドコンソールから確認するのが面倒という方向けに今回は「踏み台のEC2の名前」と「接続先のRDSの名前」を指定して接続するBashスクリプトをご紹介したいと思います。
スクリプト内容
早速ですが、スクリプトは以下の通りです。
#!/bin/bash
set -eu
if [ $# -lt 3 ]; then
echo "指定された引数は$#個です。" 1>&2
echo "実行するには3個の引数が必要です。" 1>&2
echo "$0 [AWS CLI Profile] [EC2 Name] [RDS Name]"
exit 1
fi
AWS_PROFILE=$1
EC2_NAME=$2
RDS_NAME=$3
instance_id=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=${EC2_NAME}" --query "Reservations[*].Instances[*].InstanceId" --output text --profile ${AWS_PROFILE})
rds_host=$(aws rds describe-db-instances --db-instance-identifier ${RDS_NAME} --query 'DBInstances[*].Endpoint.Address' --output text --profile ${AWS_PROFILE})
aws ssm start-session \
--profile ${AWS_PROFILE} \
--target ${instance_id} \
--region ap-northeast-1 \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["'"${rds_host}"'"],"portNumber":["3306"], "localPortNumber":["3306"]}'
内容的には、踏み台のEC2のインスタンスIDとRDSのホスト名をそれぞれの名前から取得し、SSMでセッションを開始しています。
また上記だとMySQLのデフォルトのポート番号を想定して3306
で記載をしていますが、変更の必要があれば変更してください。
実行方法
上記スクリプトは以下のコマンドで実行可能です。
$ bash ssm_start_session.sh <AWSプロファイル名> <踏み台のEC2の名前> <RDSの名前>
AWSのプロファイル名をdefault
、EC2の名前をmy-bastion-ec2
、RDSの名前をmy-rds
とすると実行方法は以下の通りです。
$ bash ssm_start_session.sh default my-bastion-ec2 my-rds
実行すると以下の通りセッションが開始され、コネクション待ちになります。
$ bash ssm_start_session.sh default my-bastion-ec2 my-rds
Starting session with SessionId: botocore-session-xxxxx
Port 3306 opened for sessionId botocore-session-xxxxx
Waiting for connections...
先のスクリプトではRDS側のポート3306
番のポートをローカルホストのポート3306
番にフォワードしているので、コネクション開始待ちの状態でDBeaverなどのSQLクライアントツールでlocalhost
の3306
番のポートに接続すればプライベートサブネット内のRDSに接続することができます。
最後に
今回はSSMのポートフォワーディングでプライベートサブネット内のRDSに接続するためのBashスクリプトを紹介してみました。
参考になりましたら幸いです。
ご依頼について
NeeNetではAWSを利用したインフラ環境の構築、およびその上で動くアプリケーションの開発のご依頼・ご相談をお引き受けしております。
個人・法人問わず、何かご相談事項がございましたら、一度ご連絡いただければと思います。