Goで作成したアプリケーション用のコンテナとMySQL用のコンテナを以下のシンプルな構成で、同一タスクで起動させようとしています。
- ECS on Fargate
- VPC内のパブリックサブネットにECSサービスを配置
- インターネットゲートウェイ経由でインターネットからコンテナにアクセス
いずれのコンテナも起動はでき、ブラウザからGoアプリケーションに接続はできるのですが、
GoアプリケーションとMySQLのコンテナが接続できないです。
同一タスク内のコンテナ同士はlocalhost
で接続できると認識しており、以下コード内のMYSQL_URLには環境変数としてlocalhost:3306と設定しています。
package models
import (
"database/sql"
"fmt"
"os"
"github.com/go-sql-driver/mysql"
)
// Model Model型の宣言.
type Model struct {
db *sql.DB
}
// NewModel 新しいDBへの接続を作成.
func NewModel() (*Model, error) {
cfg := mysql.Config{
User: os.Getenv("MYSQL_USER"),
Passwd: os.Getenv("MYSQL_PASSWORD"),
Net: "tcp",
Addr: os.Getenv("MYSQL_URL"),
DBName: "record",
}
// DBサーバーを開く.
db, err := sql.Open("mysql", cfg.FormatDSN())
if err != nil {
return nil, fmt.Errorf("DB接続エラー: %w", err)
}
// DBサーバーが開いたか確認.
pingErr := db.Ping()
if pingErr != nil {
return nil, fmt.Errorf("%v: pingエラー: %w", cfg.FormatDSN(), pingErr)
}
return &Model{db: db}, nil
}
エラーは以下の通り、接続が拒否されてしまっている状況です。
タスク定義でMySQLコンテナは3306でportmapping設定を行っております。
解決方法を教えて頂きたいです。
よろしくお願いします。
[Error] CreateUser: testuser:testuser@tcp(localhost:3306)/record?allowNativePasswords=false&checkConnLiveness=false&maxAllowedPacket=0: pingエラー: dial tcp 127.0.0.1:3306: connect: connection refused
回答をありがとうございます。 127.0.0.1も試したのですがダメでした。
ECS Execを使用してGoのコンテナからMySQLのコンテナに接続できるか試すことは可能でしょうか? https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html
EC2起動タイプで同じものを起動し、bridgeモードでサービスを開始しました。 コンテナ名を指定してアクセスをしにいったのですが、同じくconnection refusedになりました。 EC2にSSHで入りGoのコンテナから以下のコマンドを実行すると通信できているようです。 ローカル環境では動作確認済みのアプリケーションです。
/ # nc -zv 172.17.0.2 3306 172.17.0.2 (172.17.0.2:3306) open