2015-07-20 50 views
0

我有我想要部署到Amazon彈性魔豆的燒瓶中的應用程序,但有以下問題:如何容易敏感的配置數據部署到Amazon彈性青苗的瓶Web服務器

  1. 我們的配置包含了很多的祕密API密鑰,所以我們沒有將它簽入Git。
  2. Elastic Beanstalk只部署提交給Git的文件,因此我們的配置不會作爲部署過程的一部分上載。
  3. Elastic Beanstalk提供了一種設置和讀取環境變量的方法 - 但Flask通常需要在運行時導入的Python文件中設置環境變量。

當我們部署它時,有沒有一種方法可以讓我們的配置文件自動上傳到AWS EB以及源代碼?我考慮過將它放在一個通過.ebextensions/...中的配置創建的文件中,但這隻需要在Git中就可以擊敗對象。 (a)將所有代碼轉換爲從環境變量中讀取配置,(b)創建某種預啓動腳本,將當前配置腳本中的值注入到環境中?根據是否在AWS上運行,必須保持兩種完全不同的方式將配置數據讀入我們的應用程序是不理想的。

我看到這個問題/答案 - How to specify sensitive environment variables at deploy time with Elastic Beanstalk - 我認爲這不足以解決這個問題,因爲它不能很好地擴展到大量的配置選項,也沒有處理Flask通常期望其配置的事實不同的格式。

回答

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 
+0

這種做法只是踢可以在路上 - 從環境中讀取的值是很容易的(即使我們只是更新app.config從啓動時的os.environ開始),但是將數據*轉換成環境變成了艱鉅的部分。這將如何以實用和有效的方式進行管理? – Kylotan