【问题标题】:How to dynamically add EC2 ip addresses to Django ALLOWED_HOSTS如何将 EC2 ip 地址动态添加到 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 范围。

我们能做什么?

【问题讨论】:

  • 为什么不使用主机名?
  • 您不能只使用主机名的原因是,通常需要通过负载平衡健康检查,以便将实例视为“健康”并添加到负载平衡器中。这个不使用主机名。

标签: python django amazon-web-services amazon-ec2


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 2018-09-24
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2013-05-16
      • 2021-10-28
      相关资源
      最近更新 更多