亚马逊AWS官方博客

使用 Visual Studio 结合 AWS Elastic Beanstalk 发布高可用的 .NET 应用

背景介绍

开发人员最喜欢做的事情是直接通过IDE管理发布代码,AWS Toolkit可以让开发人员将应用程序直接发布到AWS的云平台,并轻松实现部署调用与开发,并通过Elastic Beanstalk堆栈实现应用程序的一键部署,代码版本管理,数据库管理,负载均衡与自动扩展等。AWS Elastic Beanstalk 是一项易于使用的服务,用于在熟悉的服务器(例如 Apache 、Nginx、Passenger 和 IIS )上部署和扩展使用 Java、.NET、PHP、Node.js、Python、Ruby、GO 和 Docker 开发的 Web 应用程序和服务。

我们只需上传代码,Elastic Beanstalk 即可自动处理从容量预置、负载均衡、自动扩展到应用程序运行状况监控的部署。同时能够完全控制为应用程序提供支持的 AWS 资源,并可以随时访问底层资源。

Elastic Beanstalk 不额外收费,只需为存储和运行应用程序所需的 AWS 资源支付费用。

AWS Toolkit for Visual Studio 是一个适用于对 Visual Studio 集成开发环境 (IDE) 的插件。该工具包使开发人员使用亚马逊 AWS 更容易开发,调用和部署 .NET 应用程序。

 

实验准备

官方工具下载地址:https://aws.amazon.com/cn/visualstudio/

备用地址:

AWS Toolkit for Visual Studio 2017和2019 https://s3testlq01.s3.cn-north-1.amazonaws.com.cn/AWSToolkitPackage.vsix
AWS Toolkit for Visual Studio 2013-2015 https://s3testlq01.s3.cn-north-1.amazonaws.com.cn/AWSToolsAndSDKForNet_sdk-3.3.606.0_ps-3.3.604.0_tk-1.14.5.0.msi

 

实验说明

  • 涉及AWS组件:
    • AWS Elastic Beanstalk
    • AWS Toolkit for Visual Studio
    • Application Load Balance
  • 实验流程
    • 环境准备
    • 配置Visual Studio
    • 配置Elastic Beanstalk
    • 蓝绿部署
    • 自动扩展与负载均衡
    • 转换负载均衡器

 

环境准备

本次演示选择使用的环境为Visual Studio 2019,可以参考Visual Studio 官方教程安装并下载https://visualstudio.microsoft.com/zh-hans/vs/

下载AWS Toolkit for Visual Studio 2019后执行VSIX installer ,执行时需要关闭Visual Studio。

 

配置Visual Studio

在Visual Studio的资源管理器中进行项目发布,可以看到Publish to AWS Elastic Beanstalk…。

回到AWS控制台的IAM,选择用户,本次测试选择具有admin的权限的用户,但是在生产环境中要按照权限最小化的原则,可以在IAM Policy中设定具体的用户具有什么样的权限。

这里我们直接选择导入csv文件,当然也可以手动将Access Key与Secret Key填写到Visual Studio中。

Account Number就是我们AWS的账号。

Account Type 选择China Region,否则选择global Region。

这里注意:点击OK之后,关闭Publish to Amazon Web Services这个操作界面,然后重新发布项目Publish to AWS Elastic Beanstalk…

我们可以将项目或应用程序发布到Beijing(BJS)或Ningxia(ZHY)。这里我们选择Beijing这个Region。

—这一步要定义自己应用程序的名称:application name

—定义自己应用环境的名称:Environment。环境建议定义应用名-test或-dev或-prod。因为后面会介绍到Elastic Beanstalk的蓝绿部署,可以无缝地切换我们的开发和生产环境。

—最后一步是检查我们的域名有没有被占用:Check availability…

下一步,定义软件环境。主要是包含两个操作:一是运行应用程序的OS环境。二是应用程序所运行的资源配置。

我们会发现有非常多的instance类型可以选择,由于环境run的是windows server所以推荐至少是C5.xlarge以上的instance类型4vcpu,8GiB RAM.

还有一个配置不要忽略,就是Key pair. 这个是登陆instance虚拟机的密钥。确保这个密钥文件在自己的手里,如果没有请创建。

下一步还是安全侧,就是Elastic Beanstalk的Role。意思是我们的托管应用服务器可以与哪些AWS资源交互。为了测试,我们直接给它分配一个默认的role。

下一步来定义Build与IIS的设置,比如App pool runtime, App path等。

检查没有问题的话就可以Deploy发布。

ElasticBeanstalk发布应用的所有状态都是可追踪的,我们在Events log上就可以看到。

可以看到它将代码存储在S3上,创建Security Group安全组,创建EIP,创建EC2等等。

发布成功后,我们可以直接点开URL来验证是否项目发布成功。

下一步我们修改一下View/Home/index.html文件,作为另外一个生产环境。

在进行发布的时候既可以覆盖已有的环境,也可以创建一个新的环境。为了测试我们先覆盖已有环境。后面会介绍蓝绿部署部分。

大概不到1分钟的时间,更新的代码环境就部署好了。

 

配置Elastic Beanstalk

现在一切的开发和部署工作都是通过Visual Studio实现的,那么究竟Elastic Beanstalk在AWS控制台是什么样的?

在Elastic Beanstalk控制台上可以对应用程序的配置,监控,版本管理等进行配置。

监控页面中可以看到应用程序所在的服务器对资源的使用率是什么,如下图:

在应用程序中界面中,可以回滚到任何应用程序的版本。比如这次我们发布了两个版本的应用。

在配置页面中,可以看到ElasticBenstalk的详细配置,如下图:

我们也可以将 Amazon RDS SQL 数据库添加到我们的部署和测试的环境。AWS Elastic Beanstalk 通过设置数据库主机名、用户名、密码、表名和端口的环境属性,来向实例提供连接信息。在将数据库添加到环境时,其生命周期将与环境的生命周期关联。对于生产环境,建议将实例配置为连接到外部数据库。详细请参考:https://docs.amazonaws.cn/elasticbeanstalk/latest/dg/using-features.managing.db.html?icmpid=docs_elasticbeanstalk_console

比如我们将 Amazon RDS SQL Server EE 数据库添加到部署和测试的环境,选择数据库的版本和类型等,这里为了保障数据库的高可用,我们可以选择Multi-AZ:

 

蓝绿部署

蓝绿部署概念:

蓝绿部署是最常见的一种0 downtime部署的方式,通过执行蓝/绿部署可避免产生停机时间。蓝绿部署原理上很简单,就是通过冗余来解决问题。通常生产环境需要两个环境,一个是prod另外一个是test或dev。用户访问我们的应用往往是active的服务器集群prod(绿色环境),当要更新自己的应用时,将更新的应用发布到test或dev(蓝色环境),经过测试完成后,将prod与test切换环境。如果运行出现了问题,可以通过负载均衡器指向快速回滚到绿色环境。

Elastic Beanstalk 交换旧环境和新环境的别名记录,以将流量从旧版本重定向到新版本,反之亦然。

我们可以通过Visual Studio发布一个新的环境(蓝色环境),具体步骤不在赘述,与前面的一致,如下图:

现在创建了第二个环境,蓝色环境dev,如下图:

回到AWS控制台,在Elastic Beanstalk上就有了两个环境,

通过交换URL来完成蓝绿环境的切换,大概5秒钟左右,环境切换完成。在传播 DNS 更改并且旧 DNS 记录过期之前,请勿终止旧环境。DNS 服务器不一定会基于应用所在 DNS 记录中设置的生存时间 (TTL) 来清除其缓存中的旧记录。另外,当应用程序使用生产数据库时,蓝/绿部署要求您的环境独立于生产数据库运行。如果Elastic Beanstalk的环境附加有 Amazon RDS 数据库实例,数据将不会传输到第二个环境,所以生产环境建议RDS数据库独立于Elastic Beanstalk堆栈之外。这个时候我们再访问之前的test环境,会发现已经与dev环境切换了,如下图:

下一步是网站的高可用,负载均衡与弹性扩展和缩减

 

自动扩展与负载均衡

在Elastic Beanstalk的控制台中修改容量,将单一实例切换到负载均衡,然后设置触发条件,这里我们以CPU的使用率为例,高于70%自动扩展1台实例,低于30%缩减1台实例。

然后应用,等待Elastic Beanstalk更新环境,这个时候的运行状况会切换成灰色,如下图:

 

下一步就是通过ELB的DNS来访问我们的应用程序,ELB负载均衡器在EC2操作页面的负载均衡器中,找到负载均衡DNS名称,把它Copy到浏览器中。

 

转换负载均衡器

我们可能注意到了Elastic Beanstalk使用的负载均衡器是CLB,我们可以将它迁移到ALB中,启用ALB迁移向导即可,但需要注意的是ALB要指定不同可用区的子网。具体操作步骤跟迁移向导做,所以不在赘述,转换成功后我们就可以通过ALB来访问.NET应用程序,如下图:

这样我们的应用程序的入口就是负载均衡器ALB,即使在蓝绿部署切换环境的时候,也无需切换入口的URL。

 

总结

将AWS Toolkit for Visual Studio与Elastic Beanstalk结合使用,简单易用的同时也大大的提高了开发效率。利用AWS的托管数据库和云计算的弹性提成了应用安全并减少了运维部署的工作。除此之外,还可以使用AWS SDK for .NET帮助开发基于原生.NET APIs、通过AWS Tools for PowerShell 以PowerShell脚本的方式直接访问管理和与AWS的服务交互。如果我们的应用程序是.NET Core还可以通过AWS ECS来实现微服务架构。

 

本篇作者

李强

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在物联网和微软的技术栈有着广泛的设计和实践经验。在加入AWS之前,曾在东芝中国负责系统开发和运维工作,在微软中国负责中小企业的技术咨询和方案设计工作。