首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从aws ELB主机检查中获取400,以便在awsvpc网络模式下与aws ECS中的django ALLOWED_HOSTS一起工作?

从aws ELB主机检查中获取400,以便在awsvpc网络模式下与aws ECS中的django ALLOWED_HOSTS一起工作?
EN

Stack Overflow用户
提问于 2019-04-17 08:30:38
回答 3查看 1.5K关注 0票数 3

当使用awsvpc网络模式切换到ECS时,我的ALB说我的所有主机都不健康,因为检查/status/会产生400秒。我已经把范围缩小到ALLOWED_HOSTS出了问题。

我如何让我的web应用程序给ELB Healthchecker提供200?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-17 08:30:38

我想出的解决方案是将LB的地址添加到ALLOWED_HOSTS

代码语言:javascript
复制
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用作主机名:

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2019-09-03 03:45:42

另一个简单的解决方案是编写一个自定义的MIDDLEWARE,它将在检查ALLOWED_HOSTS之前向ELB提供响应。

中间件可以像下面这样简单:

project/app/middleware.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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/

票数 7
EN

Stack Overflow用户

发布于 2020-06-24 18:55:34

你可以试试这个简单的方法。

代码语言:javascript
复制
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()))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55718292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档