タスク内の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
asked 4 months ago494 views
1 Answer
0

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

profile picture
EXPERT
answered 4 months ago
  • 回答をありがとうございます。 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

You are not logged in. Log in to post an answer.

A good answer clearly answers the question and provides constructive feedback and encourages professional growth in the question asker.

Guidelines for Answering Questions