【问题标题】:Getting 400's from aws ELB hostcheck to work with django ALLOWED_HOSTS in aws ECS under awsvpc networking mode?从 aws ELB hostcheck 获取 400 以在 awsvpc 网络模式下与 aws ECS 中的 django ALLOWED_HOSTS 一起使用?
【发布时间】:2019-09-07 03:41:37
【问题描述】:

当迁移到具有 awsvpc 网络模式的 ECS 时,我的 ALB 说我的所有主机都不健康,因为检查 /status/ 会产生 400 秒。我已将其范围缩小到 ALLOWED_HOSTS 有问题的问题。

如何让我的网络应用程序向 ELB Healthchecker 提供 200 分?

【问题讨论】:

    标签: django amazon-ecs amazon-elb aws-load-balancer aws-application-load-balancer


    【解决方案1】:

    另一个简单的解决方案是编写一个自定义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/

    【讨论】:

    • 我发现这个解决方案比将主机添加到 ALLOWED_HOSTS 更优雅
    【解决方案2】:

    我想出的解决办法是把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 之前,我们很多人都熟悉这一行,它检索 ELB 运行状况检查器用作主机名的 EC2 实例的 IP:

    ELB_HEALTHCHECK_HOSTNAME = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=2).text
    

    ECS with awsvpc 网络下的这一行检索 EC2 实例的 IP,而不是附加到容器的 ENI。要检索 ENI 的 IP,请向环境变量 ${ECS_CONTAINER_METADATA_URI} 中的端点发送请求

    这会返回有关容器的有用元数据,包括 IPV4

    https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v3.html

    【讨论】:

      【解决方案3】:

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

      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()))
      

      【讨论】:

        猜你喜欢
        • 2019-11-17
        • 2019-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 2019-08-04
        • 1970-01-01
        • 2021-07-09
        • 2016-06-21
        相关资源
        最近更新 更多