はじめに
以前、ECSタスク内でのコンテナ間通信について調べた際にNginxコンテナとGunicornコンテナを同一タスク内に構築してみました。
そのためタスク数を増やそうとした時にNginxコンテナとGunicornコンテナが1セットとして増えていくような構成となり、それぞれ個別にスケーリングすることができませんでした。
今回はNginxとGunicornはECSサービスを分けて構成し、それぞれのサービスが個別にスケーリングできるようにしていきます。
異なるECSサービスでのコンテナ間通信を実現するために「サービス検出」機能を使用したいと思います。
構成図
サービス検出関連の設定として下記を使用します。
- 名前空間名:local
- サービス名:ecs-django-gunicorn
サービス検出の有効化
サービス検出はECSサービス単位で設定しますが、今回はGunicorn用のECSサービスに対してサービス検出を有効にしていきます。
サービス作成ウィザードの途中でサービスの検出の統合の有効化
にチェックを入れ、以下の値についても設定します。
名前空間名
:サービスの名前空間の名前を入力します。
サービスの検出名
:作成されるDNSレコードのプレフィックスとなる値を入力します。
TTL
:作成されるDNSレコードのTTLを入力します。
上記設定とした場合に名前空間名
の名前で以下の2つが作成されます。
- Cloud Map 名前空間
- Route 53 プライベートホストゾーン
Cloud Map 名前空間にはサービスの検出名
で指定した名前のサービスが作成されています。
また、プライベートホストゾーンにはDNS名が<サービスの検出名>.<名前空間名>
で、ルーティングポリシーが「複数値回答」のレコードが作成されます。
レコードはECSタスク数分の値を持つこととなります。
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で構築する場合には以下が役に立ちました。