AWS云技术基础:从基础设施到高可用Web应用实战
1. 从“云”到“AWS”:为什么我们需要重新理解基础设施
如果你和我一样,是从传统的IDC机房、物理服务器时代一路走过来的,那么第一次接触“AWS”或者“云计算”这个概念时,内心多少会有些复杂。一方面,它听起来像是能解决所有运维痛点的“银弹”——弹性伸缩、按需付费、全球部署;另一方面,它又像是一个全新的、充满未知术语的黑箱,让人感觉过去的经验似乎一夜之间贬值了。我最初就是带着这种既兴奋又忐忑的心情开始AWS之旅的。今天这篇内容,我不想把它写成一本枯燥的说明书,而是想从一个“过来人”的视角,和你聊聊当我们说“学习AWS云技术基础”时,我们到底在学什么,以及如何绕过那些我踩过的坑,真正把云用起来。
很多人会把“上云”简单理解为把服务器从自家机房搬到亚马逊的数据中心。这个理解对,但不全对。AWS提供的远不止是“托管服务器”。它本质上提供的是一套完整的、通过API可编程的“基础设施即服务”(IaaS)和“平台即服务”(PaaS)的集合。这意味着,你过去需要采购硬件、安装系统、配置网络、搭建数据库的整个流程,现在都可以通过点击控制台或者运行一行命令行代码来完成。学习的核心,就是从“操作物理设备”的思维,转变到“消费和管理云服务”的思维。这个思维转变,是AWS云技术基础中最关键,也最容易被忽视的一环。
2. AWS全球基础设施:你的应用可以部署在何处
当我们启动一个EC2(弹性计算云)实例时,我们首先需要选择一个区域(Region)。这个看似简单的选择,背后是AWS庞大全球基础设施的缩影,也直接关系到你应用的性能、成本、合规性和可用性。理解这套基础设施的层次,是后续所有操作的基础。
2.1 区域(Region)、可用区(AZ)与边缘站点(Edge Locations)
AWS的全球基础设施是一个三层架构,理解每一层的职责和关联至关重要。
区域(Region)是地理上完全隔离的独立部署单位。每个Region由多个离散的、物理上分离的可用区(Availability Zone, AZ)组成。例如,us-east-1(美国东部-弗吉尼亚北部)是一个Region,它内部包含了6个独立的AZ,如us-east-1a,us-east-1b等。Region之间通常相隔数百甚至数千公里,通过AWS专用的高速骨干网连接,但网络延迟依然可观(几十到上百毫秒)。选择Region的首要原则是靠近你的用户,以减少延迟。其次要考虑数据合规要求(某些数据必须存储在特定国家或地区)以及该Region提供的服务种类(较新的Region可能不支持某些较老或特定的服务)。
可用区(AZ)是Region内的一个或多个离散的数据中心,它们拥有独立的供电、冷却和物理安全设施,并通过低延迟、高带宽的私有光纤网络互联。AZ是AWS实现高可用性(High Availability, HA)架构的核心。一个经典的高可用设计是:将应用服务器部署在同一个Region的两个不同AZ中,这样即使一个AZ因自然灾害或重大故障完全宕机,另一个AZ的应用依然可以提供服务。这里有一个重要的认知:AZ的编号(如a,b,c)在不同AWS账户中可能映射到不同的物理位置。这是AWS为了平衡各AZ资源负载所做的设计,对你而言,只需知道它们是不同的、隔离的故障域即可。
边缘站点(Edge Locations)和区域边缘缓存(Regional Edge Caches)构成了AWS的最后一层。它们不属于任何Region,而是遍布全球主要城市和人口密集区的站点,主要用于内容分发网络(CDN)服务CloudFront和DDoS防护服务Shield。当用户请求一个通过CloudFront加速的图片或视频时,请求会被路由到离用户最近的边缘站点,如果该站点有缓存,则直接返回,极大提升访问速度。
注意:服务可用性因Region而异。在规划架构时,务必通过AWS官方文档的“区域服务列表”确认你所需的核心服务(如某些机器学习服务或金融专用服务)在你目标Region是否可用。我曾遇到过在某个Region设计了一套依赖Aurora Serverless的架构,结果部署时才发现该Region不支持,导致方案推倒重来。
2.2 核心资源与服务的全局、区域与AZ级属性
并非所有AWS资源都遵循相同的范围规则,这直接影响了你的架构设计:
- 全局级资源:IAM(身份与访问管理)的用户、组、角色、策略,Route 53(域名服务)的托管区域,CloudFront的分配。这些资源不隶属于特定Region,在全球生效。
- 区域级资源:大多数服务的“控制平面”属于Region级别。例如,你创建了一个EC2实例,这个实例的元数据(类型、标签、关联的安全组)存在于Region级别。但实例本身运行在某个具体的AZ内。S3存储桶的名称也是全球唯一的,但桶的数据物理存储在你创建时指定的Region。
- AZ级资源:EC2实例、EBS(弹性块存储)卷、RDS数据库实例的实际运行位置是具体的AZ。这意味着,一个在
us-east-1a创建的EBS卷,只能直接挂载到同在us-east-1a的EC2实例上。
理解这一点,就能明白为什么做跨AZ的高可用需要一些额外设计:例如,为了实现跨AZ的自动故障转移,你需要使用像Application Load Balancer(ALB,区域级服务)将流量分发到不同AZ的EC2实例组,或者为RDS配置多AZ部署模式。
3. 核心服务初探:计算、存储、网络与数据库
AWS有超过200项服务,但入门时无需面面俱到。牢牢掌握最核心的几类服务,就能构建出绝大多数常见应用。我们可以将其类比为搭建一栋房子。
3.1 计算服务(EC2, Lambda, ECS):房子的工人与自动化流水线
EC2(Elastic Compute Cloud)是最基础、最像传统虚拟机的服务。你可以把它理解为你租用的一台“虚拟电脑”,你需要自己选择CPU、内存、存储和操作系统(Amazon Machine Image, AMI),然后进行登录、部署应用、配置环境等操作。它提供了最大的灵活性和控制权,但也意味着你需要承担更多的运维责任(打补丁、监控、备份)。对于需要长期运行、有特定系统依赖或复杂自定义需求的应用,EC2是首选。
Lambda则代表了“无服务器(Serverless)”计算范式。你不再需要管理服务器,只需上传你的代码(函数),并配置触发条件(例如,一个文件上传到S3,一条消息发送到SNS,一个HTTP请求通过API Gateway)。AWS会在事件发生时自动运行你的代码,按毫秒级执行时间和调用次数收费,执行完毕后资源立即释放。这就像雇佣了一个按需出现的“临时工团队”,只在有活干的时候才付费,完美应对突发流量或定时任务。它的挑战在于需要将应用拆解为细粒度的函数,并适应其短暂的运行环境和冷启动延迟。
ECS(Elastic Container Service)和EKS(Elastic Kubernetes Service)是容器编排服务。如果你已经使用Docker将应用容器化,那么ECS/EKS就是帮你管理和调度这些容器在集群中运行的服务。ECS更贴近AWS原生集成,配置相对简单;EKS则是完全托管的Kubernetes服务,适合已有K8s生态或需要跨云部署的团队。它们介于EC2和Lambda之间,提供了比EC2更轻量的部署单元和比Lambda更灵活的运行环境。
3.2 存储服务(S3, EBS, EFS):房子的仓库与文件柜
S3(Simple Storage Service)是对象存储服务,用于存储海量、非结构化的数据,如图片、视频、日志文件、备份归档。它的设计目标是极高的持久性(99.999999999%,11个9)和可扩展性。你可以把它想象成一个无限大的、有版本控制功能的“云端网盘”。数据通过唯一的键(Key)来访问,并支持设置生命周期策略自动将不常访问的数据转移到更便宜的存储层级(如S3 Glacier,用于归档)。S3是静态网站托管、大数据分析湖的基石。
EBS(Elastic Block Store)是块存储服务,专为需要像物理硬盘一样被挂载和格式化的场景设计,主要配合EC2使用。每个EBS卷只能挂载到同一AZ的一个EC2实例上(最新技术已支持跨AZ),提供低延迟的磁盘读写能力。你可以选择不同的卷类型(如通用型SSD gp3、预配置IOPS SSD io2)来平衡性能与成本。对数据库、文件系统这类需要持久化块设备的应用,EBS是标配。
EFS(Elastic File System)是托管式的网络文件系统(NFS),可以被同一个Region内多个AZ的数百甚至上千个EC2实例同时挂载访问,实现文件共享。这对于内容管理系统、共享代码库、用户家目录等需要多服务器访问同一套文件的场景非常有用。它按实际使用的存储量计费,并自动扩展。
3.3 网络服务(VPC, Subnet, Security Group):房子的地基、房间与门锁
VPC(Virtual Private Cloud)是你在AWS云中逻辑隔离的专属网络空间,是你所有资源(EC2、RDS等)运行的家园。创建AWS账户时,每个Region会有一个默认VPC,但对于生产环境,我强烈建议自定义VPC。这让你能完全掌控IP地址范围(CIDR块,如10.0.0.0/16)、子网划分、路由表和网关。
子网(Subnet)是VPC内的一段IP地址范围。你必须将子网关联到一个AZ。子网分为公有子网和私有子网,关键区别在于路由表:
- 公有子网:其路由表包含一条指向互联网网关(Internet Gateway, IGW)的路由,使得该子网内的资源(如一台面向公众的Web服务器)可以直接与互联网通信。
- 私有子网:其路由表没有指向IGW的路由,因此其中的资源(如数据库服务器)无法直接访问互联网。如果它们需要访问外网以下载更新或访问其他AWS服务,则需要通过部署在公有子网的NAT网关(NAT Gateway)。
安全组(Security Group)和网络访问控制列表(Network ACL)是防火墙。安全组作用于实例级别(比如一台EC2),是“有状态”的(如果你允许了入站的HTTP请求,其对应的出站响应会自动被允许,无需额外规则)。它通常用于设置精细的访问规则,如“只允许来自负载均衡器的80端口流量访问我的Web服务器”。网络ACL作用于子网级别,是“无状态”的,需要分别配置入站和出站规则,通常作为安全组的补充,用于设置子网级别的粗粒度访问控制。
3.4 数据库服务(RDS, DynamoDB):房子的专用资料库
RDS(Relational Database Service)是托管的关系型数据库服务,支持MySQL、PostgreSQL、Oracle、SQL Server等常见引擎。AWS负责底层的硬件配置、数据库软件安装、补丁更新、备份和故障恢复。你只需关注数据库本身的设计、连接和性能优化。对于需要复杂事务、SQL查询和已有成熟关系型架构的应用,RDS是省心之选。其中,Aurora是AWS自研的MySQL/PostgreSQL兼容数据库,在性能和可用性上做了极大增强,宣称性能是标准MySQL的5倍,并提供了全球数据库、无服务器等高级功能。
DynamoDB是全托管的NoSQL键值对和文档数据库。它的核心优势是近乎无限的扩展性和个位数的毫秒级延迟,无论数据量多大、请求多高。它通过主键(分区键或分区键+排序键)来快速定位数据,非常适合需要快速读写、数据模型相对简单、吞吐量极高的场景,如游戏玩家状态、购物车、物联网设备遥测。它的计费模式基于预置的读写容量单位或按需模式,需要根据访问模式仔细设计表结构(特别是分区键的选择),否则容易引发“热分区”问题导致性能瓶颈。
4. 身份、访问管理与计费:安全与成本控制的基石
在云上,安全性和成本控制不是事后考虑的问题,而是必须从第一天就融入设计的基础。IAM和成本管理工具就是为此而生。
4.1 IAM(Identity and Access Management):谁可以做什么
IAM是AWS安全的核心。它的核心原则是最小权限原则:只授予身份(用户、角色)完成其任务所必需的最低权限。
- 用户(Users):代表长期需要访问AWS的人或程序。对于人类用户,强烈建议启用多因素认证(MFA)。
- 组(Groups):用户的集合,用于批量分配权限策略。一个用户可以属于多个组。
- 角色(Roles):一种可以被实体(AWS服务、EC2实例、Lambda函数、其他AWS账户的用户)临时“代入”的身份。角色是在云上实现安全访问的最佳实践。例如,你不应该在EC2实例上存储访问S3的访问密钥(Access Key),而是应该创建一个拥有S3访问权限的IAM角色,然后将这个角色附加到EC2实例上。实例启动后会自动获取临时安全凭证来访问S3,既安全又无需管理密钥。
- 策略(Policies):定义权限的JSON文档。策略分为:
- 身份策略:附加到用户、组或角色,定义它们能做什么。
- 资源策略:附加到资源(如S3存储桶、SNS主题),定义谁可以访问这个资源以及如何访问。
一个常见的踩坑点是策略过于宽松。初期为了方便,可能会给管理员用户附加AdministratorAccess这种全权限策略,或者给EC2角色一个AmazonS3FullAccess。在生产环境中,这非常危险。应该根据具体的操作(如s3:GetObject,s3:PutObject)和资源(如arn:aws:s3:::my-bucket/*)来编写精细的策略。
4.2 计费模型与成本优化入门
AWS采用按需付费(Pay-As-You-Go)模式,这带来了灵活性,也带来了成本不可预测的风险。理解核心计费维度是控制成本的第一步:
- 计算:对于EC2,主要看实例类型、运行时长和购买选项(按需、预留实例、Spot实例)。对于Lambda,看请求次数和执行时间(GB-秒)。
- 存储:对于S3/EBS/EFS,看存储的数据量、存储类型和请求次数。
- 数据传输:数据传出到互联网是主要成本来源。Region之间、AZ之间、服务之间的数据传输也可能产生费用。设计架构时,应尽量减少不必要的数据移动,并利用CloudFront等CDN服务缓存内容以减少回源流量。
成本优化核心手段:
- 使用成本计算器:在架构设计阶段,就用AWS Pricing Calculator进行粗略估算。
- 启用成本异常检测与预算警报:在AWS Cost Management控制台设置月度预算,并配置当预测费用或实际费用超过阈值时发送警报(邮件、SNS),避免“账单惊吓”。
- 利用预留容量:对于有稳定长期需求(一年或三年)的EC2实例、RDS数据库,购买预留实例(RI)或Savings Plans可以享受大幅折扣(通常40%-70%)。
- 使用Spot实例:对于可中断的、无状态的工作负载(如批处理、CI/CD构建代理、某些类型的Web服务器集群),可以使用Spot实例,其价格远低于按需实例(折扣可达90%),但AWS可能在需要时回收这些实例(提前两分钟通知)。这需要对应用进行容错设计。
- 定期审查和清理资源:养成习惯,定期检查并删除不再使用的EC2实例、EBS卷、旧的EBS快照、未关联的弹性IP等。一个闲置的
m5.large实例,一个月也会产生几十美元的费用。
5. 实操入门:从零创建一个高可用的Web应用原型
理论说得再多,不如动手一试。下面我们通过一个经典场景——部署一个高可用的Web应用,来串联起前面提到的核心服务。我们将创建一个架构:用户通过互联网访问,流量经过Application Load Balancer分发到位于两个不同AZ的EC2实例(运行一个简单的Web服务器),这些实例从同一个S3桶中读取静态资源。
5.1 第一步:规划与创建VPC网络环境
我们不使用默认VPC,而是从头创建一个自定义VPC,以理解整个网络结构。
- 登录AWS管理控制台,进入VPC服务。
- 创建VPC:
- VPC名称:
my-ha-web-vpc - IPv4 CIDR块:
10.0.0.0/16(这将提供65536个私有IP地址) - 其他保持默认,点击创建。
- VPC名称:
- 创建子网:我们需要至少两个公有子网(用于负载均衡器和可能的堡垒机)和两个私有子网(用于Web服务器)。
- 在VPC内创建子网,选择刚创建的VPC
my-ha-web-vpc。 - 创建第一个公有子网:
- 子网名称:
public-subnet-1a - 可用区:选择你的Region下的第一个AZ(如
us-east-1a) - IPv4 CIDR块:
10.0.1.0/24
- 子网名称:
- 创建第二个公有子网:
- 子网名称:
public-subnet-1b - 可用区:选择另一个AZ(如
us-east-1b) - IPv4 CIDR块:
10.0.2.0/24
- 子网名称:
- 同理,创建两个私有子网
private-subnet-1a(10.0.10.0/24) 和private-subnet-1b(10.0.20.0/24),分别对应两个AZ。
- 在VPC内创建子网,选择刚创建的VPC
- 创建并配置互联网网关(IGW):
- 在VPC服务中,创建互联网网关,命名为
my-igw。 - 创建后,在操作菜单中选择“附加到VPC”,选择我们的
my-ha-web-vpc。
- 在VPC服务中,创建互联网网关,命名为
- 配置路由表:
- 系统会为VPC自动创建一个主路由表。我们将其改名为
main-rt,并将其关联到两个私有子网(private-subnet-1a/1b)。这个路由表默认只有一条指向VPC内部的本地路由,因此关联它的子网就是私有子网。 - 新建一个路由表,命名为
public-rt,关联到VPCmy-ha-web-vpc。 - 编辑
public-rt的路由,添加一条新路由:- 目标:
0.0.0.0/0 - 目标:选择“互联网网关”,然后选择
my-igw。
- 目标:
- 将
public-rt显式关联到两个公有子网(public-subnet-1a/1b)。现在,公有子网内的资源就有了通往互联网的路由。
- 系统会为VPC自动创建一个主路由表。我们将其改名为
至此,一个基础的双AZ网络环境搭建完毕。
5.2 第二步:准备应用服务器与安全配置
我们将创建启动模板,用于自动创建EC2实例。
创建S3存储桶存放静态资源:
- 进入S3控制台,创建桶,名称全局唯一(如
my-web-static-assets-<你的账户ID>)。 - 上传一个测试图片
logo.png。 - 为了允许EC2实例读取,需要修改桶策略。在桶的“权限”标签页,编辑“存储桶策略”,添加如下策略(将
bucket-name和your-account-id替换为实际值):
这是一个非常宽松的策略,仅用于演示。生产环境中应使用IAM角色进行更精细的控制。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::your-account-id:root" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-name/*" } ] }
- 进入S3控制台,创建桶,名称全局唯一(如
创建IAM角色供EC2实例使用:
- 进入IAM控制台,创建角色,受信实体选择“AWS服务” -> “EC2”。
- 附加权限策略:搜索并添加
AmazonS3ReadOnlyAccess(这是一个AWS托管策略,授予对所有S3桶的只读权限。同样,生产环境应缩小范围)。 - 角色名称:
EC2-S3-ReadOnly-Role,创建。
创建启动模板:
- 进入EC2控制台,在“实例”下选择“启动模板”,点击“创建启动模板”。
- 名称:
web-server-template。 - 选择Amazon Linux 2023 AMI(或你熟悉的AMI)。
- 实例类型选择
t2.micro(免费套餐适用)。 - 密钥对:选择或新建一个,用于SSH登录(后续调试用)。
- 网络设置:不在此指定,由自动伸缩组决定。
- 高级详情 -> IAM实例配置文件:选择刚才创建的
EC2-S3-ReadOnly-Role。这是关键一步,让实例自动获得访问S3的权限。 - 在“用户数据”文本框中,输入以下脚本(这是一个Bash脚本,实例首次启动时会自动执行):
这个脚本会安装Apache Web服务器,并生成一个简单的HTML页面,显示实例所在的AZ以及从S3加载的图片。#!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd # 获取实例所在AZ,并写入主页 AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone) echo "<html><body><h1>Hello from EC2 instance in AZ: $AZ</h1>" > /var/www/html/index.html echo "<p>Static image from S3:</p>" >> /var/www/html/index.html # 注意:这里直接使用了桶名,实际中应通过变量或配置传入。这里假设桶名为 my-web-static-assets-123456789012 echo "<img src='https://my-web-static-assets-123456789012.s3.amazonaws.com/logo.png' width='200'>" >> /var/www/html/index.html echo "</body></html>" >> /var/www/html/index.html - 配置存储:根卷保持默认(8GB gp2)。
- 创建安全组:新建一个安全组
web-server-sg,添加入站规则:允许来自0.0.0.0/0的HTTP(80端口)流量(仅用于测试,生产环境应限制为ALB的IP)。同时添加入站规则允许来自你IP地址的SSH(22端口)流量以便管理。 - 点击“创建启动模板”。
5.3 第三步:构建高可用核心——负载均衡器与自动伸缩
现在,我们将创建ALB将流量分发到多个实例,并创建自动伸缩组(ASG)来管理这些实例的生命周期。
创建应用负载均衡器(ALB):
- 进入EC2控制台,在“负载均衡”下选择“负载均衡器”,点击“创建”。
- 选择“应用负载均衡器”。
- 名称:
my-web-alb。 - 方案选择“面向互联网”,IP地址类型选择“IPv4”。
- 网络映射:选择我们创建的VPC
my-ha-web-vpc,并在两个公有子网(public-subnet-1a/1b)前打勾。ALB必须部署在公有子网。 - 安全组:新建或选择一个允许HTTP 80端口入站的安全组(如
alb-sg,允许源0.0.0.0/0)。 - 监听器和路由:默认监听HTTP 80端口。点击“创建目标组”来新建一个。
- 目标组名称:
web-servers-tg - 目标类型:实例
- 协议端口:HTTP:80
- 健康检查路径:
/(检查根目录) - 其他保持默认,点击“下一步”,暂时不注册实例,直接“创建目标组”。
- 目标组名称:
- 回到ALB创建页面,为监听器选择刚创建的
web-servers-tg作为默认操作。 - 点击“创建负载均衡器”。
创建自动伸缩组(ASG):
- 进入EC2控制台,在“自动伸缩”下选择“启动配置”(较新控制台已整合到启动模板,我们直接用模板),这里我们点击“创建自动伸缩组”。
- 名称:
web-asg。 - 启动模板:选择我们创建的
web-server-template。 - 网络:选择VPC
my-ha-web-vpc和两个私有子网(private-subnet-1a和private-subnet-1b)。这样ASG创建的实例就会分布在两个AZ的私有子网中。 - 负载均衡:选择“附加到现有负载均衡器”,目标组选择
web-servers-tg。勾选“启用负载均衡器运行状况检查”。 - 组大小:设置所需容量为
2,最小容量2,最大容量4。这表示ASG会始终保持至少2个实例运行,并根据策略最多扩展到4个。 - 缩放策略:暂时选择“无”,我们手动保持2个实例即可。
- 其他设置保持默认,点击“创建自动伸缩组”。
ASG创建后,它会立即开始启动2个EC2实例(分别在两个AZ的私有子网中),并将它们注册到ALB的目标组web-servers-tg中。等待几分钟,直到实例状态通过健康检查变为“健康”。
5.4 第四步:验证与访问
- 在EC2控制台的“目标组”中,查看
web-servers-tg,应该能看到两个健康的实例。 - 在“负载均衡器”中,找到
my-web-alb,复制其DNS名称(类似my-web-alb-1234567890.us-east-1.elb.amazonaws.com)。 - 将DNS名称粘贴到浏览器地址栏访问。多次刷新页面,你可能会看到页面显示的AZ在变化(因为ALB在轮询分发流量),并且每次都能看到从S3加载的图片。这证明了一个简单的高可用Web应用已经运行起来:用户通过ALB访问,ALB将流量分发到位于不同AZ私有子网中的Web服务器,Web服务器从S3读取静态资源。
这个原型虽然简单,但它涵盖了VPC、子网、路由、安全组、EC2、IAM角色、S3、ALB、ASG等核心服务,并体现了高可用和分层安全的设计思想。你可以在此基础上继续探索:为ALB添加HTTPS监听器(需要ACM证书)、将数据库(RDS)部署在私有子网、为实例配置更精细的IAM角色策略、设置基于CPU利用率的自动伸缩策略等等。每一次探索,都会让你对AWS云技术基础的理解更加深刻。
