3

我有一个在 Elastic Beanstalk 上运行的 Django 应用程序。我可以毫无问题地访问我的网站example.com。我已经设置了自动 https 重定向,所以它总是指向 https。我已将其设置为您无法查看站点example.elasticbeanstalk.com域 - 如果您去那里,您最终会收到响应代码 400。

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

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

我猜错误来自

  1. 不允许连接example.elasticbeanstalk.com
  2. Haivng 自动 HTTP -> HTTPS 重定向(虽然我猜会出现 302)

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

4

2 回答 2

7

失败的原因是运行状况检查会检查 EC2 实例私有 IP。这可以随 ELB 改变,因此您需要动态获取实例的私有 IP 并将其添加到主机。请参阅如何将 EC2 ip 地址动态添加到 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 帖子中找到了这个答案。虽然它解决了问题,但我认为这不是一个好的答案,并且可能不安全。

如果您将此代码添加到您的.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/为 中指定的健康检查 urlConfig -> Loan Balancer -> Health Check Pathsub.example.com您的域。他们还更新了健康检查器,所以ELB-HealthChecker/2.0现在是 - 另一件需要注意的事情。

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

于 2019-02-18T01:19:36.970 回答
4

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

import requests
EC2_PRIVATE_IP = None
try:
    security_token = requests.put(
        'http://169.254.169.254/latest/api/token',
        headers={'X-aws-ec2-metadata-token-ttl-seconds': '60'}).text

    EC2_PRIVATE_IP = requests.get(
        'http://169.254.169.254/latest/meta-data/local-ipv4',
        headers={'X-aws-ec2-metadata-token': security_token},
        timeout=0.01).text
except requests.exceptions.RequestException:
    pass

if EC2_PRIVATE_IP:
    ALLOWED_HOSTS.append(EC2_PRIVATE_IP)
于 2021-07-16T23:27:50.767 回答