如何在AWS CodeDeploy步骤之间共享环境变量?

时间:2018-08-08 15:56:37

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

我正在研究利用AWS CodeDeploy的新部署策略。我从事的项目有很多环境(例如:预生产,生产)和实例(例如:EMEA,美国,亚太地区)。

我可以正常使用基本脚手架,但是我注意到无法从其他步骤(例如,安装后)中检索到 BeforeInstall 挂钩中设置的环境变量。

是否可以在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
$ 

没事。

谢谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以将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"

答案 1 :(得分:0)

您应该考虑在实例启动的userdata阶段而不是在部署时设置这些变量。这样,它们就可以在实例的生存期内供所有代码部署脚本使用。

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

在用户数据中,您将设置一个实例级变量,如下所示:

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

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

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