[小ネタ] Fargate で MySQL にlocalhostで接続できないときの対処方法
アノテーション・テクニカルサポートチームの 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 テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。