Amazon DVA-C02: CloudFormation 与基础设施即代码 (SAM, CDK) — 学习指南

属于 AWS Developer Associate DVA-C02 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.

CloudFormation 核心模式与模板最佳实践

CloudFormation 模板应编写为资源的声明式、幂等描述,对于复杂架构,倾向于使用小而专注的堆栈和嵌套堆栈。使用带有明确逻辑 ID 的 Resources 部分,并优先使用 !Ref、!GetAtt、!Sub、Fn::FindInMap 和 Fn::If 等内置函数进行组合和重用。在创建变更集之前,使用 aws cloudformation validate-template 或 SAM/CDK 的等效命令(sam validate, cdk synth)来验证模板。使用 ChangeSets (CreateChangeSet / ExecuteChangeSet) 进行审查并避免意外替换;使用 DescribeChangeSet 来检查堆栈将要执行的操作。通过将大型内联代码移动到 S3 并通过 CodeUri、S3Bucket/S3Key 等方式引用,或使用 AWS::CloudFormation::Stack 将其拆分为嵌套堆栈,从而将模板主体大小保持在 CloudFormation 的限制内。定期使用 DetectStackDrift 和 DescribeStackResourceDrifts 执行漂移检测。使用 DeletionPolicy 和 UpdateReplacePolicy 来保护承载数据的资源,并在关键堆栈上启用终止保护。将 cfn-lint 和 cfn-guard 集成到 CI/CD 中,以尽早发现结构性问题和策略违规。为了快速迭代,利用 ChangeSets 和资源级别的更新策略来最小化爆炸半径;对于 Lambda 函数,使用版本化部署以确保更新安全且可逆。

参数化、映射、密钥和敏感数据

使用 CloudFormation Parameters 和 Mappings 来参数化环境差异,并使用 AllowedValues 和 ConstraintDescription 来实现快速失败。避免在 Parameters 中嵌入密钥或明文凭证;而应使用 SecureString 类型的 SSM Parameter Store 或 Secrets Manager,并通过 {{resolve:secretsmanager:mysecret:SecretString:password}} 等动态引用来引用它们。使用 NoEcho: true 标记敏感参数,以在控制台中屏蔽其值,但需注意 NoEcho 不提供静态加密——应使用 Secrets Manager 进行审计和轮换。使用 Mappings 和 Fn::FindInMap 来处理确定性的、特定于环境的值(例如每个区域的 AMI ID),并使用 Fn::GetAZs 来计算可用区。对于同一区域/账户内跨堆栈的资源引用,导出输出并通过 Fn::ImportValue 导入它们;请记住,导入不能跨账户或跨区域。通过使用最小权限范围的角色来保护 CloudFormation 使用的 IAM 主体;优先选择服务托管的 StackSet 权限,或显式地配置一个范围受限的管理角色。在向容器或 Lambda 传递环境变量时,优先引用 Secrets Manager ARN 或 SSM Parameter ARN,并在代码中于运行时进行检索,或者使用 SAM/CDK 的功能,通过 KMS 加密将安全值注入到环境中。

跨账户/区域部署、CDK 和 SAM 的多账户模式

跨账户和跨区域部署需要超越单个堆栈导出的编排能力。对于多账户/多区域部署,选择 CloudFormation StackSets (CreateStackSet, CreateStackInstances),可为 Organizations 使用服务托管权限,或在目标账户中使用执行角色进行自我管理。对于应用程序代码构件,使用具有跨账户复制功能或存储桶策略的集中式 S3 存储桶,或者让工具按区域发布资产:CDK 使用引导堆栈和通过 cdk-assets 发布的资产,并要求在每个账户/区域中执行 cdk bootstrap;CDK Pipelines (pipelines 模块) 或带有 –role-arn 参数的 aws-cdk CLI 支持跨账户提升。SAM 使用 sam package / sam deploy,它会将构件上传到 S3 存储桶;对于多账户场景,使用 CI/CD 将构件打包并推送到目标账户的存储桶中,然后使用适当的凭证运行部署。避免使用 VPC.fromLookup 等 CDK 上下文查找,因为它们在合成时需要特定于账户的权限;而应将标识符作为参数显式传递,以保持合成的可复现性。使用 AWS CodePipeline 或 GitHub Actions,通过代入的角色 (sts:AssumeRole) 来向目标账户执行部署,并确保引导堆栈和必要的服务相关角色已存在。请记住,CloudFormation 的导出是区域性的;对于跨账户分发,优先选择 StackSets 或由管道驱动的部署。

自定义资源、堆栈保护和本地/增量部署加速器

当 CloudFormation 缺少原生资源类型时,使用自定义资源,通过实现遵循 CloudFormation 响应协议(处理 Create/Update/Delete 事件)的、由 Lambda 支持的提供程序来解决。构建幂等的处理程序,使用 cfn-response 或 CloudFormation CLI 框架进行响应,并通过进度事件或将状态存储在 DynamoDB 中来处理长时间运行的操作。注意自定义资源的超时问题:CloudFormation 有一个最大的堆栈操作超时时间,由 Lambda 支持的资源必须在该时间窗口内完成,否则会导致堆栈回滚。使用堆栈策略 (SetStackPolicy) 保护关键资源,以在堆栈更新期间阻止对指定逻辑 ID 的替换或更新,并为不能承受被删除风险的环境启用终止保护。对于增量和本地开发,使用 AWS SAM CLI(sam build、sam local invoke、sam local start-api)和用于快速纯代码更新的 sam sync,以及用于仅更新已更改资源的 CDK watch 或 cdk deploy with assets;这些工具会计算资产哈希(lambda asset hashing),因此只有更改过的代码才会被重新发布。集成 CloudFormation ChangeSets、Lambda 版本控制(SAM 中的 AutoPublishAlias 或 CDK 中的 lambda.Version)和 CodeDeploy 流量转移,以实现安全部署。常见陷阱包括超出模板或参数限制、不正确地使用跨账户导入,以及在处理程序内部初始化重型 SDK 客户端导致冷启动延迟——应优先使用全局、延迟初始化的客户端,并为其配置超时和重试行为。

实践问题:用例场景

场景:AcmeMedia 公司管理着一个多账户的 AWS Organization,在 us-east-1 区域拥有独立的开发、预发布和生产账户。一个无服务器图像处理服务(Lambda + S3 + DynamoDB)必须在所有账户中进行一致性部署,同时共享的敏感配置需要被集中存储。

挑战:跨多个账户部署相同的 CloudFormation/SAM/CDK 堆栈,并确保 Lambda 代码构件在每个目标账户中都安全可用,同时避免将敏感信息硬编码在模板中。

推荐方法:

  1. 使用带有服务管理权限的 AWS CloudFormation StackSets(aws cloudformation create-stack-set –stack-set-name ImageProcessor –template-body file://template.yaml),然后使用 aws cloudformation create-stack-instances 来指定目标账户和区域;或者配置 CDK Pipelines,使用角色为每个账户进行合成和部署。
  2. 使用 CDK 资产发布(在每个账户/区域中运行 cdk bootstrap)或使用 sam package 将 Lambda 资产打包到每个目标账户中的 S3 存储桶;通过 CI(使用 aws s3 cp 的 CodeBuild 或 S3 复制)自动复制资产,并使用 cdk deploy 或 sam deploy 配合目标账户凭证进行部署。
  3. 将敏感配置存储在每个账户的 AWS Secrets Manager 中,通过动态引用({{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:123456789012:secret:ImageProcSecret:SecretString:apiKey}})在模板中引用;或者通过 Secrets Manager 的复制功能部署一个复制的密钥,避免使用 NoEcho 参数。
  4. 使用 ChangeSets(create-change-set、execute-change-set),在生产堆栈上启用终止保护,并使用堆栈策略来防止在更新过程中意外替换 DynamoDB 表或 S3 存储桶。

基本原理:StackSets 和由管道驱动的部署提供了安全、可审计的多账户/多区域传播能力,而资产发布和每个账户独立的密钥则使凭证保持本地化和可审计。ChangeSets、终止保护和堆栈策略降低了迭代部署过程中的风险。


Amazon DynamoDB 与 NoSQL 设计 · 所有领域 · 部署与 CI

练习这些题目 → · 在 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.

通过考试 →

浏览 Amazon →

Related guides

一体化访问

一次订阅。所有考试。

所有计划均可无限制搜索答案、进行模拟测试、获取AI解释以及访问完整的资源库 — 支持20多种语言。

每月
24.87
Just €0.83/day
包含所有内容:
  • 无限答案搜索
  • 无限模拟测试
  • AI驱动的解释
  • 完整资源库
  • 20多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

最具价值
12个月
179.87
Just €0.49/daySave 40%
包含所有内容:
  • 无限答案搜索
  • 无限模拟测试
  • AI驱动的解释
  • 完整资源库
  • 20多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

✓ 包含免费计划 · ✓ 随时取消 · ✓ 所有计划均解锁完整产品