電通総研 テックブログ

電通総研が運営する技術ブログ

AWS FargateからSSMでRDSに接続

はじめに

ISID X(クロス)イノベーション本部 の三浦です。
筆者の関わってる案件では、コンテナ利用、AWS Fargate利用を進めております。
AWS Fargateのお手軽さは非常に重宝しております。
しかし、そこで問題になってくるのが、管理接続、踏み台系をどうするかです。
アプリケーション本体をせっかくAWS Fargateでやっているので、管理系接続、踏み台的な作業もできるだけ非EC2でやりたいですよね?
しかし、以前検証した際には、ローカルPC⇒AWS Fargate経由⇒RDSといった接続することができませんでした。が、今回、AWS様のアップデートにより上記ができるようになりましたので、ご紹介いたします。

前記事:
AWS FargateでECS Exec、session managerモロモロのTips

目次

実現できること

特に踏み台を準備せず、アプリが稼働してるコンテナからポートフォワードをし、任意の環境からRDSに接続できます。

接続例を下記に図示します。

AWS CLIで、AWS Fargateをターゲットにして、リモートホストポートフォワード用のドキュメント(AWS-StartPortForwardingSessionToRemoteHost)を実行。

pgAdminから接続。

解説

下記は、windows上での実行例です。

aws ssm start-session ^
--profile dev93 ^
--target ecs:%cluster_name%%task_id%%container_runtime_id% ^
--document-name AWS-StartPortForwardingSessionToRemoteHost ^
--parameters "{"host":["XXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com"],"portNumber":["5432"], "localPortNumber":["15432"]}" "

キーとなるのは、aws ssm start-sessionで、targetをどう指定するかです。
https://github.com/aws/aws-cli/blob/c0edee0a7427b6e7b654df0696015e96105497a3/awscli/customizations/ecs/executecommand.py#L61-L73

で、上記のコードに、AWS FargateでのSSM呼び出しの書式が書かれておりAWS-StartPortForwardingSessionToRemoteHostだけでなく他のドキュメントも呼び出し可能です。

なお、必要となる値は下記より確認可能です。
cluster_name

task_id

container_runtime_id

本機能を使いやすくするために

cluster_nameは、環境に応じた固定的な値ですが、task_id、container_runtime_idは、ESC TASKの再起動のたびに変わってしまう動的な値です。ですので、これらを取得するスクリプトと組み合わせると利用しやすくなります(私は、クラスター名、サービス名を指定するとtask_id、container_runtime_idを取得するスクリプトと組み合わせて使ってます)。

また、ecsを使いやすくするツールを開発されている方々もおられますので、これらのツールを使ってもよいかもしれません。

ecstaを使ってAmazon ECSコンテナ開発効率を上げよう!
github fujiwara/ecsta

なお、当初はecstaを触ってみた記事を書くつもりだったのですが2023/02時点でwindows用のバイナリがなかったため今回の内容にしました。MacLinuxユーザーの方は、ecstaを使ってみるとよいのではないかと思います。

執筆:@miura.toshihiko、レビュー:@sato.taichi
Shodoで執筆されました