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