Amazon Elastic Cloud Compute,简单来说就是亚马逊的虚拟机服务,用户可以使用EC2服务创建一个个实例(instances),即虚拟机。

亚马逊的EC2标榜有几大优势:完全控制,灵活使用,方便集成,安全,便宜,简单好用。
关于EC2有几个重要的概念:Instance Type,即在选择Instance的时候的内存,CUP等硬件指标;然后是EBS,即挂载硬盘,租户可以选择不同IO,不同介质的虚拟硬盘;其次是AMI,即用于启动虚拟机的操作系统镜像;另外还有Security Group,可以理解为虚拟机的防火墙;其他的服务都属于附加服务,比如负载均衡,弹性伸缩,监控报警,权限控制,类似nfs的弹性存储介质等等。
虚拟机服务是云服务最重要的服务,几乎各大云厂商最终要的一项都是对租户提供虚拟机,看大厂的虚拟机策略,其他各厂基本可通晓一二。
由于企业级应用很少用windows的使用场景,笔者将主要关注在Linux的使用上,本文对windows使用场景改不涉及。

Instances

EC2为亚马逊的服务,Instance就是该服务提供的一个实例 —— 虚拟机

Instance Purchasing Options

在说Instance Type之前,有个更重要的东西:Instance的收费方式(Instance Purchasing Options)。Instance有四种收费方式,针对不同应用场景要学会选择适合的Purchasing Option:

  • On-Demand Instance 按小时收费,也是默认的收费方式,不足一小时按一小时计费;属于比较灵活的按需付费方式
  • Reserved Instances 预留实例,可选1-3年,一次付费,完成付费之后不管是否使用都会收费,价格相对按小时计费要便宜些,企业作为服务器长期使用通常会选择使用的付费方式
  • Scheduled Reserved Instances 计划预留实例,为期一年,在计划时间内可用。值得注意的是,只有几个高性能的Instance Type支持该购买方式,且每年使用不得少于1200小时,需提前三个月购买
  • Spot Instances 竞价实例,价格随时间浮动,租户在申请时出价,当租户出价高于该时间点竞价实例价格时,租户获得该实例使用权,当价格再次浮动导致实例价格高于租户出价,亚马逊会提前十分钟提醒租户,而后terminate实例,转移到别的地方。注意,被亚马逊销毁的实例最后一小时不收费,而用户在使用期间自行销毁的实例,不足一小时仍以一小时计费。这种收费方式适用于不需长期提供稳定服务的应用场景,比如大数据流处理。
  • Dedicated hosts买下一个跑在固定物理设备上的Instance的使用权,保证租户的licenses不会因为不同物理设备过期。
  • Dedicated Instances按小时计费的Dedicated hosts

Instances Type

Instance Type有10种类型,用于区分大致的应用场景,每个类型下有从nano, micro, small, medium, large, xlarge到16xlarge数目不等的型号,主要区分CPU数量,vCPU(亚马逊创造的用于衡量单个CPU运算能力的一个参数),内存,不同,大小、类型不同,直接影响价格。

  • D2 - Dense storage Instance,特点是硬盘价格平衡,支持HDD硬盘,支持EC2 Enhanced Networking,适用于对存储需求比较高的场景,比如数据库,大数据存储
  • R4: 特点是内存大
  • M4: 各项平衡的一个Instance类型,也是默认情况下首选的Instance Type
  • C4 - Compute Optimized: 计算能力优化,特点自然是计算速度快
  • G2: 包含GPU的Instance,适合于图形计算,视频转码等场景
  • I3 - High I/O Instance,高硬盘IO,使用固态硬盘,适用于非关系型数据库,大数据处理等
  • F1 - 可以为程序定制硬件加速
  • T2: 最常见的Instance使用类型,因为它最便宜,性能也最平衡,生产环境只适用于做web服务器,或小型数据库
  • P2: 通用GPU计算机,常用于人工智能等需要大量计算的领域
  • X1: CPU,内存都相当大,针对大规模,企业级,内存应用程序进行了优化,并且在Amazon EC2实例类型中具有每GiB最低的RAM价格

    Instance类型在创建后可以被更改,前提是Stop Instance

Instance LifeCycle

Instance的生命周期,有pending, running, stop ,terminate几个主要的状态和动作,详见下图:

MetaData & UserData

UserData是创建完成Instance最后一步用来准备Instance环境的Bash脚本,而MetaData是Instance与生俱来的元数据,通过curl https://169.254.169.254/latest/meta-data/这种奇特的方式获得,包含Instance类型,IP,public-key等信息。值得一提的是IAM的Role之所以在Instance的文件系统中不会出现Credential key的文件,是因为它把Credential key放到了MetaData中,可以通过获取MetaData的方式获得。

EBS

简单来讲,EBS(Elastic Block Storage)就是AWS为租户提供的虚拟硬盘,Instance可以看做主板,EBS可以被关联到任何一个Instance上,启动Instance时也必须要一个启动硬盘作为系统盘才能启动。这里就要区分一个重要的概念,EBS 和 Instance Store,两种类型的Instance,应该说EBS Instance比Instance Store 更健全一些,支持更多的Instance Type,生命周期完整;而Instance Store,是由存放在S3的文件系统启动的,启动速度慢,生命周期不完整,只能被Reboot或者Terminate,不能Stop,一旦启动失败就会丢失所有数据,且支持类型有限,被称为短暂存储(ephemeral Storage)
下面重点区分一下EBS Volum Type,与Instance相同,重点也在使用场景和节省开销:

  • SSD, General Purporse - gp2: 兼顾性能与价格,吞吐量160MB/s,最大IOPS为10,000; 挂载卷大小在1GB-16TB;使用场景:推荐使用在大部分场景,虚拟机启动磁盘,提供低延迟的服务,可在开发测试环境应用
  • SSD, Provisioned IOPS - io1: 高性能磁盘,吞吐量320MB/s,IOPS在10,000-20,000; 挂载卷大小在4GB-16TB;使用场景:执行紧急任务的应用模块,大数据库,比如MongDB, Orale, SQL Server等
  • HDD, Throughput Optimized HDD - st1: 价格相对便宜的机械硬盘,用于存放不常使用的数据,IOPS最大仅500,吞吐量可达500MB/s,磁盘大小为500GB-16TB;使用场景:需要高吞吐量量有需要控制预算的场景,比如大数据,日志存放;不能用作启动磁盘
  • HDD, Code HDD - sc1: 比普通机械硬盘更便宜的磁盘,IOPS仅为250,吞吐量250MB/s,容量500GB-16TB,使用场景:非常强调便宜的不常访问数据的存储
  • HDD, EBS Magnetic - standard: 磁带存储,非常便宜的低频次访问的磁盘,性能最次(40-200IOPS, 40-60MB/s吞吐)

注:以上参数均需在Instance类型的支持才能发挥到最大值,机械硬盘的优势在于高吞吐,固态硬盘的好处在于高IO;另外一个需要注意的是,你可以在一个Instance上绑定多个EBS,但是不能将一个EBS绑定在多个Instance上(这种情况要使用EFS)

Security Group

Security Group可以理解为Instance的防火墙,在Instance的网络中大概处在以下位置:

SG的安全策略大范围分为Inbound和Outbound,顾名思义为控制进出,SG刚被创建时默认所有Inbound都是被禁止的,所有Outbound都是被允许的。
SG由数条规则(rules)构成,Rules有几个重要参数:目标地址(网段),协议类型,端口号。
关于SG有以下几个值得注意的点:

  • SG策略在修改后立即生效
  • 一个SG可以被绑定到任意数量的Instance上
  • 一个Instance可以有多个SG,且被允许的Rules为多个SG的合
  • SG是有状态的,也就是说当租户允许了一个请求进入,默认会打开到目的地址的返回请求
  • 通常情况我们不适用SG的Rules来组织IP访问,组织IP访问应该用ACL(Access Control List)
  • SG只能添加允许访问的策略,不能添加禁止访问的策略

Volumse & Snapshots

关于Volume Type,已经在EBS部分提到了,这里主要想讲的是磁盘的生命周期。
Volume可以从EBS创建,Attache到一个Instance上,再在操作系统中进行挂载,使其成为一个可用的文件系统,Volume可以随时扩容,但扩容后需要更新文件系统。
Volume可以凭空创建,也可以使用Snapshot创建,Snapshot就是磁盘的一个镜像,存放于S3中,用于定期备份磁盘。Snapshot是增量式的,也就是说只有被更改的部分会被记录在S3中。
第一个Snapshot的创建会比较花时间。
Snapshot可以通过S3在账户之间共享。
可以开启自动备份定时备份Volume。
EBS可以被加密,除了root Volume,租户可以使用第三方工具对启动磁盘进行加密。
另外说一下关于Windows卷扩容,需要停止磁盘读写,有以下措施可以做到:

  • 冻结文件系统
  • 卸载磁盘驱动(Unmount the RAID Array)
  • 关闭关联的EC2 Instance

注:一个EBS可以被创建10,000个Snapshot,一个账户可以拥有的Volume存储大小总量单个类型不得超过20TB

AMI

既然有了Snapshot,另一个重要的概念就不得不提了,AMI,Amazon Machine Image,可以理解为虚拟机的启动镜像。一个AMI包含了在云上启动一个实例所需的所有信息,包括:

  • 一个Root Volume的模板(比如一个操作系统,一个应用)
  • 启动许可(在启动时用于判断该用户是否有从该AMI启动实例的权限)
  • 启动实例时需要挂载的磁盘映射表

一个AMI的生命周期看起来像是这个样子的:

AMI是划分Region的,租户可以通过Console或CLI在Region之间拷贝AMI。
AMI可以用于在AWS Marketplace出售。

AMI依赖于Snapshot缺不被Instance依赖,这意味着租户不能删除一个被注册的AMI的Snapshot,却可以删除一个运行中实例的AMI,Snapshot,AMI,Instance的关系如下图:

ELB & Health Checks

ELB,Elastic LoadBalancer是构建一个高可用可用不得不谈的服务,经常和Autoscaling Group一起实现负载伸缩和高可用。
ELB是AWS提供的负载均衡器,用于将外部访问请求分发给状态健康的EC2 Instance。
ELB在创建的时候会有对外会有一个DNS解析域名,对所属Instance会做健康检查,所谓健康检查就是去定期访问一个文件,判断返回状态码为200即表明这个服务正常,Instance可以动态地被加载到ELB下,也可以动态移除,ELB会自动判断这个Instance已经失去连接并停止发送请求到这个Instance。
值得一提的是,ELB一个重要的功能是增加服务容灾性,通常会挂载多个不同AZ的Instance,做到一个数据中心挂掉仍然能够正常提供服务。

Cloud Watch EC2

CloudWatch是AWS提供的EC2监控报警的服务,简单好用。
作为一款与AWS各种资源高度集成且简单好用的监控工具,CloudWatch有以下功能:

  • 构建Dashboard用于可视化云环境资源状况
  • 警告:配合SNS在某项指标超出一定阈值时发出邮件或短信通知
  • 事件:监控事件用于动态变更云设施
  • 日志:日志保存在S3中

CloudWatch的一些类目默认情况是免费的,免费版本是5分钟取回一次数据,收费后变成1分钟一次,且部分metrics需要收费才能监控。默认监控的内容包括CPU,网络,硬盘IO等,但是没有内存。

Autoscaling Group

一个Autoscaling Group包含多个特性相同的Instance,可以根据Instance的负载自动扩容或缩减,同时可以对Instance开启健康检查,如果一个Instance服务异常,Group会依照Lunch Configuration重新启动一个实例替换掉旧的实例。这种方式保证了Group内的Instance总是健康的,且Instance数目会根据负载情况进行动态伸缩。

Placement Group

Placement Group是一个在同AZ中的一组Instance,同PG的Instance可以享受到高带宽,低延迟的好处,但同时也有如下限制:

  • 一个Placement Group不能跨多个AZ
  • 一个Placement Group的名字必须在一个账号中是独一无二的
  • Placement Group只支持一部分类型的Instance
  • AWS推荐在一个PG中使用同质的Instance
  • PG不能被合并
  • 租户不能移动一个已经存在的Instance到一个PG中,可以对这个Instance创建AMI,再使用这个AMI在PG中启动一个Instance

EFS

EFS是AWS提供可以再Instance之间贡献的一个NFS server,其最大的优点是不需要预先设置大小,其空间大小会随文件写入增多逐步扩容至PB级别,而租户只需按使用收费。
EFS可以支持上千个NFS4连接,适用于大数据存储,Web服务器静态文件共享,等诸多应用场景。
AWS目前有4个Region支持EFS,EFS的文件存放在多个AZ中,可以跨AZ共享文件。

Tips

  • 每个账户默认被限制可以申请20个保留实例,增加上限需要给亚马逊提Request
  • 使用EC2发送邮件数量是有限制的
  • 每个账户最多可申请5个Elastic IP
  • 不同账户标记的一个AZ名字(比如us-east-1a)可能指向不同的物理数据中心
  • 要使用增强网络型实例(Enhanced Network)租户不需要另外付费,只需要选择适当的AMI和适当的Instance类型在一个VPC中即可
  • 默认情况下,当租户停止监控EC2实例或销毁了实例,两周内仍可访问CloudWatch的数据
  • 如果删掉一个Auto Scaling Group,其中的Instance会先被销毁
  • 租户可使用VM Import/Export从EC2导入/导出虚拟机镜像
  • 虽然Snapshot被存在S3中,但租户不能通过S3的API访问到Snapshot,而只能通过EC2的API访问
  • 分享Snapshot给特定的账户,Snapshot的状态仍为“private”