如何轻松地将敏感配置数据部署到Flask Web服务器的Amazon Elastic Beanstalk

时间:2015-07-20 15:56:33

标签: python amazon-web-services configuration flask

我有一个Flask应用程序,我想部署到Amazon Elastic Beanstalk,但有以下问题:

  1. 我们的配置包含许多秘密API密钥,因此我们没有将其签入Git。
  2. Elastic Beanstalk仅部署提交给Git的文件,因此我们的配置不会作为部署过程的一部分上传。
  3. Elastic Beanstalk提供了一种设置和读取环境变量的方法 - 但Flask通常希望在运行时导入的Python文件中设置环境变量。
  4. 在我们部署源代码时,有没有办法让我们的配置文件自动上传到AWS EB?我考虑将它放在一个通过.ebextensions /中的配置创建的文件中,但是无论如何都需要在Git中,打败对象。

    或者我们是否必须(a)将所有代码转换为从环境变量中读取配置,以及(b)创建某种预启动脚本,将当前配置脚本中的值注入环境中?根据它是否在AWS上运行,必须维护两种完全不同的方式将配置数据读入我们的应用程序是不理想的。

    我已经看到了这个问题/答案 - How to specify sensitive environment variables at deploy time with Elastic Beanstalk - 并且我认为没有充分解决这个问题,因为它不能很好地扩展到大量的配置选项,也没有处理Flask通常期望它的事实以不同的格式配置。

1 个答案:

答案 0 :(得分:0)

如果您正在使用12因子应用程序,处理此类配置的最简单方法是默认情况下查找环境变量,并使用硬编码配置:

from os import environ

from flask.config import Config

class EnvConfiguration(Config):
    """Configuration sub-class that checks its environment

    If no environment variable is available,
    it falls back to the hard-coded value provided"""
    def __getitem__(self, key):
        environ.get(key, super(EnvConfig, self).__getitem__(key))

然后您可以覆盖Flask.config_class(v1 +)或Flask.make_config以确保使用的配置是您想要的配置:

class CustomApp(Flask):
    # 1.0+ way
    config_class = EnvConfiguration

    # 0.8+ way (you only need one of these)
    def make_config(self, instance_relative=False):
        config = super(CustomApp, self).make_config(instance_relative=instance_relative)
        config = EnvConfig(**config)
        return config