Elastic Beanstalk Health严重,失败了代码400 - 即使我可以访问我的网站

问题描述 投票:0回答:1

我有一个在Elastic Beanstalk上运行的Django应用程序。我可以访问我的网站没有问题在example.com。我已经设置了自动https重定向,因此它始终指向https。我已经设置好了你不能查看网站example.elasticbeanstalk.com域名 - 如果你去那里你最终得到响应代码400。

我的自动缩放组是负载平衡的。我的应用程序未通过状态码400进行运行状况检查,即使我可以导航到我的站点也没有响应代码200的问题。我的日志显示:

***amazon IP*** (-) - - [date] "GET / HTTP/1.1" 400 26 "-" "ELB-HealthChecker/2.0"

我猜这个错误要么来自

  1. 不允许在example.elasticbeanstalk.com连接
  2. 有自动HTTP - > HTTPS重定向(虽然这会产生一个302我猜)

当健康检查ping一个站点时,它是ping你的自定义域(example.com)还是正在使用elasticbeanstalk.com域?我该怎么做才能解决这个问题或进一步诊断错误?我宁愿不允许在elasticbeanstalk.com域中的流量,因为我认为我不能获得SSL。

amazon-web-services amazon-elastic-beanstalk aws-elb
1个回答
0
投票

失败的原因是健康检查检查EC2实例私有IP。这可以随ELB而改变,因此您需要动态获取实例的私有IP并将其添加到主机。见How to dynamically add EC2 ip addresses to Django ALLOWED_HOSTS

import requests
EC2_PRIVATE_IP = None
try: EC2_PRIVATE_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout=0.01).text
except requests.exceptions.RequestException: pass
if EC2_PRIVATE_IP: ALLOWED_HOSTS.append(EC2_PRIVATE_IP)

(可能)不好的答案

我在另一个SO post找到了这个答案。虽然它解决了这个问题,但我认为这不是一个好的答案,可能不安全。

如果您将此代码添加到.ebextensions/something.config文件中,它会将具有特定状态请求的Health Checker的任何请求重定向到您的域。

files:
  "/etc/httpd/conf.d/eb_healthcheck.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
        <If "req('User-Agent') == 'ELB-HealthChecker/2.0' && %{REQUEST_URI} == '/status/'">
            RequestHeader set Host "sub.example.com"
        </If>

/status/替换为Config -> Loan Balancer -> Health Check Path中指定的运行状况检查URL,并将sub.example.com替换为您的域名。他们还更新了健康检查器,所以它现在是ELB-HealthChecker/2.0 - 另一件需要注意的事情。

但是:出于安全原因,它可能不太好,我认为这可能是欺骗性的。如果您使用默认的/链接,有人可以欺骗ELB-HealthChecker/2.0,然后轻松猜测您的链接。我不太熟悉某人可以用set Host命令做什么,它可能是无害的。

© www.soinside.com 2019 - 2024. All rights reserved.