search
LoginSignup
5

posted at

【AWS】異なるECSサービスでのコンテナ間通信

はじめに

以前、ECSタスク内でのコンテナ間通信について調べた際にNginxコンテナとGunicornコンテナを同一タスク内に構築してみました。

そのためタスク数を増やそうとした時にNginxコンテナとGunicornコンテナが1セットとして増えていくような構成となり、それぞれ個別にスケーリングすることができませんでした。
今回はNginxとGunicornはECSサービスを分けて構成し、それぞれのサービスが個別にスケーリングできるようにしていきます。

異なるECSサービスでのコンテナ間通信を実現するために「サービス検出」機能を使用したいと思います。

構成図

以下のような構成を目指します。
diagram04.png

サービス検出関連の設定として下記を使用します。

  • 名前空間名:local
  • サービス名:ecs-django-gunicorn

サービス検出の有効化

サービス検出はECSサービス単位で設定しますが、今回はGunicorn用のECSサービスに対してサービス検出を有効にしていきます。
サービス作成ウィザードの途中でサービスの検出の統合の有効化にチェックを入れ、以下の値についても設定します。
名前空間名:サービスの名前空間の名前を入力します。
サービスの検出名:作成されるDNSレコードのプレフィックスとなる値を入力します。
TTL:作成されるDNSレコードのTTLを入力します。

スクリーンショット 2022-05-04 16.40.42.png

上記設定とした場合に名前空間名の名前で以下の2つが作成されます。

  • Cloud Map 名前空間
  • Route 53 プライベートホストゾーン

スクリーンショット 2022-05-04 16.57.23.png

スクリーンショット 2022-05-04 16.57.39.png

Cloud Map 名前空間にはサービスの検出名で指定した名前のサービスが作成されています。

スクリーンショット 2022-05-04 16.59.11.png

また、プライベートホストゾーンにはDNS名が<サービスの検出名>.<名前空間名>で、ルーティングポリシーが「複数値回答」のレコードが作成されます。
レコードはECSタスク数分の値を持つこととなります。

Nginx設定

Nginxの設定ファイルは以下のようにします。

Nginx設定ファイル
upstream my_app {
  server ecs-django-gunicorn.local:8000;
}

server {
  listen 80;

  location /static {
    alias /public/static;
  }

  location / {
    proxy_pass http://my_app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Gunicornサービスのサービス検出が有効になっていることで、「ecs-django-gunicorn.local」というDNS名でGunicornサービスで稼働しているタスク(コンテナ)を参照できるようになります。

あとがき

本記事ではマネジメントコンソールによる操作をベースとしていますが、CloudFormationで構築する場合には以下が役に立ちました。

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
What you can do with signing up
5