ECS Fargate でコンテナ間通信

ECS Fargate でコンテナ間通信

ローカル環境でdocker composeを使って開発していた環境を、
AWSのECS(Fargate)環境で動作させる時に、
コンテナ間の通信をどう設定するのか迷って調べたのでその時のメモです。

構成はNginx、php-fpmを使った環境で、設定ファイルは以下となります。

version: '3'
services:
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - phpfpm
  phpfpm:
    build: ./phpfpm
FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
server {
  listen 80;
  root  /var/www/html;
  index index.php index.html;
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;
  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }
  location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass   phpfpm:9000;
      fastcgi_index  index.php;
      include        fastcgi_params;
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
}
FROM php:fpm
RUN echo "<?php phpinfo();" > /var/www/html/index.php

テスト用として、アクセスするとPHPの情報が出力されるようになってます。
試しにアクセスして動作するかテストします。

$ docker-compose up -d
Creating network "ecstest_default" with the default driver
Creating ecstest_phpfpm_1 ... done
Creating ecstest_nginx_1  ... done

http://localhost/にアクセスすると以下が表示されます。

動作確認が出来たので、ここからECS用の設定をしていきます。
ECSのタスク定義に複数コンテナを設定する構成にします。
Fargateで利用するネットワークモードのawsvpcでは、Nginxからphpfpmへの接続時にコンテナ名を使えないので、127.0.0.1に変更します。

ネットワークモードについては、BlackBeltの資料が参考になります。
https://d1.awsstatic.com/webinars/jp/pdf/services/20200422_BlackBelt_Amazon_ECS_Share.pdf
43ページ ネットワークモード
44ページ awsvpc ネットワークモード

ということでNginxの設定ファイルを変更します。

server {
  listen 80;
  root  /var/www/html;
  index index.php index.html;
  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;
  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }
  location ~ \.php$ {
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      include        fastcgi_params;
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
}

変更が終わったらECRにイメージをプッシュします。

タスク定義は以下のように設定します。

上記のように1つのタスク定義に2コンテナ起動するように設定し、
Nginxは80番ポートをマッピング、phpfpmコンテナは9000番ポートをマッピングします。
サービス定義を作ってコンテナを起動して、サービス定義に紐づけたALBにアクセスして動作確認します。

問題なく動作してますね。
簡単なメモでしたが、こちらからは以上になります。