Movatterモバイル変換


[0]ホーム

URL:


LoginSignup
181

Go to list of users who liked

113

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS Fargateでコンテナ間通信させたいとき

Last updated atPosted at 2017-12-19

この記事はAWS Fargate Advent Calendar 2017 の19日目の記事です。

cloudpack大阪の佐々木です。
Fargateでコンテナ間通信させるときの話です。

概要

Docker環境で、コンテナ間で通信させるためにLinkという機能があります。1

ECS上でLink機能を使用しているタスク定義を、Fargateで実行しようとしてもエラーになって動きません。

実行結果

まず簡単な例として、Wordpress + MySQLという構成があるとします。2
WordpressコンテナとMySQLコンテナがあって、Wordpressの方にLinkを指定することで、mysqlという名前で通信できるようになります。

docker-compose.yml
version:'2'services:wordpress:image:wordpressports:-"80:80"links:-mysqlmysql:image:mysqlenvironment:MYSQL_ROOT_PASSWORD:password

ECSであれば、この構成で問題なく動くんですが、Fargateで起動させると下のようなエラーになります。

$ecs-cli compose service up--launch-type FARGATE                                          WARN[0000] Skipping unsupported YAML option...           optionname=networksWARN[0000] Skipping unsupported YAML optionforservice...  optionname=networks servicename=mysqlWARN[0000] Skipping unsupported YAML optionforservice...  optionname=networks servicename=wordpressERRO[0001] Error registering task definitionerror="ClientException: Links are not supported when networkMode=awsvpc.\n\tstatus code: 400, request id:  axxxxx-e39c-11e7-a22a-xxxxxxxxx"family=wordpressERRO[0001] Create task definition failederror="ClientException: Links are not supported when networkMode=awsvpc.\n\tstatus code: 400, request id:  axxxxx-e39c-11e7-a22a-xxxxxxxxx"FATA[0001] ClientException: Links are not supported whennetworkMode=awsvpc.status code: 400, requestid: axxxxx-e39c-11e7-a22a-xxxxxxxxx

つまりFargateではLink機能はサポートされていないということです。

AWSのドキュメントには下記のように記載されてました。

Only supported if the network mode of a task definition is set to bridge.

Fargateのネットワークモードはawsvpc になるので、この機能はサポートされてないと。

解決方法

色々見てみたんですが、Link機能の代替となるようなものを見つけられなかったので、@riywo さんに質問してみたところあっさり教えてもらいました。

同じタスク定義内のコンテナはlocalhostを共有しているので、localhost+ポート番号でアクセスさせると良いです。

— riywo (@riywo)2017年12月7日

なるほど・・・

ん? 別のコンテナの起動しているポートもlocalhostとして見えるのか?

確認してみました。

確認

同じタスク定義内に、もう一つ別にssh接続用のコンテナを起動して、そのコンテナからどう見えるのかを確認してみました。
ssh接続用コンテナの作り方はこのへんを参考にしました。

docker-compose.yml
version:'2'services:sshd:image:taishin/amazonlinux-sshdports:-"22:22"wordpress:image:wordpressports:-"80:80"# links:#   - mysqlmysql:image:mysqlenvironment:MYSQL_ROOT_PASSWORD:password

起動して、sshログインし、確認してみます。

-bash-4.2# netstat-nlActive Internet connections(only servers)Proto Recv-Q Send-Q Local Address               Foreign Address             Statetcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTENtcp        0      0 0.0.0.0:3128                0.0.0.0:*                   LISTENtcp        0      0 :::3306                     :::*                        LISTENtcp        0      0 :::3128                     :::*                        LISTENudp        0      0 0.0.0.0:68                  0.0.0.0:*Active UNIX domain sockets(only servers)Proto RefCnt Flags       Type       State         I-Node Pathunix  2[ ACC]     STREAM     LISTENING     17520  /var/run/mysqld/mysqld.sock

おー 確かに別コンテナが使用しているTCP/80、TCP/3306もローカルでLISTENしてます。

ブラウザでアクセスしてみます。

image.png

image.png

データベースがないってエラーにはなってますが、MySQLへの接続は問題なくてきているようです。
ちなみにデータベースのホスト名 のところはlocalhost ではなく、127.0.0.1 と入力しないとエラーになります。
理由はこちら
https://qiita.com/TanukiTam/items/f6a08740d0fcda0db7be

完成形

最終的に作成したdocker-compose.yml は下記のようになります。

docker-compose.yml
version:'2'services:wordpress:image:wordpressports:-"80:80"environment:WORDPRESS_DB_HOST:127.0.0.1WORDPRESS_DB_PASSWORD:passwordmysql:image:mysqlenvironment:MYSQL_ROOT_PASSWORD:password

Wordpressコンテナの環境変数はこちらを参照
https://hub.docker.com/_/wordpress/

ecs-cli compose service up--launch-type FARGATE[15:20:08]WARN[0000] Skipping unsupported YAML option...           optionname=networksWARN[0000] Skipping unsupported YAML optionforservice...  optionname=networks servicename=wordpressWARN[0000] Skipping unsupported YAML optionforservice...  optionname=networks servicename=mysqlWARN[0000] Skipping unsupported YAML optionforservice...  optionname=networks servicename=sshdINFO[0001] Using ECS task definitionTaskDefinition="wordpress:11"INFO[0002] Created an ECS serviceservice=ecscompose-service-wordpresstaskDefinition="wordpress:11"INFO[0002] Updated ECS service successfullydesiredCount=1serviceName=ecscompose-service-wordpressINFO[0018](service ecscompose-service-wordpress) has started 1 tasks:(task xxxxxxx-46f4-4b29-b09f-5484982bd294).timestamp=2017-12-18 06:22:45 +0000 UTCINFO[0124] Service statusdesiredCount=1runningCount=1serviceName=ecscompose-service-wordpressINFO[0124](service ecscompose-service-wordpress) has reached a steady state.timestamp=2017-12-18 06:24:31 +0000 UTCINFO[0124] ECS Service has reached a stable statedesiredCount=1runningCount=1serviceName=ecscompose-service-wordpress

ブラウザでアクセスすると、

image.png

正常に動きました。

まとめ

Fargateでコンテナ間で通信させたい場合は、Link機能は使えないけど、localhost:ポート番号でアクセスできる!


  1. Dockerのlink機能は非推奨になってるみたいです。https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/

  2. Fargateではボリュームマウントもできないので、データ永続化させるようなMySQLコンテナを動かすってことはあまりないかと思いますが・・・

181

Go to list of users who liked

113
1

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
181

Go to list of users who liked

113

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?


[8]ページ先頭

©2009-2025 Movatter.jp