I have a Django webapp. It runs inside Docker on Elastic Beanstalk.
I'd like to specify a health check URL for slightly more advanced health checking than "can the ELB establish a TCP connection".
Entirely reasonably, the ELB does this by connecting to the instance over HTTP, using the instance's hostname (e.g. ec2-127-0-0-1.compute-1.amazonaws.com
) as the Host
header.
Django has ALLOWED_HOSTS
which validates the Host
header of incoming requests. I set this to my application's external domain via environment variable.
Unsurprisingly and entirely reasonably, Django thus rejects ELB URL health checks due to lack of matching Host
.
We don't want to disable ALLOWED_HOSTS
because we'd like to be able to trust get_host()
.
The solutions so far seem to be:
- Somehow persuade Django to not care about
ALLOWED_HOSTS
for certain specific paths (i.e. the health check URL) - Do something funky like calling the EC2 info API on startup to get the host's FQDN and append it to
ALLOWED_HOSTS
Neither of these seem particularly pleasant. Can anyone recommend a better / existing solution?
(For the avoidance of doubt, I believe this problem to be identical to the scenario of "Disabled ALLOWED_HOSTS
, fronting HTTPD that filters on host" - I want the health check to hit Django, not a fronting HTTPD)