在AWS上的负载平衡Windows实例上同步文件的最佳方法?

时间:2013-08-09 08:26:36

标签: .net amazon-web-services rsync

我刚刚开始探索负载平衡,并设置了几个运行.NET应用程序的Windows实例。

没有FTP到每个实例,在X实例中同步我的应用程序的最佳方法是什么?

(注意,我已经从我的主实例创建了一个AMI,所以这个问题更多的是针对每个实例的增量更新,而不是终止它们并再次启动集群!)

由于

4 个答案:

答案 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)

之前的建议都是可靠的选择。另一种选择是使用像DropboxBox这样的云存储提供商。您将新文件复制到“共享文件夹”,并将其更新到服务器计算机,这些计算机也应正确设置云存储应用程序。

这种方法的主要优点是它易于设置,对于大多数应用程序,任何云存储应用程序的免费或轻量版本都可以完成这项工作。

但也有缺点。主要是,进行滚动升级可能比较棘手(并非不可能,您需要手动触发与云存储的同步)

无论如何,不​​要使用直接FTP - 默认情况下它是一种不安全的协议 - 您的文件在传输过程中不会被加密。通过VPN或SSH隧道传输流量,或使用Powershell。

相关问题