LoginSignup
6
3

ECS fargate 経由で RDSに接続

Last updated at Posted at 2023-06-15

やりたいこと

ローカルから、ECS Fargate のコンテナ経由 で RDS に接続

必要な情報

1 ~ 3 のうち、1 だけわかっていれば、後述する方法で芋づる式で情報とれます。
aws のコンソール画面からも確認可能です。

4 ~ 7 は RDS 接続のための基本情報です。

  1. ECS Cluster 名 (CLUSTER_NAME)
  2. TaskID (TASK_ID)
  3. RuntimeID (RUNTIME_ID)
  4. RDS Host (RDS_HOST)
  5. RDS Port (RDS_PORT)
  6. RDS User
  7. RDS Password

接続してみた

1. aws ssm コマンドを ローカル の ターミナルで実行

各変数は書き換えてください。
localPortNumber8888 としてますが任意です。

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にポートフォワーディングされ・・・

スクリーンショット 2023-06-15 16.20.53.png

成功すると、「Waiting for connections...」と出ます。

2. RDS に接続

Tableplus で接続 (mysql、psql コマンドでもなんでも OK)

接続成功画面

スクリーンショット 2023-06-15 15.01.45.png

  • Host:127.0.0.1
  • Port:任意で入力したlocalPortNumber
  • User, Password, Databaseは RDS に接続するときの情報です。

無事、ローカルから、RDSへ接続できました

前提

  1. RDS に接続する ECS Fargate コンテナがある(大体サーバーサイド)
  2. aws cli がローカルにインストール
  3. 対象 ECS Service が ecs exec 可能

ケース

ECS 構築していて、よく「ECS fargate(サーバーサイド) + RDS + α」を作るけど、
ステージング等で、パフォーマンス・チューニングや設定確認等で DB に接続

メリット

  • RDS に 「 接続のため 」の「 下準備 」が省ける

RDS に接続するためにやっていた下準備の例

  1. RDS・ALB・VPC のセキュリティグループに、特定の IP アドレス・VPN だけ 接続許可の追加
  2. RDS をパブリックサブネットに置いて IAM ロールで接続許可するような仕組み・設定
  3. RDS に接続する ECS Fargate コンテナ に データベース接続のためのコマンド(mysql, psql 等)をインストール
  4. 踏み台サーバー用意

試したローカル環境

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

スクリーンショット 2023-06-15 13.52.28.png

推奨 VSCode 拡張

これがあると、

  1. 対象の ECS クラスター名、タスク ID 等を取得するのが容易
  2. 対象サービスが(ecs exec)可能か把握が容易

になります。

AWSコンソールいかなくても、拡張あればECSの情報は揃う

必要な情報の中でも、前提条件の「ECS Exec 対応しているか」 と 下記 1 ~ 3 は

  1. ECS Cluster 名 (CLUSTER_NAME)
  2. TaskID (TASK_ID)
  3. RuntimeID (RUNTIME_ID)

aws コンソール画面で確認するのが面倒なので VSCode の拡張(AWS Toolkit)を使うと確認が簡単になります。

1. ECS Exec に対応しているか確認

AWS Toolkitで ECS → 対象 Cluster → Service とプルダウンしていき、コンテナを右クリックしたときに出てくるメニューが選択できる

スクリーンショット 2023-06-15 15.36.25.png

→ 選択できない場合は、「ECS Exec」が 対応 できてない可能性が高い

まだ、対応されていない場合は下記記事を参考にしてみてください

[アップデート] 実行中のコンテナに乗り込んでコマンドを実行できる「ECS Exec」が公開されました

2-1 必要情報を揃える ECS Cluster名

AWS Toolkitで ECS → 対象 Cluster → Service とプルダウンしていき、サービスを右クリックしたときに出てくるメニューで「Copy ARN」

スクリーンショット 2023-06-15 15.46.44.png

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

参考

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3