【问题标题】:How to share environment variables across AWS CodeDeploy steps?如何跨 AWS CodeDeploy 步骤共享环境变量?
【发布时间】:2019-01-15 23:19:56
【问题描述】:

我正在制定一种利用 AWS CodeDeploy 的新部署策略。我从事的项目有许多环境(例如:预生产、生产)和实例(例如:EMEA、US、APAC)。

我的基本脚手架工作正常,但我注意到 BeforeInstall 挂钩中设置的环境变量无法从其他步骤中检索(例如,AfterInstall)。 p>

有没有办法在 AWS CodeDeploy 步骤之间共享环境变量?

appspec.yml 的内容:

version: 0.0
os: linux
files:
  - source: /
    destination: /tmp/code-deploy
hooks:
  BeforeInstall:
    - location: utils/delivery/aws/CodeDeploy/before_install.sh
      timeout: 300
  AfterInstall:
    - location: utils/delivery/aws/CodeDeploy/after_install.sh
      timeout: 300
  ApplicationStart:
    - location: utils/delivery/aws/CodeDeploy/application_start.sh
      timeout: 300
  ValidateService:
    - location: utils/delivery/aws/CodeDeploy/validate_service.sh
      timeout: 300

我在before_install.sh中设置了一个环境变量:

export ENVIRONMENT=preprod

如果我在 after_install.sh 中引用它:

$ echo $ENVIRONMENT
$ 

什么都没有。

感谢您对此的帮助!

【问题讨论】:

    标签: bash amazon-web-services environment-variables aws-code-deploy


    【解决方案1】:

    您可以将export 放入一个临时文件中,然后将source 放入该文件中。所以在 before_install.sh 中:

    ENVIRONMENT="preprod"  
    echo "export ENVIRONMENT=\"$ENVIRONMENT\"" > "/path/to/file"
    

    注意:使用此方法,您不再导出 before_install.sh 中的变量。您只是在 after_install.sh 中编写要获取的文件:

    source "/path/to/file"
    echo "$ENVIRONMENT"
    

    【讨论】:

      【解决方案2】:

      您应该考虑在实例启动的用户数据阶段设置这些变量,而不是在部署时设置。这允许它们在实例的生命周期内可用于所有 codedeploy 脚本。

      您描述的数据类型(例如环境)与实例本身更相关,并且在代码部署期间通常不会更改。

      在您的 Userdata 中,您可以像这样设置实例级变量:

      export ENVIRONMENT="preprod"  >> /etc/environment
      

      这种方法的另一个优点是您的应用本身可能希望在启动时查询这些变量,以提供特定于环境的配置。

      如果您使用 Cloudformation,您可以将环境设置为参数,并将其传递给用户数据脚本。这样,您可以使用适当的参数启动堆栈及其资源,并为任何环境启动一致的实例。

      【讨论】:

      • 你能解释一下什么是“用户数据阶段”吗?我不清楚术语。谢谢
      • 是的,这确实是一个奇怪的名字。将实例 userdata 视为您的实例的启动脚本。您可以在该脚本中初始化所有变量,如上所示。欲了解更多信息,请参阅docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
      • 这实际上是行不通的。 /etc/environment 中设置的环境变量对 codedeploy 脚本不可见。
      • 它在 Ubuntu 16 上一直对我有用。有什么改变吗?见serverfault.com/questions/375252/…
      • 据我所知,无论环境变量如何设置,appspec 挂钩脚本仍然看不到它们。我能够让它工作的唯一方法是在钩子脚本中手动解析我的环境文件。
      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 2015-04-15
      • 2018-09-30
      • 2018-02-13
      • 2022-06-11
      • 2019-07-22
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多