AWS 面试题
面向高级工程岗位的 AWS 面试测试你在核心服务、架构模式和动手解决问题方面的深度。你将面临概念讨论(例如服务之间的权衡)和实践练习(例如设计可扩展系统或调试部署)。本页面涵盖了最常见的 AWS 面试题,按关键子主题组织,并附有可操作的准备技巧和常见问题解答,帮助你通过面试。
AWS 面试涵盖内容
计算与无服务器
涵盖 EC2、Lambda、ECS/EKS 和可扩展性决策。预计会有关于自动扩展、冷启动和选择正确计算服务的问题。
存储与数据库
包括 S3、EBS、RDS、DynamoDB 和 Redshift。关注一致性模型、索引和成本-性能权衡。
网络与安全
VPC 设计、子网、安全组、网络 ACL、IAM 策略和加密。问题通常涉及设计安全的多层架构。
架构与 DevOps
模式如微服务、事件驱动、CI/CD 管道、基础设施即代码(CloudFormation、CDK)以及高可用性/灾难恢复。
AWS 面试题示例
- 解释安全组和网络 ACL 之间的区别。什么时候你会使用哪一个?好回答应覆盖
- 安全组是无状态的,而网络 ACL 是有状态的
- 安全组默认拒绝所有入站流量,允许所有出站流量;网络 ACL 默认拒绝所有流量
- 安全组支持允许规则,但不能显式拒绝;网络 ACL 支持允许和拒绝规则
- 安全组在实例级别起作用,网络 ACL 在子网级别起作用
- 安全组适用于允许特定流量到特定实例的场景,网络 ACL 适用于子网级别的访问控制
查看范例答案
安全组(Security Group)和网络 ACL(Network Access Control List)都是 AWS 中的虚拟防火墙,但它们在状态性、规则类型和作用层级上存在关键差异。安全组是有状态的,意味着如果允许入站流量,则出站响应自动被允许,反之亦然。安全组只支持允许规则,且默认拒绝所有入站流量,允许所有出站流量,但可以显式添加允许规则。安全组作用于 Elastic Network Interface(ENI)级别,即实例级别。相比之下,网络 ACL 是无状态的,需要显式定义入站和出站规则,并且支持允许和拒绝规则。网络 ACL 作用于子网级别,适用于控制整个子网的流量。在性能方面,两者都低延迟,但安全组通常更易于管理。使用安全组时,通常用于基于角色的访问控制,例如只允许特定 IP 访问 Web 服务器。网络 ACL 用于额外的防御层,例如阻止恶意 IP 或防止 DDoS 攻击。在需要子网级别拒绝特定流量时,网络 ACL 是首选。
- 在 AWS 上设计一个高可用且容错的 Web 应用程序。包括计算、存储和网络组件。好回答应覆盖
- 使用 Elastic Load Balancer 分发流量至跨多个可用区的 EC2 实例
- 使用 Auto Scaling 组自动扩缩容以应对负载变化
- 使用 Multi-AZ RDS 或 DynamoDB 实现数据库高可用
- 使用 S3 存储静态资产和备份,并配合 CloudFront CDN 加速
- 使用 Route 53 进行 DNS 路由和健康检查
查看范例答案
设计高可用且容错的 Web 应用程序需要将计算、存储和网络组件分布在多个可用区。计算组件方面,部署 EC2 实例于至少两个可用区,并置于 Auto Scaling 组中,结合 Application Load Balancer 或 Network Load Balancer 进行流量分发和健康检查。网络组件方面,创建 VPC 跨多个可用区,每个可用区有公有和私有子网,将 Web 服务器放在公有子网,数据库放在私有子网。使用 NAT 网关使私有子网实例能访问互联网。存储方面,使用 S3 存储静态内容(图片、CSS 等),并配合 CloudFront 加速全球访问。关系数据库使用 RDS Multi-AZ 配置自动故障转移,或 DynamoDB 的全局表。对于会话状态,使用 ElastiCache 或 DynamoDB 提供分布式缓存。DNS 使用 Route 53 带健康检查的故障转移路由。此外,还应当启用 CloudWatch 监控和告警,并使用 AWS Shield 和 WAF 增强安全性。通过这种方式,任何单点故障都不会导致整个应用中断。
- 如何将单体本地应用程序迁移到 AWS,并最小化停机时间?讨论策略和工具。好回答应覆盖
- 使用 AWS Server Migration Service(SMS)进行批量服务器迁移
- 使用 AWS Database Migration Service(DMS)迁移数据库,可保持持续同步
- 采用双活或 pilot light 策略,在 AWS 上搭建完整环境后切换流量
- 使用 VPN 或 Direct Connect 建立本地与 AWS 之间的私有连接
- 使用 CloudEndure Migration 或 AWS Application Migration Service 进行自动化和最小停机迁移
查看范例答案
将单体本地应用程序迁移到 AWS 并最小化停机时间的关键策略是采用分阶段迁移和复制技术。首先,进行评估和规划,使用 AWS Migration Evaluator 了解依赖关系。对于服务器,使用 AWS SMS 或 CloudEndure Migration 将虚拟机映像复制到 AWS,并持续同步增量变化。对于数据库,使用 AWS DMS 进行初始复制和持续变更数据捕获,使源数据库和目标数据库保持同步。在迁移过程中,可以采用 pilot light 策略:在 AWS 上启动最小规模的环境,复制数据,然后定期测试。当准备就绪时,通过修改 DNS 或使用 Route 53 权重路由,逐步将流量从本地转移到 AWS,实现零或低停机。另一种方法是双活部署,本地和 AWS 同时运行,通过负载均衡器分配流量。工具方面,AWS Migration Hub 提供集中跟踪。建议先迁移无状态层(Web 服务器),再迁移有状态层(数据库),并使用 AWS 的专用工具(如 AWS SMS、DMS 和 CloudEndure)以自动化流程,减少手动错误。如果允许短暂停机,也可以采用蓝绿部署策略。最终,通过充分的规划和测试,可以将停机时间控制在分钟级甚至更短。
- 编写一个用 Python 编写的 Lambda 函数,处理 S3 事件通知(例如调整图像大小)。展示处理程序和 IAM 策略。好回答应覆盖
- Lambda 函数必须解压 S3 事件中的图像并调整大小
- IAM 策略需允许 Lambda 读取源 S3 桶和写入目标 S3 桶
- Lambda 函数使用 Python 和 Pillow 或 PIL 库处理图像
- S3 事件通知应配置为仅触发特定前缀和后缀(例如 .jpg)
- 错误处理需考虑超时和内存限制,建议使用异步调用
查看范例答案
该 Lambda 函数由 S3 事件触发,当新图像上传到源桶时,函数自动调整图像大小并将结果保存到目标桶。需要注意,Lambda 的执行角色需要具有 s3:GetObject 和 s3:PutObject 权限,以及 CloudWatch Logs 权限。由于默认 Pillow 库在 AWS Lambda 环境中可能未提供,建议使用部署包或 Lambda Layer 包含 Pillow。函数代码应处理可能的大文件,并考虑设置合适的超时时间和内存。同时,为减少冷启动影响,可启用 Provisioned Concurrency。IAM 策略应使用最小权限原则,限制特定资源。错误处理方面,应捕获异常并记录日志,避免失败重试导致重复处理。
参考代码python import boto3 import os from PIL import Image from io import BytesIO s3 = boto3.client('s3') def lambda_handler(event, context): # 遍历 S3 事件记录 for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] # 只处理图片文件(可选检查扩展名) if not key.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): continue # 下载源图片 response = s3.get_object(Bucket=bucket, Key=key) image_content = response['Body'].read() # 调整大小 image = Image.open(BytesIO(image_content)) resized_image = image.resize((500, 500), Image.ANTIALIAS) # 保存到目标桶(假设同区域) target_bucket = os.environ['TARGET_BUCKET'] target_key = 'resized/' + key buffer = BytesIO() resized_image.save(buffer, format=image.format or 'JPEG') buffer.seek(0) s3.put_object(Bucket=target_bucket, Key=target_key, Body=buffer) return { 'statusCode': 200, 'body': 'Resize complete' } # IAM 策略示例(附加到 Lambda 执行角色): # { # "Version": "2012-10-17", # "Statement": [ # { # "Effect": "Allow", # "Action": [ # "s3:GetObject" # ], # "Resource": "arn:aws:s3:::source-bucket/*" # }, # { # "Effect": "Allow", # "Action": [ # "s3:PutObject" # ], # "Resource": "arn:aws:s3:::target-bucket/resized/*" # }, # { # "Effect": "Allow", # "Action": [ # "logs:CreateLogGroup", # "logs:CreateLogStream", # "logs:PutLogEvents" # ], # "Resource": "*" # } # ] # } - 比较 RDS、DynamoDB 和 ElastiCache。对于实时排行榜,你会选择哪一个,为什么?好回答应覆盖
- RDS 是关系型数据库,支持 ACID 事务和 SQL 查询
- DynamoDB 是 NoSQL 键值/文档数据库,提供低延迟和自动扩缩容
- ElastiCache 是内存缓存,用于加速读取查询或存储会话数据
- 实时排行榜需要高频写入和读取,以及对得分排序的快速访问
查看范例答案
RDS、DynamoDB 和 ElastiCache 分别适合不同场景。RDS 适用于需要复杂 SQL 查询、事务和关系数据模型的应用,如电商订单系统。DynamoDB 适用于高并发、低延迟的键值访问和自动扩缩容需求,如用户会话记录。ElastiCache 作为内存缓存,提供微秒级延迟,用于加速热点数据访问。对于实时排行榜,我选择 DynamoDB 结合 ElastiCache 或直接使用 DynamoDB 的全局二级索引(GSI)。DynamoDB 天然支持高吞吐量写入,通过 GSI 可以对得分字段进行排序,实现排行榜查询。但 DynamoDB 的排序操作在大量数据时可能较慢,为此可配合 ElastiCache 缓存排行榜结果以提升读取性能。另一方面,如果排行榜数据量不大且要求强一致性,DynamoDB 的强一致性读取足以满足。相比 RDS,DynamoDB 无需模式迁移,更灵活;相比纯 ElastiCache,DynamoDB 提供持久化存储。因此,最佳方案是使用 DynamoDB 存储原始得分数据,并定期生成排行快照缓存到 ElastiCache。
- 描述一个你会使用 VPC 端点而不是 NAT 网关的场景。它们在成本和性能方面有何不同?好回答应覆盖
- VPC 端点允许通过 AWS 内部网络访问 AWS 服务,无需经过互联网
- NAT 网关使私有子网实例能访问互联网,但增加数据出口费用
- VPC 端点(Gateway 类型)免费,但每个端点有小时费用;NAT 网关按小时和数据量收费
- 性能上,VPC 端点延迟更低且更可靠,因为它不经过 NAT 或互联网网关
- 使用场景:仅需访问 S3 或 DynamoDB 时,使用 VPC 端点更经济且安全
查看范例答案
VPC 端点(特别是 Gateway 类型用于 S3 和 DynamoDB)允许私有子网中的实例通过 AWS 内部网络访问这些服务,而不需要经过互联网网关或 NAT 设备。NAT 网关则用于私有子网实例访问互联网上的资源,但会产生额外的数据处理费用和延迟。在成本和性能方面,VPC 网关端点免费(但每个 VPC 端点有少量小时费用,实际可忽略),而 NAT 网关按小时计费(例如 $0.045/小时)并按处理的数据量收费。此外,VPC 端点的延迟更低,因为流量不走公网,且可靠性更高。一个典型场景是:当私有子网的实例仅需要上传下载 S3 对象时,使用 S3 Gateway Endpoint 既安全又省钱。如果实例还需要访问其他互联网资源(如系统更新),则必须使用 NAT 网关或代理。因此,对于仅访问 AWS 服务的场景,优先选择 VPC 端点;否则需要 NAT 网关。VPC 端点也避免了 NAT 网关的数据出口费用,适合大量数据传输。
- S3 如何实现对 PUT 和 DELETE 操作的强一致性?解释底层模型。好回答应覆盖
- S3 在 2020 年实现了对 PUT 和 DELETE 操作的强一致性
- 以前是最终一致性,现在所有写操作后立即读可见
- 底层使用主-主复制和向量时钟保证一致性
- 强一致性适用于需要立即读取最新数据的场景
- 注意:列表操作的桶存在区域较少时仍可能最终一致
查看范例答案
S3 自 2020 年 12 月起默认对所有 Region 的 PUT 和 DELETE 操作提供了强一致性。这意味着,在写入一个对象后,后续的 GET、PUT 和 LIST 操作立即返回最新版本,不会有过期数据。底层实现上,S3 使用主-主复制和分布式共识协议,结合向量时钟来检测冲突并确保所有副本同步。当客户端 PUT 一个对象时,S3 会写入主副本并等待确认,然后更新元数据,保证后续读取能看到结果。对于 DELETE 操作,S3 确保对象被立即标记为删除,后续 GET 将返回 404。需要注意的是,LIST 操作在某些情况下(如跨多个区域)可能仍为最终一致性,但通常场景下已满足。强一致性的实现牺牲了部分可用性,但 S3 的设计保证了 99.99% 的可用性。这一改变简化了应用开发,开发者不再需要实现自己的一致性检查机制。对于金融、游戏等需要实时一致性的应用,S3 强一致性非常有利。
- 编写一个 CloudFormation 模板片段,创建一个具有自定义安全组和标签的 EC2 实例。好回答应覆盖
- CloudFormation 模板可以 JSON 或 YAML 格式编写
- 需要定义 EC2 实例资源及其关联的安全组
- 安全组应在模板中定义并设置适当入站规则
- 使用标签为实例添加元数据
- 可引用其他资源(如 AMI ID)或使用参数化设计
查看范例答案
CloudFormation 模板片段创建 EC2 实例时,需包含 AWS::EC2::Instance 资源和关联的安全组 AWS::EC2::SecurityGroup。安全组应定义入站规则,例如允许 SSH 或 HTTP 访问。标签(Tags)可以在实例和/或安全组上指定,以便成本分配和管理。模板中通常使用参数传递如 AMI、实例类型等,但片段中可以硬编码。注意,安全组与实例的关联可通过 SecurityGroupIds 属性或 SecurityGroups(引用现有安全组名称)实现。下面是一个 YAML 片段:
参考代码yaml Resources: MySecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: 'Allow SSH and HTTP' VpcId: !Ref VPC SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: '0.0.0.0/0' - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: '0.0.0.0/0' Tags: - Key: Name Value: MyApp-SG MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0abcdef1234567890 InstanceType: t2.micro SecurityGroupIds: - !Ref MySecurityGroup Tags: - Key: Name Value: MyApp-Instance - Key: Environment Value: Dev
如何准备
- 动手实践:使用 EC2、S3 和 RDS 部署一个小型应用程序。破坏它并使用 CloudWatch Logs 和 VPC Flow Logs 进行调试。
- 掌握 AWS Well-Architected Framework 的支柱(成本、性能、可靠性、安全性、卓越运营),并准备讨论权衡。
- 理解常见设计模式:多可用区、只读副本、自动扩展和蓝绿部署。使用 AWS 免费套餐进行实验。
- 至少熟练一种基础设施即代码工具(CloudFormation、CDK 或 Terraform)和一种脚本语言(Python、Node.js)。
- 审查 AWS re:Invent 会议和你声称擅长的服务的官方文档。面试官经常问关于“最新特性”的问题。
常见问题
高级岗位期望多少年 AWS 经验?
通常 3-5 年实践经验。但深度和解决问题的能力比单纯的年限更重要。
我需要了解所有 AWS 服务吗?
不需要,专注于核心计算、存储、网络和安全。了解关系型数据库和 NoSQL 数据库也很重要。
会有白板或图表问题吗?
是的,预计需要在白板上绘制架构或使用 draw.io 等工具。练习在设计中解释权衡。
准备 AWS 系统设计面试的最佳方式是什么?
学习常见模式如多可用区、自动扩展组以及使用 SQS/SNS 解耦。完成 AWS Well-Architected Labs。
AWS 认证对面试有帮助吗?
是的,尤其是解决方案架构师专业级或 DevOps 工程师认证。它们验证了广度但不一定深度,因此要结合实际项目。
练习 AWS 题目,即时获取 AI 反馈
上传简历,获得个性化模拟面试,并了解需要改进的地方——免费开始。