やりたいこと
ローカルから、ECS Fargate のコンテナ経由 で RDS に接続
必要な情報
1 ~ 3 のうち、1 だけわかっていれば、後述する方法で芋づる式で情報とれます。
aws のコンソール画面からも確認可能です。
4 ~ 7 は RDS 接続のための基本情報です。
- ECS Cluster 名 (CLUSTER_NAME)
- TaskID (TASK_ID)
- RuntimeID (RUNTIME_ID)
- RDS Host (RDS_HOST)
- RDS Port (RDS_PORT)
- RDS User
- RDS Password
接続してみた
1. aws ssm コマンドを ローカル の ターミナルで実行
各変数は書き換えてください。
localPortNumber
は 8888
としてますが任意です。
aws ssm start-session \
--target ecs:${CLUSTER_NAME}_${TASK_ID}_${RUNTIME_ID} \
--parameters "{\"host\":[\"${RDS_HOST}\"],\"portNumber\":[\"${RDS_PORT}\"], \"localPortNumber\":[\"8888\"]}" \
--document-name AWS-StartPortForwardingSessionToRemoteHost
上記コマンドで、自分の PC の localhost(127.0.0.1
)のlocalPortNumber
にポートフォワーディングされ・・・
![]() |
---|
成功すると、「Waiting for connections...」と出ます。
2. RDS に接続
Tableplus で接続 (mysql、psql コマンドでもなんでも OK)
接続成功画面
-
Host
:127.0.0.1
-
Port
:任意で入力したlocalPortNumber
-
User
,Password
,Database
は RDS に接続するときの情報です。
無事、ローカルから、RDSへ接続できました
前提
- RDS に接続する ECS Fargate コンテナがある(大体サーバーサイド)
- aws cli がローカルにインストール
- 対象 ECS Service が ecs exec 可能
ケース
ECS 構築していて、よく「ECS fargate(サーバーサイド) + RDS + α」を作るけど、
ステージング等で、パフォーマンス・チューニングや設定確認等で DB に接続
メリット
- RDS に 「 接続のため 」の「 下準備 」が省ける
RDS に接続するためにやっていた下準備の例
- RDS・ALB・VPC のセキュリティグループに、特定の IP アドレス・VPN だけ 接続許可の追加
- RDS をパブリックサブネットに置いて IAM ロールで接続許可するような仕組み・設定
- RDS に接続する ECS Fargate コンテナ に データベース接続のためのコマンド(mysql, psql 等)をインストール
- 踏み台サーバー用意
試したローカル環境
aws --version
aws-cli/2.11.27 Python/3.11.4 Darwin/22.5.0 source/x86_64 prompt/off
tableplus: Version 5.3.8
推奨 VSCode 拡張
これがあると、
- 対象の ECS クラスター名、タスク ID 等を取得するのが容易
- 対象サービスが(ecs exec)可能か把握が容易
になります。
AWSコンソールいかなくても、拡張あればECSの情報は揃う
必要な情報の中でも、前提条件の「ECS Exec 対応しているか」 と 下記 1 ~ 3 は
- ECS Cluster 名 (CLUSTER_NAME)
- TaskID (TASK_ID)
- RuntimeID (RUNTIME_ID)
aws コンソール画面で確認するのが面倒なので VSCode の拡張(AWS Toolkit)を使うと確認が簡単になります。
1. ECS Exec に対応しているか確認
AWS Toolkitで ECS → 対象 Cluster → Service とプルダウンしていき、コンテナを右クリックしたときに出てくるメニューが選択できる
→ 選択できない場合は、「ECS Exec」が 対応 できてない可能性が高い
まだ、対応されていない場合は下記記事を参考にしてみてください
[アップデート] 実行中のコンテナに乗り込んでコマンドを実行できる「ECS Exec」が公開されました
2-1 必要情報を揃える ECS Cluster名
AWS Toolkitで ECS → 対象 Cluster → Service とプルダウンしていき、サービスを右クリックしたときに出てくるメニューで「Copy ARN」
arn:aws:ecs:region:accountID:service/ClusterName/ServiceName
の構造になっているので、ClusterName
だけコピー
2-2 必要情報を揃える TASK_ID
aws ecs list-tasks --cluster $CLUSTER_NAME
TaskARN
が出力され
arn:aws:ecs:region:accountID:task/ClusterName/TaskID
構造になっているので、TaskID
が取り出せる
2-3 必要情報を揃える RUNTIME_ID
2-2 で取得した TaskARN
から
aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $TASK_ARN
tasks → containers → runtimeId のように辿っていけば、RuntimeID
が取り出せる
サーバーサイドとタスクがひとつしかないようであれば下記でruntimeId
が返されます
aws ecs describe-tasks --cluster $CLUSTER_NAME --tasks $TASK_ARN --query tasks[0].containers[0].runtimeId