2017-02-15 151 views
1

我的基本問題:如何將我的魔豆彈性期間設置的環境變量將生效部署流程?環境變量部署

我不是在談論部署在部署後,這將是我的應用程序可以訪問期間設置環境變量,我想設置環境變量,將修改彈性青苗的構建腳本的特定行爲。

要清楚 - 我一般認爲這是一個壞主意,但所以我要把這一點作爲一個實驗可能是在這種情況下確定。這裏有一些關於爲什麼我正在研究這個問題的背景,以及爲什麼我認爲它可能是正確的:

我正在將服務器從美國的AWS轉移到中國的AWS,並且發現部署了服務器在50%〜100%的時間內失敗,這取決於當天。這是發展過程中的一大痛苦,但我主要關心我將如何在生產中完成這項工作。

這是一臺運行Python 2.7的亞馬遜Linux服務器,並且日誌表明這些故障主要是讀取超時錯誤,有幾次連接重置被同層次拋出,全部由pip安裝生成,同時嘗試從pypi下載軟件包。爲了驗證這一點,我已經對我的實例進行了手動安裝一些軟件包,並在小樣本大小看到類似的失敗率。請注意,在嘗試訪問中國GFW另一端的內容時,這種情況非常普遍。

所以,我寫了一個腳本,PIP下載 S上的包我的本地機器,然後AWS同步他們s到位於同一區域作爲我的服務器的S3桶。這將消除在部署時跨越GFW的需要。我原來的計劃是在S3中添加一個.ebextension到pip緩存,但是(除非我遺漏了某些東西),這有點令人驚訝地看起來並不直截了當。

所以,作爲B計劃,我重定向到包上的實例的本地目錄。這是行之有效的,但我不能得到pip安裝拉本地目錄的軟件包,而不是從pypi下載軟件包。

繼PIP文檔,我預計PIP_FIND_LINKS環境變量指向我的包目錄將具有畫中畫「自然地」從我的目錄拉包,而不是的PyPI。這會使這個變更對EB構建腳本透明,爲什麼我認爲這可能是一個合理的解決方案。

到目前爲止我曾嘗試:

1)命令其中出口PIP_FIND_LINKS = /路徑/到/包,沒有運氣。我認爲這是由於部署步驟從不同的會話中調用,所以然後我嘗試:

2)命令其中(除了前面的出口)追加出口PIP_FIND_LINKS = /路徑/要/包到〜。/ profile,試圖讓這適用於任何新的會話。

我試圖通過發行兩ec2_user和根,既不工作的命令。

與此同時,我希望有一些對EB,pip等細微差別更有經驗的人可能能夠提供一些指導。

+0

哪個pypi庫是問題的根源?有時我的requirements.txt包含一個不在pypi上但通過setup()從repo安裝的庫。這在部署中觸發了失敗。我的解決方案是修復需求並使用docker環境,以便更好地控制部署腳本。 –

+0

失敗的庫因運行而異,有時也沒有失敗。這看起來似乎與隨機連接阻塞相關,在穿越GFW時這是相當常見的,爲什麼我想在本地存儲我的依賴關係。我也應該提到,這個需求文件的超集在中國以外的地方使用了一年多沒有問題。 – gary

回答

1

經過一番思考,我決定pip config file應該是比環境變量更可靠的解決方案。

事實證明,使用.ebextensions易於實現。我首先創建的下載腳本,然後在virtualenv中的文件夾直接創建配置文件:

files: 

    /home/ec2-user/download_packages.sh: 
    mode: "000500" 
    owner: root 
    group: root 
    content: | 
     #!/usr/bin/env bash 

     package_dir=/path/to/packages 

     mkdir -p $package_dir 
     aws s3 sync s3://bucket/packages $package_dir 

    /opt/python/run/venv/pip.conf: 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     [install] 
     find-links = file:///path/to/packages 
     no-index=false 

最後,命令用於調用我們剛剛創建的腳本:

commands: 

    03_download_packages: 
    command: bash /home/ec2-user/download_packages.sh 

一潛在的問題是pip繞過本地軟件包目錄並下載存儲在我們私人git倉庫中的軟件包,所以仍然存在超時錯誤的可能性,但這些只是需要安裝的一小部分軟件包,所以它應該是可行的。

仍然不確定這是否是一個長期的解決方案,但它非常簡單,並且(經過一天的測試......)失敗率從50%〜100%下降到0%。