如何将 EC2 ip 地址动态添加到 Django ALLOWED_HOSTS
Posted
技术标签:
【中文标题】如何将 EC2 ip 地址动态添加到 Django ALLOWED_HOSTS【英文标题】:How to dynamically add EC2 ip addresses to Django ALLOWED_HOSTS 【发布时间】:2018-04-26 21:57:47 【问题描述】:我们最近更改了部署策略以使用 AWS Auto Scaling 组。
我们在生产中遇到的一个问题是新创建的 EC2。 我们的应用程序开始返回:
Invalid HTTP_HOST header:
<ip_address>. You may need to add <ip_address> to ALLOWED_HOSTS`
因为这些 EC2 不在原始 Django ALLOWED_HOSTS
中。
每个新创建的 EC2 都必须重新部署是没有意义的;这与“自动缩放”的意义相矛盾。 此外,出于安全原因,我们不想使用通配符或 IP 范围。
我们能做什么?
【问题讨论】:
为什么不使用主机名? 您不能只使用主机名的原因是,通常需要通过负载平衡健康检查,以便将实例视为“健康”并添加到负载平衡器中。这个不使用主机名。 【参考方案1】:下面的 sn-ps 将找到与您的 EC2 实例关联的公共 IP 地址或弹性 IP 地址,并将其附加到 ALLOWED_HOSTS。
安装 PyCurl
pip install pycurl
Python 3
import pycurl
from io import BytesIO
# Determine Public IP address of EC2 instance
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'checkip.amazonaws.com')
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
# Body is a byte string, encoded. Decode it first.
ALLOWED_HOSTS.append(buffer.getvalue().decode('iso-8859-1').strip())
Python 2
import pycurl
from StringIO import StringIO
buffer = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'checkip.amazonaws.com')
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
# In Python 2, we can cast the return value to
# string without knowing the exact encoding.
ALLOWED_HOSTS.append(str(buffer.getvalue()).strip())
【讨论】:
【参考方案2】:您可以通过发出 API 请求来检索 EC2 实例元数据
curl http://169.254.169.254/latest/meta-data/
GET http://169.254.169.254/latest/meta-data/
source
您可以通过调用 API 来获取特定实例的私有 IP:
GET http://169.254.169.254/latest/meta-data/local-ipv4
因此,在您的 Django 设置文件中添加此脚本以“动态”将 IP 添加到您允许的主机:
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)
【讨论】:
以上是关于如何将 EC2 ip 地址动态添加到 Django ALLOWED_HOSTS的主要内容,如果未能解决你的问题,请参考以下文章
如何将 datastax 开发中心连接到亚马逊 EC2 实例中的远程集群?