DjangoをAWS Fargate(ECS)にデプロイするとき、ALLOWED_HOSTSを正しく設定して、ヘルスチェックをクリアしよう!

Djangoの豆知識aws

DjangoをFargateにデプロイした後、ヘルスチェックがいつまで立ってもうまく行かない。

結論

ALLOWED_HOSTSが悪かったようだ。FargateのプライベートIPを追加することで解決した。

import requests

ALLOWED_HOSTS = [ 'example.com' ] # あなたのドメイン

def get_fargate_private_address():
    try:
        resp = requests.get('http://169.254.170.2/v2/metadata', timeout=(6.0, 7.5))
        data = resp.json()
        container_meta = data['Containers'][0]
        FARGATE_PRIVARE = container_meta['Networks'][0]['IPv4Addresses'][0]
        return FARGATE_PRIVARE
    except requests.exceptions.RequestException:
        print('ALLOWED HOSTSの取得に失敗')
        raise ValueError

# ここはProductionのとき
FARGATE_PRIVARE = get_fargate_private_address()
ALLOWED_HOSTS.append(FARGATE_PRIVARE)

前提

DjangoをAWS FargateにデプロイしようとしてELBのヘルスチェックに失敗している時のはなし。

説明

DjangoではセキュリティのためにALLOWED_HOSTというものが設定されている。開発中は

ALLOWED_HOSTS =[*]

のようにするのが慣例になっているが、デプロイ後は指定したドメインだけにするなど、ちゃんと絞りたい。しかしAWS Fargateにデプロイした後、ヘルスチェックにクリアできない問題が発生した。

ELBのヘルスチェックはVPC内で通信をするため、Fargateが動いているインスタンスのローカルIPをALLOWED_HOSTSに追加する必要がある。(と理解しています。)

Fargate プラットフォームのバージョンによっては動かないこともある。

参考

AWS公式: 「タスクメタデータエンドポイントバージョン 2

Stack Overflow: 「When deploying Django into AWS Fargate how do you add the local ip into ALLOWED_HOSTS