AWS でシンプルな Web サービスを作る時、僕は ECS Fargate と RDS で作ることが多いです。この構成が一番シンプルで保守性が高いんじゃないでしょうか。

この構成を採用したときに困ることがいくつかあるのですが、その中の1つが「mysql や psql コマンドを叩いて RDS に接続したい場合どうすればいいんだ?」です。
今回は mysql コマンドを使って RDS の MySQL に接続したいケースを考えます。
mysql コマンドを使いたくなることはあまりないのですが、検証で手動でデータを変更したい場合や、調査の際に使いたくなることがあります。
今までの僕は、EC2サーバーを1台立ててそこから RDS に接続していました。おそらく一番一般的な手法ですが、EC2 サーバーを立ち上げたり、 Public IP を割り当てたり、SSH のポートを開けたりなど、地味に面倒です。

それなら、ECS で立ち上がってるアプリケーションサーバーから RDS に接続すればいいのでは?と考えました。ECS Exec という機能を使えば、ポートを開けたりしなくても、ECS 上で動いている Docker コンテナには接続できます。*1

例えば、アプリケーションが golang:1.24-alpine の Docker イメージから作成されたコンテナ動いているのであれば、このコンテナに ECS Exec で接続して、そこから mysql コマンドを叩いて RDS に接続します。アプリケーションと RDS は当然疎通できるので、疎通に関しては考える必要がなくなります。
問題になるのは、golang の Docker コンテナには mysql コマンドがインストールされていないことです。mysql コマンドを毎回インストールするのも面倒だし、RDS で構築された特定のバージョンの MySQL に接続するために、mysql コマンドのバージョンも揃えないといけない...などを考えると、これも非常に面倒です。
そうして悩んでいるときに、mysql の Docker イメージには mysql コマンドがインストールされていることに気づきました。
では、mysql の Docker イメージからコンテナを立ち上げ、ECS Exec で接続し、mysql の Docker コンテナから mysql コマンドを叩いて RDS に接続すればいいのでは?

試してみました。
サーバーは AWS CDK で構築していたので、以下を追加しました。環境変数は必要なものがセットされていれば適当でいいです。
taskDefinition.addContainer('MysqlContainer', { containerName: 'mysql', image: cdk.aws_ecs.ContainerImage.fromRegistry('mysql:8.4'), environment: { MYSQL_DATABASE: 'app', MYSQL_USER: 'app', MYSQL_ROOT_PASSWORD: 'hoge', MYSQL_PASSWORD: 'hoge', }, });
このコンテナ経由で RDS に接続したら無事に接続できました。
mysql に関しては、mysql コマンドから mariadb にコマンドが変更されたり、いろいろ面倒な問題があるので、これが一番楽な気がしました。
MariaDB や PostgreSQL を使う場合は事情が違ってくるかもしれませんが参考にしてください。
*1:余談ですが、「Container」というのは Docker の用語なので、これを「Container」と書くか「コンテナ」と書くかは悩ましいところですが、Docker の文脈で「コンテナ」とカタカナで書くことは一般に浸透している(と思われる)ので「Docker コンテナ」と書きたくなります。
ただ、 Docker だけ英語でコンテナがカタカナなのに違和感を覚えてしまいます。
とはいえ「ドッカーコンテナ」も違和感あるし「Docker Container」も違和感あるので、結局 Docker コンテナと書いてしまいます。