Go to list of users who liked
More than 5 years have passed since last update.
AWS Fargateでコンテナ間通信させたいとき
この記事はAWS Fargate Advent Calendar 2017 の19日目の記事です。
cloudpack大阪の佐々木です。
Fargateでコンテナ間通信させるときの話です。
概要
Docker環境で、コンテナ間で通信させるためにLinkという機能があります。1
ECS上でLink機能を使用しているタスク定義を、Fargateで実行しようとしてもエラーになって動きません。
実行結果
まず簡単な例として、Wordpress + MySQLという構成があるとします。2
WordpressコンテナとMySQLコンテナがあって、Wordpressの方にLinkを指定することで、mysqlという名前で通信できるようになります。
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接続用コンテナの作り方はこのへんを参考にしました。
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してます。
ブラウザでアクセスしてみます。
データベースがないってエラーにはなってますが、MySQLへの接続は問題なくてきているようです。
ちなみにデータベースのホスト名
のところはlocalhost
ではなく、127.0.0.1
と入力しないとエラーになります。
理由はこちら
https://qiita.com/TanukiTam/items/f6a08740d0fcda0db7be
完成形
最終的に作成した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
ブラウザでアクセスすると、
正常に動きました。
まとめ
Fargateでコンテナ間で通信させたい場合は、Link機能は使えないけど、localhost:ポート番号でアクセスできる!
Dockerのlink機能は非推奨になってるみたいです。https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/↩
Fargateではボリュームマウントもできないので、データ永続化させるようなMySQLコンテナを動かすってことはあまりないかと思いますが・・・↩
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme