TL; DR - 建议使用CI服务器保持AWS环境是最新的,并始终从同一个CNAME指向?
我们刚开始将AWS用于新项目,作为项目的一部分,我的任务是创建一个简单的演示环境,并每晚更新此环境以显示前几天的进度。
我正在使用Jenkins和Cloudformation插件来实现这一点,它可以很好地在现有安全组中创建一个简单的EC2实例,由Route53 CNAME指向,因此可以在subdomain.example.com上进行浏览。
我遇到的问题是我无法重新部署相同的堆栈,因为记录集已经存在,CF不会覆盖它。
有很多关于如何部署环境的指南,但我很难找到关于如何使环境保持最新的指南。
所以我想我的问题是:使用CI服务器建议的方式是什么,以使AWS环境保持最新,并始终从同一个CNAME指向?
答案 0 :(得分:1)
我同意你的问题中的评论,即最好通过持续集成(Jenkins)创建一个干净的服务器并上传/更新它。在后面的评论中提到的这种情况下,Docker非常有用。
但是,如果您倾向于 "不可变基础架构" ,并希望将所有内容封装在您的CloudFormation模板中(包括在Route53中创建记录)可以在 AWS::CloudFormation::Init
部分执行类似以下代码段的操作 - (有关详情,请参阅' http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource- init.html')
"Resources": {
"MyServer": {
"Type": "AWS::EC2::Instance",
"Metadata": {
"AWS::CloudFormation::Init": {
"configSets" : { "Install" : [ "UpdateRoute53", "ConfigSet2, .... ] },
"UpdateRoute53" : {
"files" : {
"/usr/local/bin/cli53" : {
"source" : "https://github.com/barnybug/cli53/releases/download/0.6.3/cli53-linux-amd64",
"mode" : "000755", "owner" : "root", "group" : "root"
},
"/tmp/update_route53.sh" : {
"content" : { "Fn::Join" : ["", [
"#!/bin/bash\n\n",
"PRIVATE_IP=`curl http://169.254.169.254/latest/meta-data/local-ipv4/`\n",
"/usr/local/bin/cli53 rrcreate ",
{"Ref": "Route53HostedZone" },
" \"", { "Ref" : "ServerName" },
" 300 A $PRIVATE_IP\" --replace\n"
]]},
"mode" : "000755", "owner" : "root", "group" : "root"
}
},
"commands" : {
"01_UpdateRoute53" : {
"command" : "/tmp/update_route53.sh > /tmp/update-route53.log 2>&1"
}
}
}
}
},
"Properties": { ... }
}
}
....
我已经省略了大块模板,专注于重要信息。 "UpdateRoute53"
部分会创建2个files
:
/usr/local/bin/cli53
- CLI53是围绕AWS Route53的一个很好的小包装器程序(因为AWS53版本的route53使用非常糟糕,即需要创建大量的JSON) - 请参阅https://github.com/barnybug/cli53有关CLI53的更多信息
/tmp/update_route53.sh
- 创建一个脚本,通过我们在(1)中安装的CLI53脚本上传到Route53。此脚本通过PRIVATE_IP
命令确定curl
到特殊AWS元数据端点(有关详细信息,请参阅http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。 "区域ID"通过CloudFormation参数(即{"Ref": "Route53HostedZone" }
)注入正确的托管区域。最后,记录的名称来自"ServerName"
参数,但设置方式因模板而异。
在"commands"
部分,我们运行我们在"files"
部分(2)中创建的脚本,并将结果输出到/tmp
文件夹中的日志文件。
注意(1) - 参数Route53HostedZone
可以声明如下: -
"Route53HostedZone": {
"Description": "Route 53 hosted zone for updating internal DNS",
"Type": "AWS::Route53::HostedZone::Id",
"Default": "VIWIWK4PYAC23B"
}
关于"AWS::Route53::HostedZone::Id"
)参数类型的一个很酷的事情是它显示一个组合框(当通过AWS Web控制台运行CloudFormation模板时),显示区域名称,其值为区域ID。
注意(2) - --replace
脚本中的CLI53
属性会覆盖您可能想要的现有记录。
注意(3) - 另一种选择是通过Jenkins进行SSH(例如使用"发布SSH插件" - https://wiki.jenkins-ci.org/display/JENKINS/Publish+Over+SSH+Plugin),确定私有IP和使用CLI53脚本从您登录的服务器甚至构建服务器(Jenkins运行时)更新Route53。
很多选项 - 希望你把它分类! : - )