SSMを利用して踏み台のEC2とRDSの名前からプライベートサブネット内のRDSに接続するためのBashスクリプト

はじめに

SSMのポートフォワーディングを利用することで、ローカルの端末からプライベートサブネット内のRDSに簡単に接続することができます。

構成図

AWS CLIでは接続に踏み台EC2のインスタンスIDRDSのホスト名を指定する必要があるのですが、マネージドコンソールから確認するのが面倒という方向けに今回は「踏み台の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クライアントツールでlocalhost3306番のポートに接続すればプライベートサブネット内のRDSに接続することができます。

DBeaverの接続設定画面

最後に

今回はSSMのポートフォワーディングでプライベートサブネット内のRDSに接続するためのBashスクリプトを紹介してみました。

参考になりましたら幸いです。

ご依頼について

NeeNetではAWSを利用したインフラ環境の構築、およびその上で動くアプリケーションの開発のご依頼・ご相談をお引き受けしております。

個人・法人問わず、何かご相談事項がございましたら、一度ご連絡いただければと思います。

  • URLをコピーしました!