我刚刚开始探索负载平衡,并设置了几个运行.NET应用程序的Windows实例。
没有FTP到每个实例,在X实例中同步我的应用程序的最佳方法是什么?
(注意,我已经从我的主实例创建了一个AMI,所以这个问题更多的是针对每个实例的增量更新,而不是终止它们并再次启动集群!)
由于
答案 0 :(得分:2)
可以通过使用CloudFormation,cfn-init和cfn-hup来完成增量更新。我将构建号存储在EC2启动配置的云元数据中,当更改时,它会通过cfn-hup将下一个版本直接下载到服务器上。
我在博客上写了第一部分 - http://blog.kloud.com.au/2013/08/05/bootstrapping-on-aws。但关键部分是
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"<script>\n",
"powershell.exe add-windowsfeature web-webserver -includeallsubfeature -logpath $env:temp\\webserver_addrole.log \n",
"powershell.exe add-windowsfeature web-mgmt-tools -includeallsubfeature -logpath $env:temp\\mgmttools_addrole.log \n",
"cfn-init.exe -v -s ", {"Ref" : "AWS::StackId"}, " -r WebServerLaunchConfiguration --region ", {"Ref" : "AWS::Region"}, "\n",
"</script>\n",
"<powershell>\n",
"new-website -name", {"Ref" : "Name"}, " -port 80 -physicalpath c:\\inetpub\\", {"Ref" : "Name"}, " -ApplicationPool \".NET v4.5\" -force \n",
"remove-website -name \"Default Web Site\" \n",
"start-website -name ", {"Ref" : "Name"}, " \n",
"</powershell>"
]]}
并在元数据中
"AWS::CloudFormation::Init" : {
"config" : {
"files" : {
"c:\\cfn\\cfn-hup.conf" : {
"content" : { "Fn::Join" : ["", [
"[main]\n",
"stack=", { "Ref" : "AWS::StackId" }, "\n",
"region=", { "Ref" : "AWS::Region" }, "\n",
"interval=5"
]]}
},
"c:\\cfn\\hooks.d\\cfn-auto-reloader.conf" : {
"content": { "Fn::Join" : ["", [
"[cfn-auto-reloader-hook]\n",
"triggers=post.update\n",
"path=Resources.WebServerLaunchConfiguration.Metadata.AWS::CloudFormation::Init\n",
"action=cfn-init.exe -s ", { "Ref" : "AWS::StackId" }, " -r WebServerLaunchConfiguration --region ", { "Ref" : "AWS::Region" }, "\n"
]]}
}
},
"sources" : {
"c:\\inetpub\\wwwroot" : {"Fn::Join" : ["",[
"https://", {"Ref" : "ArtifactBucket"} ,".s3.amazonaws.com/", {"Ref":"Version"},"/artifact.zip"
]]}
},
"packages" : {
"msi" : {
"urlrewrite" : "http://download.microsoft.com/download/6/7/D/67D80164-7DD0-48AF-86E3-DE7A182D6815/rewrite_2.0_rtw_x64.msi"
}
},
"services" : {
"windows" : {
"cfn-hup" : {
"enabled" : "true",
"ensureRunning" : "true",
"files" : ["c:\\cfn\\cfn-hup.conf", "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"]
}
}
},
因此,如果你忽略了cfn-hup部分(因为我还没有写过......)你仍然可以通过维护x实例的启动配置,然后只是终止它们来完成它。这将迫使新的发布。但是如果你去了cfn-hup路径...并设置interval = 1,那么它将在一分钟内从S3存储桶中更新所有这些。
答案 1 :(得分:0)
终止并使用启动脚本加载和部署最新版本的应用程序是处理更新的一种方法。当然,您不希望一次性终止所有实例,而是希望以滚动方式执行。
如果您想进一步限制影响,可以与现有基础架构并行启动新基础架构,因为流量转换到新应用程序,您将终止现有实例。
选项二是让脚本轮询s3上的文件寻找更新,当它确实指示更新时,它将从s3下载新应用程序并进行部署。
答案 2 :(得分:0)
如果您对某些Chef很肮脏,您可以使用自定义Opsworks服务器在多个实例之间部署新代码。否则,因为数据表示类似于使用更新的实例/代码的AMI创建现有基础架构的Cloudformation模板,请部署新模板并关闭旧的基础架构。
答案 3 :(得分:0)