タスク内の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달 전494회 조회
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

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

질문 답변하기에 대한 가이드라인

관련 콘텐츠