3

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

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

4

3 回答 3

9

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

中间件可以很简单:

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/

于 2019-09-02T19:45:41.567 回答
6

我想出的解决方案是将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

于 2019-04-17T00:30:38.353 回答
2

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

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()))
于 2020-06-24T10:55:34.047 回答