Amazon DVA-C02: 存储、Amazon S3、CloudFront 与文件系统 (EFS, FSx) — 学习指南
属于 AWS Developer Associate DVA-C02 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.
Amazon S3 基础、安全控制和开发者模式
Amazon S3 是权威的持久化对象存储。开发者应围绕 PutObject/GetObject/HeadObject 和用于大负载的分段上传(CreateMultipartUpload、UploadPart、CompleteMultipartUpload)来设计 API,并使用 SDK 辅助工具(如 boto3 的 generate_presigned_url(‘get_object’) 或 generate_presigned_post)来支持临时的客户端上传。通过服务器端加密(使用 PutObject 的 x-amz-server-side-encryption 参数指定 SSE-S3、SSE-KMS,或通过 PutBucketEncryption 强制执行存储桶默认加密)来保护对象,在存储桶策略中强制执行 aws:SecureTransport 来要求 TLS,并使用 S3 阻止公有访问功能和存储桶策略中的显式拒绝来防止意外的公有访问。常见陷阱包括:IAM 显式拒绝优先于角色权限;预签名 URL 继承签名者的权限,但仍受存储桶策略和 VPC 终端节点策略的约束;以及从浏览器直接上传时出现 CORS 配置错误(需配置 PutBucketCors)。使用生命周期规则(PutBucketLifecycleConfiguration)将对象转换到 Intelligent-Tiering、GLACIER 或使非当前版本过期,并在依赖非当前版本规则之前启用版本控制(PutBucketVersioning)。为了审计和恢复,请启用 S3 服务器访问日志或 S3 Access Points,并使用带有保留模式的 Object Lock 实现不可变保留。架构设计时应考虑到对新键的覆盖性 PUT 操作的最终一致性(对新对象的 PUT 操作保证了写后读,但对现有键的更新在边缘场景下可能表现出最终一致性)。
高级 S3:Object Lambda、预签名流程、策略和生命周期细微之处
S3 Object Lambda 允许您通过将一个 Lambda 函数附加到 S3 Object Lambda 接入点来转换 GetObject 响应;该 Lambda 函数会收到一个 GetObjectContext,并且必须调用 WriteGetObjectResponse(通过 S3 Object Lambda/Control API)来返回转换后的字节流。典型模式是在不复制对象的情况下,动态地进行图像大小调整、数据脱敏或格式转换。对于浏览器上传,应生成带有约束策略(如 content-length-range、键前缀)的预签名 POST(在 SDK 中使用 generate_presigned_post),以防止滥用。存储桶策略和 VPC 网关/接口终端节点策略是限制访问的强大工具:优先使用显式允许+资源条件(谨慎使用 aws:SourceVpce、aws:Referer),并避免开放的通配符委托人。生命周期方面的注意事项包括对已启用版本控制的存储桶的转换——需要明确配置 noncurrentVersionTransitions 和 noncurrentVersionExpiration——以及配置 abort-incomplete-multipart-upload 以避免存储泄漏。在强制实施传输中加密时,要求请求包含 x-amz-server-side-encryption,或使用 PutBucketPolicy 拒绝未使用 TLS 的请求。为了实现不可变合规性,请在上传对象之前启用 Object Lock。当需要以编程方式强制执行策略时,可将 S3 事件(SNS、EventBridge)与 Lambda 结合使用,以应用标签或执行上传后验证。
CloudFront、缓存策略和边缘计算(Lambda@Edge vs CloudFront Functions)
CloudFront 可加速全球内容分发并保护源站。对于 S3 源站,优先使用支持 Sigv4 的源访问控制(OAC),而不是旧版的源访问身份(Origin Access Identity),来签署源站请求并拒绝直接的 S3 公有访问。缓存行为调优涉及使用 Cache-Control/Expires、Authorization 标头转发以及基于查询字符串/Cookie 的缓存键;推荐使用缓存键白名单或缓存策略与源请求策略(Cache Policy & Origin Request Policy)来减少缓存碎片化。对于私有内容,使用 CloudFront 签名 URL 或签名 Cookie(通过 cloudfront.create_signer 或 SDK 辅助工具创建)。使用 CloudFront Functions 进行亚毫秒级的轻量级操作(查看器请求/响应),而对于需要 Node/Python 运行时和源请求或源响应挂钩的更重逻辑,则使用 Lambda@Edge;请记住,Lambda@Edge 函数从 us-east-1 部署,存在冷启动问题和区域复制延迟。缓存失效操作有成本和延迟——推荐使用对象键版本控制(部署新文件名或添加查询字符串版本)来避免执行失效操作。通过实时日志和 CloudWatch 指标来监测 CloudFront,以实现近乎实时的异常检测,并触发 Lambda 进行自动化响应。常见陷阱包括转发过多破坏缓存的标头/Cookie,以及假设缓存失效会立即传播。
共享文件系统:EFS 与 FSx 的决策标准、挂载和常见问题
对于需要跨 Linux 客户端并发挂载、符合 POSIX 标准的 NFSv4.1 文件系统,请选择 EFS;当需要 SMB/Windows 功能或高性能 Lustre 时,请选择 FSx 的不同变体。EFS 支持通过 KMS 实现静态加密,使用 TLS 挂载选项实现传输中加密,并支持使用接入点为每个应用程序进行 UID/GID 映射。对于高吞吐量工作负载,可使用 amazon-efs-utils (mount -t efs -o tls,accesspoint=fsap-0123456789 fs-12345678:/ /mnt) 或 NFS 客户端进行挂载。根据吞吐量/IOPS 模式,选择 generalPurpose (通用) 或 maxIO (最大 I/O) 性能模式,以及 bursting (突发) 或 provisioned (预置) 吞吐量模式。FSx for Windows 与 Active Directory 集成,并公开具有 NTFS ACL、DFS 命名空间和原生 Windows 语义的 SMB 共享——可使用 net use \fs-xxxx\share 或通过 EC2 Windows 客户端进行挂载;常见问题包括加入 AD 的复杂性和 DNS 解析问题。FSx for Lustre 是高性能计算的理想选择,并能通过数据存储库任务透明地链接到 S3,以导入/导出数据集。网络方面的注意事项:在安全组中开放 NFS/SMB 端口,为 EFS 在每个可用区中使用挂载目标,并确保 IAM 策略不能用于限制 NFS 级别的访问——POSIX 权限和安全组才是强制执行点。对于备份,首选自动化快照(EFS Backup、FSx 快照)并定期测试恢复。
实践问题:用例场景
场景:AcmeAnalytics 公司在一个 S3 存储桶中托管了一个面向客户的静态仪表盘,并通过 CloudFront 分发在全球范围内提供服务。工程团队需要提供私有数据文件,对某些对象执行即时的 CSV 到 JSON 转换,并确保新的仪表盘构建能以最低成本使缓存失效。
挑战:实现安全的私有对象交付、无需复制存储的动态转换,以及低成本的缓存更新策略。
推荐方法:
- 创建一个 S3 存储桶,使用 PutBucketEncryption (SSE-KMS) 和 PutBucketPolicy 来拒绝非 TLS 请求,并仅允许来自 CloudFront 源访问控制 (Origin Access Control, OAC) 的访问(创建 OAC 并附加到分发);使用 PutBucketVersioning 启用版本控制。
- 配置一个 S3 Object Lambda 接入点;实现一个 Lambda 函数,该函数处理 GetObjectContext,通过 S3 GetObject 检索原始对象,在内存中将 CSV 转换为 JSON,并使用 s3control.write_get_object_response 返回结果。
- 配置 CloudFront 缓存行为:将 /private/* 路由到 S3 Object Lambda 接入点(作为源),设置一个缓存策略(如有必要,可基于 Accept 标头进行缓存),并启用最小 TTL;对于仪表盘资产,使用带版本号的文件名以避免缓存失效。
- 对于不频繁但必要的缓存失效操作,在部署后从 CI 调用 cloudfront.create_invalidation(DistributionId=…, InvalidationBatch={…});对于常规更改,则上传文件名中带有内容哈希的资产,以规避缓存失效的成本。
基本原理:通过 OAC 将 S3 访问限制为仅 CloudFront,并强制执行 SSE-KMS,可确保数据在传输中和静态时的安全。S3 Object Lambda 提供了无需复制对象的即时转换能力,而使用对象版本控制或内容哈希文件名则避免了昂贵的缓存失效操作,同时保持了缓存效率。
← 监控、日志记录与调试 (CloudWatch · 所有领域 · 数据库与缓存 (RDS →
练习这些题目 → · 在 ExamRoll.io 上限时练习 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
通过考试 →