[小ネタ] Fargate で MySQL にlocalhostで接続できないときの対処方法

接続先ホスト名で「127.0.0.1」をお試しください
2024.02.01

アノテーション・テクニカルサポートチームの hato です。

ECS Fargate では、同一タスク内のコンテナは localhost 経由で通信可能です。

一方で、タスク内にアプリとデータベース(MySQL)コンテナを設定した構成で「データベースに接続できない」とお問い合わせをいただくことがあり、少し調べてみました。

AWS Fargate のセキュリティに関する考慮事項 - Amazon Elastic Container Service

タスク内では、タスクに属するコンテナが localhost を介して相互通信できます。

接続先ホスト名に「127.0.0.1」をお試しください

localhost指定時は接続方式が切り替わることの影響です。

MySQL :: MySQL 8.3 Reference Manual :: 4.2.4 Connecting to the MySQL Server Using Command Options

The default host name is localhost. On Unix, this has a special meaning, as described later.

…(中略)…

On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs: the client connects using a Unix socket file.

MySQL ではホスト名にlocalhostを指定する場合と、127.0.0.1等を指定する場合で接続の仕組みが切り替わります。

localhost指定時に使用される UNIX ソケットは同一ホスト上を想定しており、独立したコンテナ環境では接続に失敗します。

そのため、接続先ホスト名をlocalhostから127.0.0.1に変更することで接続できることが期待できます。

なお、タスク内の通信であればセキュリティグループやネットワーク ACL の影響は受けません。

また、バインドマウントでコンテナ間を接続すると接続が可能でした。

参考資料

UNIX ドメインソケットには、UNIX パスの名前がつきます。たとえば、ソケット名には /tmp/foo などがあります。UNIX ドメインソケットは、単一ホスト上のプロセス間でだけ交信します。UNIX ドメイン上のソケットは、単一ホスト上のプロセス間の交信にしか使用できないため、ネットワークプロトコルの一部とは見なされません。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。