AWS官网有很多干粮,而本次要为大家奉上的是一份精粮,一份由AWS运维工程师咀嚼过后的运维小秘籍和小贴士。

 

云络网络科技工程师Erwen依托多年AWS运维的最佳实践经验,为大家讲讲如何通过关注一些细节,来保证AWS架构的高可用性。

 

本次分享不针对AWS服务,对AWS服务并不会讲解得太深入,而是侧重于运维过程中常用的一些服务和使用时容易遇到的问题。

 

AWS的物理构成

 

知其然,知其所以然,了解AWS运维,Erwen先从两个简单的概念讲起。AWS为我们提出了一个区域的概念,由用户所处的位置决定,目前中国只有北京一个区域,宁夏仍然在施工还没有完成。另一个是可用区的概念,传统的物理机房中,如果要在物理机房中做容灾,就必须在两地分别建立机房,单独的一个机房就是一个可用区。北京区域有两个可用区,CN-north-1a、CN-north-2b,它们之间使用高速光纤连接,延迟在两毫秒以内。

 

AWS网络服务VPC

 

对 AWS物理构成有了大概的了解,Erwen开始深入之AWS的网络层面。

 

VPC(Virtual Private Cloud)是仅适用于AWS账户的虚拟网络,逻辑上与AWS其他的虚拟网络隔绝。与物理系统中大的网段划分小的网段类似,VPC就相当于是一个大的网段,而子网等同于大网段中的小网段。

 

子网可以分为公有子网和私有子网。公有子网可以通过自己的公网IP进入因特网,私有子网本身没有公网IP,可以用路由的方式使用公有子网中的服务器,再与公网进行数据交互。

 

虚拟网络没有交换机和路由器的概念,而是用路由表来代替路由器。Internet网关是AWS所有出公网流量的网管,创建Internet网关时,需要和VPC绑定在一起;而NAT网关指的是私有子网先路由到公有子网的NAT服务器上,再经由Internet网关,它与物理转换方式中的NAT转换方式是基本相同的。AWS在安全方面还为我们提供了ACL,要注意的是:它是无状态的,既要开出去的80端口,还要开回来的端口,但高位端口无法确定端口号是多少,只能从1024到65535都开。

 

Erwen为我们演示了VPC。网段选择最大是/16,最小是/28。其中,.0表示网段的IP,.255表示广播的IP,.1的IP是默认的网关,.2的Ip是AWS提供的DNS服务器的IP,.3的IP是AWS保留以后使用的,所以我们在进行系统架构的时候要注意这些。

 

Erwen强调:“子网是不可以跨可用区的,一个子网只能在一个可用区中”。例如,公有子网在可用区1a,私有子网在可用区1b,平常在做区域架构时,可能会考虑跨区域容灾这个计划,而面对上述情况该怎么办呢?这时,就必须在1b中再建立一个公有子网,在1a中再建一个私有子网,才能做成高可用的架构。

 

其中,弹性IP是指在默认情况下起的服务器的IP,当关机再启动其公网IP是会随之改变的,如果指定了弹性IP则不会发生改变。对等连接是VPC和VPC之间进行通信的服务。

 

 

常用云服务

下面Erwen为我们分享了以下常用的云服务:

IAM 、EC2 、ELB 、S3 、RDS 、Auto Scaling

 

IAM

为何把IAM(Identity and Access Management)放在最前面呢?IAM主要是涉及到安全的一个AWS服务,在拿到AWS账号之后,首先用的第一个服务就应该是它。 为什么呢?因为,最佳实践告诉我们:不要使用注册的根账号登录AWS。

 

回头看一下IAM是什么“是一种Web服务,可帮助安全地控制用户对AWS资源的访问权限”。IAM允许我们自定义登陆的URL。这样就可以使用该URL登录,也是一个安全措施。IAM界面左侧有一个不显眼的分类——策略,用好了可以省不少的事儿。比如某公司有一个开发团队和一个运维团队。运维团队需要创建EC2实力的权限,开发团队只需要重启EC2的权限,并不需要创建和删除,这时便可以用策略来实现。

 

要从S3上传下载,很多人会创建访问秘钥,用访问秘钥查看S3。但这样有什么不好的地方呢?显然,当该访问秘钥丢失了,那么从全球任何一个角落,都可以访问你S3中的内容。如果用根账户创建了访问秘钥,那就厉害了,我们的账户等于对全世界都是透明的,拿到密钥的人可以做任何操作。考虑到这一点,AWS就引入了“角色”。我们只要建立了角色,把角色赋予一台EC2服务器上,这台EC2服务器就可以访问S3,不需要任何的验证。这样的好处就是不用创建访问密钥,这样安全性会很高。切记不要使用根账号登录,因为根账号权限实在太大。在AWS中,根账号可以为其他子账号买单。如果根账号泄露,别人服务器的钱就有可能由我们来买单。

 

为每个用户创建单独的IAM用户,AWS还有一个服务叫做Cloudtrail可以追踪每一个用户做的任何操作,若发现服务器被删除了,究竟是误操作删除了,还是账户密码泄露了,我们可以很清楚地定位到这个问题。我们通过使用组向IAM用户分配权限以节省工作量,再为特权用户启用MFA(联合认证)更能让事半功倍。

 

EC2

关于EC2(EC2,Elastic Compute Cloud),Erwen表示Tag是很重要的,在服务器多了情形下,会完全不知道服务器是做什么的,且后期可能要做汇总,或者发现有很多空闲的机器,需要统计生产和测试环境各多少台服务器,这时打不打Tag就显得非常重要了。

 

Amazon EBS 卷是高度可用和可靠的存储卷,可以挂载到同一可用区中任何正在运行的实例,要注意EBS 加密只能在创建加密卷以及通过加密卷创建快照时使用。

 

关于实例存储,它并不是一个永久性的存储,实例存储在同一台宿主机机上的存储,如果该EC2实例重启了,实例存储将会跳到另外一个宿主机上面,这样的话原来的实例存储就不可用了。所以,切勿依赖实例存储来存储珍贵且需要长期保存的数据,以下情况实例存储中的数据皆会丢失。1.底层磁盘驱动器发生故障2.实例停止3.实例终止,实例存储中的数据都会丢。

 

弹性IP地址,与实例或网络接口相关联。熟悉的朋友都知道,它在使用时是免费的,但在闲置时是按小时收费。这是AWS为了避免浪费IPv4资源而做出的限制。虽然挂载到服务器上了,但服务器处于Shutdown状态,这也属于闲置状态,需要注意这点。因此,如果弹性IP不用,要尽快的释放出来,以避免计划外的成本。安全组是有状态、可共用、可嵌套的,好处是节省了工作量。可以在一个安全组中,把所有服务器需要添加的端口都放在安全组,这个安全组对所有服务器都嵌套上,既可以完成所有服务器开放端口的操作。

 

ELB

ELB (Elastic Load Balancing)支持四层、七层转发,可以跨可用区使用的,是可以自动伸缩的。需要注意的是,ELB伸缩是需要时间的。如果打算执行高强度流量,要对ELB进行预热,不然可能会丢掉一部分的流量。需要告诉AWS在几点会有一个活动,大概流量是多少,每分钟访问是多少,这样AWS才会对ELB进行预热。

 

内部ELB是没有公网IP的,只限于在内部使用,非常方便的一个功能,在做服务器架构的时候可以把它考虑进去。

 

S3

S3是AWS的存储服务,是存储桶的概念。需要考虑的是它的安全性,与IAM结合使用可实现详细的权限管理。它支持静态网站托管,但有一个限制:在创建存储桶的时候一定要和域名的名字一样。生命周期是指设置文件存储的时间,与AWS归档服务Glacier连用可以很精确地控制。但它也有个缺点,存储的文件取出需要一定的时间,无法立刻取出。因此,不能储存即存即用的文件。

 

RDS

RDS主要说一下在生产环境中要注意的点。首先,在生产环境中RDS务必要使用跨可用区实例。他会自动在1b中起一个备用的RDS,与其成为主从关系。故障转移,是当主实例出现宕机的情况,自动会迁至从实例中,这对前端是透明的。RDS建好后,对外会给到一个URL,使用URL可以进行数据库的链接,URL的数据库解析到主数据库的,一旦检测到主数据库的URL出问题了,Aws会把URL重新解析到从数据。所以,这中间就需要RDS解析时间,在代码层同样也要设置RDS对数据库重连的操作,需要注意这点。读负载比较高时也可以设置只读实例。

 

Auto Scaling

最后说的是Auto Scaling,自动伸缩服务是AWS云服务中的杀手锏,可以为客户大量节约成本,但它对代码和架构都是有限制的。建议把代码调整成无状态,用户的访问数据,包括cookie不要存储在服务器中,而要存储在一台数据库里。这样的话,当日后服务器数量扩展后,所有的流量不至于还在服务器当中。

 

最大实例数是一定要设的,不然会造成大量意外的成本。自动伸缩结合AWS的监控CloudWatch监控CPU的使用量,达到一定值加服务器,低于一定值减服务器,当然也要配合最大实例数和最小实例数,以免把想要的服务器给误删。合理的冷却时间也别忘了,以免出现一直加服务器的死循环。服务器在删除前,需要把其中的某些信息拿出来,或是要从别的地方把内容更新到服务器中,这时就要用到生命周期挂钩。

 

更多AWS运维经验敬请期待。