2017-02-15 149 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%。