我有一个Web应用程序,它使用环境变量进行某些配置(数据库凭据,API密钥等)。我目前正在使用Elastic Beanstalk进行部署,并且可以在AWS中轻松设置这些内容,这很棒,因为我的代码库中没有这些敏感数据。
但是,我正在考虑从Elastic Beanstalk切换,以便我可以更灵活地使用我的Web实例,我自然而然地想要使用CodeDeploy部署(来自我的Codeship CI设置)。 CodeDeploy非常简单,我已经很好地将它与Codeship集成,但我注意到没有内置功能可以使用CodeDeploy设置环境变量,就像Elastic Beanstalk一样。有没有人有这个过程的最佳实践?
答案 0 :(得分:5)
我发现设置环境变量的一种方法是通过在AfterInstall挂钩期间运行的脚本(在appspec http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html中指定)。
我能够通过调用我的实例元数据来确定我当前正在这些脚本中部署的环境,在那里我得到我的实例ID,然后利用aws cli执行过滤到我的实例Id的describe-tags我在哪里标签设置为环境
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之前,这是我能找到的最好的。
答案 1 :(得分:2)
假设您使用github来管理代码,这是管理环境的一种可能方法
使用git-crypt(https://github.com/AGWA/git-crypt)加密敏感信息。您可以将密钥放在服务器上解码这些文件。在codedeploy afterInstall阶段期间,您可以解密并设置环境。
现在的好处是,您可以安全地将所有信息放在一个地方。
答案 2 :(得分:1)
您可以在bash脚本中使用变量:
- LIFECYCLE_EVENT:此变量包含与脚本关联的生命周期事件的名称。
- DEPLOYMENT_ID:此变量包含当前部署的部署ID。
- APPLICATION_NAME:此变量包含要部署的应用程序的名称。这是用户在 控制台或AWS CLI。
- DEPLOYMENT_GROUP_NAME:该变量包含部署组的名称。部署组是一组关联的实例 与您以部署为目标的应用程序一起使用。
- 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/
答案 3 :(得分:-2)
似乎可以使用环境变量(主要是您的DEPLOYMENT_GROUP_NAME)。
请参阅亚马逊的this guide。