LoginSignup
9
5

More than 1 year has passed since last update.

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

Posted at

はじめに

以前、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で構築する場合には以下が役に立ちました。

9
5
0

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
9
5