我刚刚开始探索负载平衡,并设置了几个运行 .NET 应用程序的 Windows 实例。
如果没有对每个实例进行 FTP 传输,那么在 X 实例之间同步我的应用程序的最佳方式是什么?
(注意,我已经从我的主实例创建了一个 AMI,所以这个问题更多是针对每个实例的增量更新,而不是终止它们并再次启动集群!)
谢谢
我刚刚开始探索负载平衡,并设置了几个运行 .NET 应用程序的 Windows 实例。
如果没有对每个实例进行 FTP 传输,那么在 X 实例之间同步我的应用程序的最佳方式是什么?
(注意,我已经从我的主实例创建了一个 AMI,所以这个问题更多是针对每个实例的增量更新,而不是终止它们并再次启动集群!)
谢谢
可以通过使用 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 路径...并设置间隔 = 1,那么它将在一分钟内从 S3 存储桶中更新所有这些。
前面的建议都是可靠的选择。另一种选择是使用云存储提供商,如Dropbox或Box。您将新文件复制到“共享文件夹”,它们会更新到服务器计算机,服务器计算机也应该正确设置云存储应用程序。
这种方法的主要优点是很容易设置,对于大多数应用程序来说,任何云存储应用程序的免费或轻量版本都可以完成这项工作。
不过也有缺点。主要是滚动升级可能会比较棘手(并非不可能,您需要手动触发与云存储的同步)
无论如何,不要使用直接的 FTP - 默认情况下它是一个不安全的协议 - 您的文件在传输过程中没有加密。通过 VPN 或 SSH 对您的流量进行隧道传输,或者改用 Powershell。
如果您对某些 Chef 感到满意,您可能可以使用自定义 Opsworks 服务器跨多个实例部署新代码。否则,正如 datasage 建议的那样,使用更新的实例/代码的 AMI 创建现有基础架构的 Cloudformation 模板,部署新模板并关闭旧基础架构。
终止并让启动脚本加载和部署应用程序的最新版本是处理更新的一种方式。当然,您不想一次终止所有实例,而是希望以滚动方式进行。
如果您想进一步限制您的影响,您可以在现有基础架构的同时启动一个新的基础架构,当流量切换到新应用程序时,您将终止现有实例。
选项二是让脚本轮询 s3 上的文件以查找更新,当它确实指示更新时,它将从 s3 下载新应用程序并部署它。