AWS CodeDeploy使用环境变量

27

我有一个Web应用程序,其中一些配置使用环境变量(DB凭据、API密钥等)。目前我正在使用Elastic Beanstalk进行部署,并可以很容易地在AWS内设置这些变量,这非常棒,因为我不需要将这些敏感数据放在代码库中。

然而,我正在考虑从Elastic Beanstalk切换,以便能够更灵活地利用我的Web实例,自然而然地,我正在研究如何使用CodeDeploy进行部署(从我的Codeship CI设置中)。CodeDeploy相当简单,并且我已经成功地将其与Codeship集成了起来,但是我注意到,与Elastic Beanstalk不同,CodeDeploy没有内置的功能可以设置环境变量。是否有人有任何此过程的最佳实践?


4
我也在寻找这个问题的答案。 - Jon
4个回答

8

我发现设置环境变量的一种方法是通过在AfterInstall钩子中运行的脚本(在appspec中指定),具体请参考http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html

我可以通过调用实例元数据来确定当前部署的环境,并获取我的实例ID,然后利用aws cli执行describe-tags过滤我的实例ID,其中我设置了一个标记为“环境”的标签。

ID=$(curl "http://169.254.169.254/latest/meta-data/instance-id")
aws --region us-east-1 ec2 describe-tags --filters Name=resource-id,Values=$ID Name=key,Values=Environment

虽然我不是很喜欢这种方法,但在 Code Deploy 有内置传递参数到 appspec 的功能之前,这是我能找到的最佳解决方案。


5
如果不介意使用aws cli/sdk获取环境变量,更好的方法是使用AWS参数存储(Parameter Store),它专门用于保护机密信息。教程在这里,但它仍未与appspec.yml集成。 - antiplayer

4
假设您使用GitHub管理代码,以下是一种可能的管理环境的方法:
使用git-crypt(https://github.com/AGWA/git-crypt)加密敏感信息。您可以将解码这些文件的密钥放在服务器上。在codedeploy的afterInstall阶段,您可以解密并设置环境。
优点是现在您可以以安全的方式将所有信息放在一个地方。

3

在bash脚本中,您可以使用变量(如果它们不是“秘密”):

  1. LIFECYCLE_EVENT:此变量包含与脚本相关联的生命周期事件的名称。
  2. DEPLOYMENT_ID:此变量包含当前部署的部署ID。
  3. APPLICATION_NAME:此变量包含正在部署的应用程序的名称。这是用户在控制台或AWS CLI中设置的名称。
  4. DEPLOYMENT_GROUP_NAME:此变量包含部署组的名称。部署组是与应用程序关联的一组实例,您可以将其定位到部署。
  5. DEPLOYMENT_GROUP_ID:此变量包含与当前部署对应的AWS CodeDeploy中的部署组ID

示例:

if [ "$DEPLOYMENT_GROUP_NAME" == "staging" ]
then
    
    #make directory with Deployment ID
    foldernameid=$(date +%Y%m%d)-$DEPLOYMENT_ID
    mkdir -p /var/www/releases/"$foldernameid"

    #print AWS variables to file
    awsvar1=$DEPLOYMENT_ID
    awsvar2=$LIFECYCLE_EVENT
    awsvar3=$APPLICATION_NAME
    awsvar4=$DEPLOYMENT_GROUP_NAME
    awsvar5=$DEPLOYMENT_GROUP_ID
    destdir=/var/www/releases/aws_var.txt
    echo "Deployment id" $awsvar1 "Lifecyckle_Event" $awsvar2 
    "Application_Name" $awsvar3 "Deployment_Group_Name" $awsvar4 
    "Deployment_Group_ID" $awsvar5 >>  $destdir

fi

更多内容请参见:

https://aws.amazon.com/blogs/devops/using-codedeploy-environment-variables/


我应该在哪个阶段从控制台向CodePipeline传递DEPLOYMENT_GROUP_NAME变量? - Reyansh Kharga
我明白了。它在 CodeDeploy -> 应用程序 下面。 - Reyansh Kharga
我明白了,你的意思是从AWS控制台面板开始。 - BartZalas
如果我想从我的CodeDeploy afterInstall.sh访问我EC2实例的系统范围环境变量,该怎么办? - dKab

-1

看起来可以使用环境变量(主要是DEPLOYMENT_GROUP_NAME)。

请查看亚马逊的此指南


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接