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

时间:2019-02-18 01:01:33

标签: amazon-web-services amazon-elastic-beanstalk aws-elb

我有一个在Elastic Beanstalk上运行的Django应用程序。我可以通过example.com来访问我的网站。我设置了自动https重定向,以便它始终指向https。我已经对其进行了设置,因此您无法查看站点example.elasticbeanstalk.com的域-如果转到该域,最终将得到响应代码400。

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

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

我猜错误是来自

  1. 不允许在example.elasticbeanstalk.com进行连接
  2. 使用自动HTTP-> HTTPS重定向(尽管我猜想会有302)

运行状况检查对站点执行ping操作时,是对您的自定义域(example.com)进行ping操作还是对elasticbeanstalk.com域进行固定?我该怎么做才能解决此问题或进一步诊断错误?我宁愿不允许elasticbeanstalk.com域的流量,因为我认为我无法在该域上获得SSL。

2 个答案:

答案 0 :(得分: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/中指定的健康检查URL,Config -> Loan Balancer -> Health Check Path替换您的域中的sub.example.com。他们还更新了运行状况检查程序,因此现在ELB-HealthChecker/2.0 -需要注意的另一件事。

但是:出于安全原因,这可能不是很好,我认为这可能是伪造的。如果您使用默认的/链接,则有人可能会欺骗ELB-HealthChecker/2.0,然后轻易地猜出您的链接。我对某人可以使用set Host命令执行的操作不是很熟悉,这可能是无害的。

答案 1 :(得分:0)

如果您最近迁移到 Amazon Linux 2 并受到 IMDSv2 的影响,那么您必须像这样使用安全令牌

conditions