关于 aws-deployment
面向 AWS CI/CD 部署的技能,为开发者提供 CodePipeline、CodeBuild、CodeDeploy 等服务的配置和排错指导。涵盖常见部署流程、跨账户要求及安全注意事项。
主要功能
- 01CodePipeline 流水线指导
- 02CodeConnections 源连接配置
- 03CodeBuild 构建配置
- 04CodeDeploy 部署策略
- 05跨账户部署与故障排查
适用场景
- 01创建 GitHub 到 ECS 的流水线
- 02诊断流水线或构建卡住
- 03配置跨账户部署权限
- 04设置 Lambda 金丝雀部署
MCP 相关
该技能适用于 AWS MCP server,可直接运行 CLI 命令并验证配置;相关指导也适用于标准 AWS CLI。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aws/ agent-toolkit-for-aws --skill aws-deployment安装后在 Claude Code 中输入/aws-deployment确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/codeartifact.mdcodebuild.mdcodeconnections.mdcodedeploy.mdcodepipeline.mdtroubleshooting.md详细介绍
AWS 部署(CI/CD)
搭配 AWS MCP server 使用效果最佳,可直接运行 CLI 命令并验证配置。所有指导也适用于标准 AWS CLI。
重要警告
CodeConnections 的 PENDING 陷阱:通过 CLI/CloudFormation 创建的连接会一直处于 PENDING 状态——必须在 AWS Console 中完成 OAuth。不存在仅通过 API 完成的途径。
跨账户部署的三项要求:跨账户部署需要同时满足以下三项:(1) KMS 密钥策略授予目标账户权限(使用密钥 ID,而非别名);(2) S3 存储桶策略授予目标账户权限;(3) 配置具有信任策略的跨账户 IAM 角色。缺少任何一项都会导致难以诊断的 Access Denied。
CodeDeploy ApplicationStop 使用上一个修订版本:先前部署中的停止脚本如果有问题,会阻止所有后续部署。应确保停止脚本幂等(服务不存在时退出码为 0)。使用 --ignore-application-stop-failures 解除阻塞。
没有 NAT 的 CodeBuild VPC:在没有 NAT 网关的 VPC 子网中构建时,会在 DOWNLOAD_SOURCE 阶段无提示地挂起。私有子网必须配置 NAT 网关或 VPC 端点。
CodeConnections IAM:API 调用和 IAM 策略 Actions 使用 codeconnections: 前缀。资源 ARN 必须完全匹配——新资源使用 codeconnections 前缀,现有资源可能使用 codestar-connections 前缀。如果资源创建时间不一,请在 Resource 中指定两种前缀。
UseConnection 权限过于宽泛:codeconnections:UseConnection 会授予对该连接可访问的所有存储库的权限。必须指定条件键(codeconnections:FullRepositoryId、codeconnections:ProviderAction、codeconnections:BranchName),将 CodeBuild 限制为只能访问所需的存储库。
这些服务如何协同工作
CodeConnections → CodeBuild → CodeDeploy,由 CodePipeline 负责编排。
| 层级 | 服务 | 作用 |
|---|---|---|
| 源代码 | CodeConnections | 向 GitHub/GitLab/Bitbucket 进行身份验证并交付代码 |
| 软件包 | CodeArtifact | 私有软件包注册表,从公共注册表缓存依赖项 |
| 构建/测试 | CodeBuild | 编译、测试并打包构件 |
| 部署 | CodeDeploy | 通过流量切换策略部署到 EC2/ECS/Lambda |
| 编排 | CodePipeline | 串联各阶段、管理转换和审批关卡 |
默认使用 V2 管道类型和 QUEUED 执行模式。仅当各次执行完全独立时才使用 PARALLEL。
快速导航
| 你想要…… | 前往 |
|---|---|
| 创建管道(V2、触发器、变量、模式) | codepipeline.md |
| 连接 GitHub/GitLab/Bitbucket 源 | codeconnections.md |
| 编写 buildspec.yml / 配置构建 | codebuild.md |
| 为构建设置私有软件包注册表 | codeartifact.md |
| 配置部署策略(蓝绿、金丝雀) | codedeploy.md |
| 跨账户或跨区域部署 | codepipeline.md |
| 修复失败的管道、构建或部署 | troubleshooting.md |
常见工作流
| 任务 | 操作 | 参考 |
|---|---|---|
| 从 GitHub 部署流水线到 ECS | 创建连接 → CodeBuild Docker 阶段 → CodeDeploy ECS 蓝绿部署 | codepipeline、codedeploy |
| 流水线停滞在源阶段 | 检查连接状态;如果状态为 PENDING,请在 AWS Console 中完成 OAuth | troubleshooting |
| 构建超时 | 检查 VPC/NAT,增大 timeoutInMinutes,确认 Docker 特权模式已启用 | codebuild |
| 部署到其他账户 | 配置 KMS + S3 存储桶策略 + 跨账户角色,并将 RoleArn 添加到操作中 | codepipeline |
| 回滚失败的部署 | 在警报触发或失败时自动回滚;手动操作:stop-deployment --auto-rollback-enabled | codedeploy |
| Lambda 金丝雀部署 | CodeBuild 打包 → CodeDeploy Lambda 金丝雀流量转移 | codedeploy |
故障排除
| 错误/症状 | 原因 | 解决方法 |
|---|---|---|
CodeBuild 中出现 YAML_FILE_ERROR | buildspec 中缺少或格式错误的 runtime-versions(标准映像建议配置) | 在 install 阶段添加 runtime-versions 块 |
CodeDeploy 出现 file already exists | 重新部署时未配置覆盖 | 设置 file_exists_behavior: OVERWRITE |
| 流水线触发器未触发 | 文件路径筛选器仅检查差异中的前 100 个文件 | 缩小路径筛选范围,或合并更小的更改 |
| PARALLEL 模式使用了错误的修订版本 | 事件与源操作之间存在竞争 | 使用 QUEUED 模式以确保顺序一致性 |
Docker:Cannot connect to daemon | 未启用特权模式 | 设置 privilegedMode: true,并在 buildspec 中启动 dockerd |
CODEBUILD_CLONE_REF 权限错误 | CodeBuild 角色缺少 UseConnection 权限 | 将 codeconnections:UseConnection 添加到 CodeBuild 服务角色 |
| 部署始终无法完成 | MinimumHealthyHosts 对实例数量而言设置过高 | 确保健康阈值低于实例总数 |
| ECS 部署停滞 | 新任务集的运行状况检查失败 | 确认目标组的运行状况检查路径/端口 |
安全
- MUST 将密钥存储在 Secrets Manager 或 Parameter Store 中;通过 CodeBuild
type: SECRETS_MANAGER引用——MUST NOT 将密钥以 PLAINTEXT 嵌入 buildspec - MUST 使用客户管理的 KMS 密钥加密跨账户构件(默认加密不支持跨账户)
- SHOULD 将 CodeBuild/CodeDeploy 服务角色的权限范围限定为特定资源 ARN;MUST NOT 在
s3:GetObject或kms:Decrypt中使用* - MUST 使用 CodeConnections(而非个人访问令牌)建立源连接;OAuth 令牌无法自动轮换
- 有关完整指南,请参阅 CodePipeline 安全最佳实践
未涵盖的内容
| 主题 | 请改用 |
|---|---|
CDK Pipelines(aws-cdk-lib/pipelines) | aws-cdk |
sam deploy / SAM CLI | aws-serverless |
| ECS 服务部署配置(断路器、滚动参数) | aws-containers |
| GitHub Actions / GitLab CI | 第三方工具,不在本文涵盖范围内 |