タスク内の2つのコンテナ間の通信

0

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

butch
已提問 4 個月前檢視次數 487 次
1 個回答
0

こちらのブログの通りlocalhostではなく127.0.0.1を指定してみるのはいかがでしょうか?
https://dev.classmethod.jp/articles/ecs-fargate-connect-to-mysql-with-localhost/

profile picture
專家
已回答 4 個月前
  • 回答をありがとうございます。 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

您尚未登入。 登入 去張貼答案。

一個好的回答可以清楚地回答問題並提供建設性的意見回饋,同時有助於提問者的專業成長。

回答問題指南