当使用awsvpc网络模式切换到ECS时,我的ALB说我的所有主机都不健康,因为检查/status/
会产生400秒。我已经把范围缩小到ALLOWED_HOSTS出了问题。
我如何让我的web应用程序给ELB Healthchecker提供200?
发布于 2019-04-17 08:30:38
我想出的解决方案是将LB的地址添加到ALLOWED_HOSTS
ELB_HEALTHCHECK_HOSTNAMES = [ip for network in
requests.get(os.environ['ECS_CONTAINER_METADATA_URI']).json()['Networks']
for ip in network['IPv4Addresses']]
ALLOWED_HOSTS += ELB_HEALTHCHECK_HOSTNAMES
这将从连接到容器的每个网络中获取每个IP,并将其添加到您的ALLOWED_HOSTS中。
在迁移到使用awsvpc网络模式的ECS之前,我们中的许多人都熟悉这一行,它检索EC2实例的IP,该IP由ELB health checker用作主机名:
ELB_HEALTHCHECK_HOSTNAME = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=2).text
ECS with awsvpc networking下面的这一行检索的是EC2实例的IP,而不是容器上附加的弹性网卡。要检索弹性网卡的IP,您需要向环境变量${ECS_CONTAINER_METADATA_URI}中的端点发送请求
这将返回有关容器的有用元数据,包括IPV4
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v3.html
发布于 2019-09-03 03:45:42
另一个简单的解决方案是编写一个自定义的MIDDLEWARE
,它将在检查ALLOWED_HOSTS
之前向ELB提供响应。
中间件可以像下面这样简单:
project/app/middleware.py
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class HealthCheckMiddleware(MiddlewareMixin):
def process_request(self, request):
if request.META["PATH_INFO"] == "/ping/":
return HttpResponse("pong")
settings.py
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'app.middleware.HealthCheckMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
...
]
Django中间件参考https://docs.djangoproject.com/en/dev/topics/http/middleware/
发布于 2020-06-24 18:55:34
你可以试试这个简单的方法。
from socket import gethostname, gethostbyname
# This environment variable is automatically set when ECS runs a task
if os.environ.get("AWS_EXECUTION_ENV"):
ALLOWED_HOSTS.append(gethostbyname(gethostname()))
https://stackoverflow.com/questions/55718292
复制相似问题