DjangoをAWS Fargate(ECS)にデプロイするとき、ALLOWED_HOSTSを正しく設定して、ヘルスチェックをクリアしよう!
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」
ディスカッション
コメント一覧
まだ、コメントがありません