本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS CDK 和 GitHub 操作工作流程优化多账户无服务器部署
由 Sarat Chandra Pothula (AWS) 和 VAMSI KRISHNA SUNKAVALLI (AWS) 创作
摘要
跨多个 AWS 账户 环境部署无服务器基础架构的组织经常会遇到诸如代码重复、手动流程和做法不一致之类的挑战。此模式的解决方案展示了如何使用 Go and Actions AWS Cloud Development Kit (AWS CDK) 中的可重复使用工作流程来简化多账户无服务器基础架构管理。 GitHub 该解决方案演示了如何将云资源定义为代码、实现标准化integration/continuous deployment (CI/CD(持续)流程以及如何创建模块化、可重复使用的组件。
通过使用这些工具,组织可以高效地管理跨账户资源,实施一致的部署管道,并简化复杂的无服务器架构。该方法还通过强制使用标准化实践来增强安全性和合规性 AWS 账户,从而最终提高工作效率并减少无服务器应用程序开发和部署中的错误。
先决条件和限制
先决条件
活跃 AWS 账户的.
AWS Identity and Access Management (IAM) 角色和权限适用于部署过程。这包括访问亚马逊弹性容器注册表 (Amazon ECR) 存储库、 AWS Lambda 创建函数以及跨目标的任何其他所需资源的权限。 AWS 账户
AWS Command Line Interface (AWS CLI) 版本 2.9.11 或更高版本,已安装并配置。
AWS Cloud Development Kit (AWS CDK) 版本 2.114.1 或更高版本,已安装并已引导。
已安装
1.22 或更高版本。
限制
语言兼容性 — Go 是无服务器应用程序的常用语言。但是,除了 Go 之外,还 AWS CDK 支持其他编程语言,包括 C#、Java、Python 和 TypeScript。如果您的组织拥有其他语言的现有代码库或专业知识,则可能需要调整或学习 Go 才能充分使用模式中描述的解决方案。
学习曲线 — 采用 AWS CDK、Go(如果对组织来说是新手)和 GitHub 可重复使用的工作流程可能会涉及开发人员和 DevOps 团队的学习曲线。为确保顺利采用和有效使用这些技术,可能需要培训和文档。
架构
下图显示了此模式的工作流和体系结构组件。

此解决方案执行以下步骤:
开发人员克隆存储库,创建新分支,并在本地环境中更改应用程序代码。
开发者提交这些更改并将新分支推送到 GitHub 存储库。
开发者在 GitHub 存储库中创建拉取请求,提议将其功能或新功能分支合并到主分支中。
此拉取请求会触发持续集成 (CI) GitHub 操作工作流程。这种模式中的 CI 和持续部署 (CD) 工作流程使用可重复使用的工作流程,这些工作流程是预定义的模块化模板,可以在不同的项目或存储库中共享和执行。可重复使用的工作流程促进了 CI/CD 流程的标准化和效率。
CI 工作流程设置必要的环境,为镜像生成 Docker 标签,并使用应用程序代码构建 Docker 镜像。
CI 工作流程使用中央 AWS 账户 GitHub OIDC 角色进行身份验证。 AWS 对于 CI 工作流程, AWS 账户 GitHub OIDC 的中心角色使用 AWS Security Token Service (AWS STS) 来获取临时证书。这些证书允许该角色构建 Docker 镜像并将其推送到中央的 Amazon ECR 存储库。 AWS 账户
CI 工作流程将构建的 Docker 镜像推送到 Amazon ECR。
CI 工作流程将图像标签存储到 Systems Manager 参数存储区。
CI 工作流程成功完成后,将输出 Docker 镜像标签。
触发 CD 工作流程时,开发人员手动输入他们要部署的 Docker 镜像的镜像标签。此图片标签对应于 CI 工作流程中生成并推送到 Amazon ECR 的标签。
开发人员手动触发 CD 工作流程,该工作流程使用 CD 可重复使用工作流程。
CD 工作流程 AWS 使用中央 AWS 账户 GitHub OIDC 角色进行身份验证。对于 CD 工作流程, AWS STS 首先用于担任 AWS 账户 GitHub OIDC 的中心角色。然后,此角色将担任目标账户部署的 CDK 引导角色。
CD 工作流程使用 AWS CDK 来合成 AWS CloudFormation 模板。
CD 工作流程使用 CDK 部署将应用程序部署 AWS 账户 到目标,使用手动为 Lambda 函数指定的图像标签。
工具
AWS 服务
AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置 AWS Cloud 基础架构。
AWS CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。 CloudFormation 是 AWS CDK 部署过程不可或缺的一部分。CDK 合成 CloudFormation 模板,然后 CloudFormation 用于创建或更新环境中的 AWS 资源。
Amazon Elastic Container Registry (Amazon ECR) 是一项安全、可扩展且可靠的托管容器映像注册表服务。
AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
AWS Systems Manager Parameter Store 为配置数据管理和密钥管理提供安全的分层存储。
其他工具
代码存储库
此模式的代码可在cicd-github-actions存储 GitHub aws-cdk-golang-serverless库
最佳实践
模块化设计 — 将您的 AWS CDK 代码组织成模块化和可重复使用的构造或堆栈,从而促进跨多个账户和项目的代码重用和可维护性。
问题分离 — 将基础架构代码与应用程序代码分开,允许独立部署和管理每个组件。
版本控制和不可变性 — 将您的基础设施视为代码 (IaC),并使用 Git 进行版本控制。通过创建新资源而不是修改现有资源来接受不可变的基础架构原则。
测试和验证-实施全面的测试策略,包括单元测试、集成 end-to-end测试和测试,以帮助支持 AWS CDK 代码和部署的正确性和可靠性。
安全性与合规性-遵循 AWS 安全最佳实践,例如最低权限访问、安全通信和数据加密。实施合规检查和审计机制,确保遵守组织政策和监管要求。为容器映像实施安全最佳实践,例如扫描漏洞、强制执行映像签名以及遵守组织的合规性要求。
监控和记录-设置监控和日志记录机制,以跟踪无服务器应用程序和基础设施的运行状况和性能。 AWS 服务 像 Amazon CloudWatch、 AWS CloudTrail、一样使用, AWS X-Ray 用于监控和审计。
自动化和 CI/CD — 使用 GitHub 可重复使用的工作流程和其他 CI/CD 工具来自动执行构建、测试和部署流程,这有助于支持跨多个账户进行一致且可重复的部署。
环境管理-维护单独的环境(例如,开发、暂存和生产)。实施促进环境间变更的策略,确保在生产部署之前进行适当的测试和验证。
文档和协作-记录您的基础架构代码、部署流程和最佳实践,以促进团队内部的知识共享和协作。
成本优化-实施成本监控和优化策略,例如合理调整资源规模、使用自动缩放以及利用 AWS 成本优化服务(如 AWS Budgets 和)。 AWS Cost Explorer
灾难恢复和备份 — 通过为无服务器应用程序和基础设施资源实施备份和还原机制,规划灾难恢复方案。
持续改进 — 定期审查并更新您的实践、工具和流程,以适应无服务器生态系统中的最新最佳实践、安全建议和技术进步。
改善安全状况 — 通过AWS PrivateLink为 Amazon ECR 和 P AWS Systems Manager arameter Store 配置接口 VPC 终端节点, AWS Lambda用于改善虚拟私有云 (VPC) 的安全状况。
操作说明
Task | 描述 | 所需技能 |
---|---|---|
在中央 AWS 账户创建一个 Amazon ECR 存储库。 | 要跨多个容器镜像共享 AWS 账户,您必须为 Amazon ECR 配置跨账户访问权限。首先,在中央 AWS 账户创建一个 Amazon ECR 存储库。 要创建 Amazon ECR 存储库,请运行以下命令:
在以后的任务中,向需要使用容器镜像的其他 AWS 账户 人授予拉取访问权限。 | AWS DevOps |
向 Amazon ECR 存储库添加跨账户权限。 | 要向中心的 Amazon ECR 存储库添加跨账户权限 AWS 账户,请运行以下代码:
| AWS DevOps |
在中心为 GitHub OIDC 角色配置角色。 AWS 账户 |
| AWS DevOps |
引导目标 AWS 账户中的 AWS 环境。 | 在特定 AWS 账户 环境中设置 CDK 环境 AWS 区域 ,该环境允许从中央账户进行跨账户部署,并将最低权限原则应用于执行角色。 CloudFormation 要引导 AWS 环境,请运行以下命令:
| AWS DevOps |
授予中央 AWS 账户 OIDC 角色对目标 AWS 账户 引导角色的访问权限。 | CDK bootstrap 创建了以下 IAM 角色,这些角色旨在由中央在 CDK AWS 账户 部署过程的各个阶段担任:
每个角色都有根据其目的量身定制的特定权限,遵循最低权限原则。每个角色名称
要在中心更新 OIDC 角色的权限策略 AWS 账户,请使用以下代码:
| AWS DevOps |
Task | 描述 | 所需技能 |
---|---|---|
克隆项目存储库。 | 要克隆此模式的GitHub 存储库
| AWS DevOps |
前往 Dockerfile 路径。 | 要导航到 Dockerfile 路径,请运行以下命令:
| AWS DevOps |
使用亚马逊 ECR 对 Docker 进行身份验证。 | Amazon ECR 需要安全访问您的私有容器存储库。通过这种方式登录,您就允许本地计算机或 CI/CD 环境上的 Docker 安全地与 Amazon ECR 进行交互。 要使用 Amazon ECR 对 Docker 进行身份验证,请运行以下命令:
修改占位 | AWS DevOps |
构建 Docker 映像。 | 要构建 Docker 镜像,请运行以下命令:
| AWS DevOps |
标记并推送 Docker 镜像。 | 要标记 Docker 镜像并将其推送到 Amazon ECR 存储库,请运行以下命令:
使用您的信息修改占位符 | AWS DevOps |
Task | 描述 | 所需技能 |
---|---|---|
使用特定于环境的变量合成 CDK 堆栈。 | 要按照 CDK 代码中的定义为基础架构生成 CloudFormation 模板,请运行以下命令:
使用您的信息修改以下占位符:
| AWS DevOps |
部署 CDK 堆栈。 | 要将 CDK 堆栈部署到您的 AWS 账户,请运行以下命令。该
| AWS DevOps |
Task | 描述 | 所需技能 |
---|---|---|
创建功能分支,然后添加您的更改。 | 使用您之前创建的克隆存储库,创建功能分支,然后将更改添加到应用程序代码中。使用以下命令:
以下是更改的示例:
GitHub 操作将使用可重复使用的工作流程并触发 CI/CD 管道。 | AWS DevOps |
合并您的更改。 | 创建拉取请求,并将您的更改合并到 main 中。 | AWS DevOps |
故障排除
事务 | 解决方案 |
---|---|
| 要帮助解决此问题,请执行以下操作来验证跨账户权限:
|
由于版本不匹配而导致的兼容性问题,例如,过时的 CDK 版本 | 要帮助解决此问题,请执行以下操作以验证您使用的是 AWS CDK 和 Go 的必需版本:
|
例如,由 | 为了帮助解决 GitHub 操作配置问题,请验证是否正确引用和配置了可重复使用的工作流程。 |
相关资源
AWS 资源
其他资源
在亚马逊 Web Services 中配置 OpenID Connect
(文档)GitHub GitHub 操作快速入门
(GitHub 文档) 重复使用工作流程
(GitHub 文档)