使用 AWS CDK 和 GitHub 操作工作流程优化多账户无服务器部署 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 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 账户,从而最终提高工作效率并减少无服务器应用程序开发和部署中的错误。

先决条件和限制

先决条件

限制

  • 语言兼容性 — Go 是无服务器应用程序的常用语言。但是,除了 Go 之外,还 AWS CDK 支持其他编程语言,包括 C#、Java、Python 和 TypeScript。如果您的组织拥有其他语言的现有代码库或专业知识,则可能需要调整或学习 Go 才能充分使用模式中描述的解决方案。

  • 学习曲线 — 采用 AWS CDK、Go(如果对组织来说是新手)和 GitHub 可重复使用的工作流程可能会涉及开发人员和 DevOps 团队的学习曲线。为确保顺利采用和有效使用这些技术,可能需要培训和文档。

架构

下图显示了此模式的工作流和体系结构组件。

用于多账户无服务器基础设施管理的 AWS CDK 架构和 GitHub 操作工作流程。

此解决方案执行以下步骤:

  1. 开发人员克隆存储库,创建新分支,并在本地环境中更改应用程序代码。

  2. 开发者提交这些更改并将新分支推送到 GitHub 存储库。

  3. 开发者在 GitHub 存储库中创建拉取请求,提议将其功能或新功能分支合并到主分支中。

  4. 此拉取请求会触发持续集成 (CI) GitHub 操作工作流程。这种模式中的 CI 和持续部署 (CD) 工作流程使用可重复使用的工作流程,这些工作流程是预定义的模块化模板,可以在不同的项目或存储库中共享和执行。可重复使用的工作流程促进了 CI/CD 流程的标准化和效率。

  5. CI 工作流程设置必要的环境,为镜像生成 Docker 标签,并使用应用程序代码构建 Docker 镜像。

  6. CI 工作流程使用中央 AWS 账户 GitHub OIDC 角色进行身份验证。 AWS 对于 CI 工作流程, AWS 账户 GitHub OIDC 的中心角色使用 AWS Security Token Service (AWS STS) 来获取临时证书。这些证书允许该角色构建 Docker 镜像并将其推送到中央的 Amazon ECR 存储库。 AWS 账户

  7. CI 工作流程将构建的 Docker 镜像推送到 Amazon ECR。

  8. CI 工作流程将图像标签存储到 Systems Manager 参数存储区。

  9. CI 工作流程成功完成后,将输出 Docker 镜像标签。

  10. 触发 CD 工作流程时,开发人员手动输入他们要部署的 Docker 镜像的镜像标签。此图片标签对应于 CI 工作流程中生成并推送到 Amazon ECR 的标签。

  11. 开发人员手动触发 CD 工作流程,该工作流程使用 CD 可重复使用工作流程。

  12. CD 工作流程 AWS 使用中央 AWS 账户 GitHub OIDC 角色进行身份验证。对于 CD 工作流程, AWS STS 首先用于担任 AWS 账户 GitHub OIDC 的中心角色。然后,此角色将担任目标账户部署的 CDK 引导角色。

  13. CD 工作流程使用 AWS CDK 来合成 AWS CloudFormation 模板。

  14. 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 为配置数据管理和密钥管理提供安全的分层存储。

其他工具

  • Docker 是一组平台即服务(PaaS)产品,它们使用操作系统级别的虚拟化技术在容器中交付软件。

  • GitHub A@@ c tions 是一个持续集成和持续交付 (CI/CD) 平台,与 GitHub 存储库紧密集成。您可以使用 GitHub Actions 来自动执行构建、测试和部署管道。

  • Go 是谷歌支持的开源编程语言。

代码存储库

此模式的代码可在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 ecr create-repository --repository-name sample-repo

在以后的任务中,向需要使用容器镜像的其他 AWS 账户 人授予拉取访问权限。

AWS DevOps

向 Amazon ECR 存储库添加跨账户权限。

要向中心的 Amazon ECR 存储库添加跨账户权限 AWS 账户,请运行以下代码:

{ "Version": "2008-10-17", "Statement": [ { "Sid": "LambdaECRImageRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", ], "Condition": { "StringLike": { "aws:sourceArn": "arn:aws:lambda:<Target_Region>:<Target_Account_ID>:function:*" } } }, { "Sid": "new statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<Target_Account_ID>:root" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer", ], } ] }
AWS DevOps

在中心为 GitHub OIDC 角色配置角色。 AWS 账户

  1. AWS 将信任 GitHub的 OIDC 配置为联合身份,包括将 GitHub OIDC 提供商添加到 IAM AWS 以及在 IAM 中配置角色和信任策略。为此,请按照文档中在亚马逊 Web Services 中配置 OpenID Connect 中的 GitHub 说明进行操作。

  2. 创建角色后,向该角色添加必要的权限。例如,为 Amazon ECR 和 P AWS Systems Manager arameter Store 添加权限。有关更多信息,请参阅 IAM 文档中的为 GitHub OIDC 身份提供商配置角色

AWS DevOps

引导目标 AWS 账户中的 AWS 环境。

在特定 AWS 账户 环境中设置 CDK 环境 AWS 区域 ,该环境允许从中央账户进行跨账户部署,并将最低权限原则应用于执行角色。 CloudFormation

引导 AWS 环境,请运行以下命令:

cdk bootstrap aws://<Target_Account_ID>/<Target_Region> --trust <Central_Account_ID> --cloudformation-execution-policies arn:aws:iam::aws:policy/<Least_Privilege_Policy>
AWS DevOps

授予中央 AWS 账户 OIDC 角色对目标 AWS 账户 引导角色的访问权限。

CDK bootstrap 创建了以下 IAM 角色,这些角色旨在由中央在 CDK AWS 账户 部署过程的各个阶段担任:

  • 文件发布角色

  • 映像发布角色

  • 查找角色

  • 部署角色

每个角色都有根据其目的量身定制的特定权限,遵循最低权限原则。每个角色名称Target_Region中的Target_Account_ID和有助于表明这些角色在不同的 AWS 账户 地区中是唯一的。这种方法支持在多账户、多区域设置中进行清晰的识别和管理。

Target Account CDK Bootstrap Roles arn:aws:iam::<Target_Account_ID>:role/cdk-deploy-role-<Target_Account_ID>-<Target_Region> arn:aws:iam::<Target_Account_ID>:role/cdk-file-publishing-role-<Target_Account_ID>-<Target_Region> arn:aws:iam::<Target_Account_ID>:role/cdk-image-publishing-role-<Target_Account_ID>-<Target_Region> arn:aws:iam::<Target_Account_ID>:role/cdk-lookup-role-<Target_Account_ID>-<Target_Region>
  • 更新中央账户中 OIDC 角色的权限策略,使其能够在目标账户中扮演角色。此配置允许跨不同堆栈部署 CDK 堆栈。 AWS 账户通过允许中央账户的 OIDC 角色采用目标账户的必要权限,您可以为跨账户 CDK 部署创建安全桥梁。这种方法可以保持适当的访问控制,同时促进无缝的多账户基础设施管理。

要在中心更新 OIDC 角色的权限策略 AWS 账户,请使用以下代码:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::<Target_Account_ID>:role/cdk-deploy-role-<Target_Account_ID>-<Target_Region>”, “arn:aws:iam::<Target_Account_ID>:role/cdk-file-publishing-role-<Target_Account_ID>-<Target_Region>”, “arn:aws:iam::<Target_Account_ID>:role/cdk-image-publishing-role-<Target_Account_ID>-<Target_Region>”, “arn:aws:iam::<Target_Account_ID>:role/cdk-lookup-role-<Target_Account_ID>-<Target_Region>” ] } ] }
AWS DevOps
Task描述所需技能

克隆项目存储库。

要克隆此模式的GitHub 存储库,请运行以下命令:

git clone https://github.com/aws-samples/aws-cdk-golang-serverless-cicd-github-actions.git
AWS DevOps

前往 Dockerfile 路径。

要导航到 Dockerfile 路径,请运行以下命令:

cd lambda
AWS DevOps

使用亚马逊 ECR 对 Docker 进行身份验证。

Amazon ECR 需要安全访问您的私有容器存储库。通过这种方式登录,您就允许本地计算机或 CI/CD 环境上的 Docker 安全地与 Amazon ECR 进行交互。

要使用 Amazon ECR 对 Docker 进行身份验证,请运行以下命令:

aws ecr get-login-password --region <AWS_REGION> | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.<AWS_REGION>.amazonaws.com

修改占位AWS_Account_IDAWS_REGION和您的信息。

AWS DevOps

构建 Docker 映像。

要构建 Docker 镜像,请运行以下命令:

docker build --platform linux/arm64 -t sample-app .
AWS DevOps

标记并推送 Docker 镜像。

要标记 Docker 镜像并将其推送到 Amazon ECR 存储库,请运行以下命令:

docker tag sample-app:latest <AWS_ACCOUNT_ID>.dkr.ecr.<AWS_REGION>.amazonaws.com/<ECR_REPOSITORY>:<DOCKER_TAG>
docker push <AWS_ACCOUNT_ID>.dkr.ecr.<AWS_REGION>.amazonaws.com/<ECR_REPOSITORY>:<DOCKER_TAG>

使用您的信息修改占位符AWS_Account_IDAWS_REGIONECR_REPOSITORY、、和DOCKER_TAG

AWS DevOps
Task描述所需技能

使用特定于环境的变量合成 CDK 堆栈。

要按照 CDK 代码中的定义为基础架构生成 CloudFormation 模板,请运行以下命令:

ENV=<environment> IMAGETAG=<image_tag> ECR_ARN=<ecr_repo_arn> cdk synth

使用您的信息修改以下占位符:

  • environment— 替换为特定的环境名称dev,例如staging、或prod

  • image_tag— 替换为 Docker 镜像的特定标签,例如v1.0.0latest

  • ecr_repo_arn— 替换为亚马逊 ECR 存储库的亚马逊资源名称 (ARN)。

AWS DevOps

部署 CDK 堆栈。

要将 CDK 堆栈部署到您的 AWS 账户,请运行以下命令。该--require-approval never标志表示 CDK 将自动批准并执行所有更改。这包括 CDK 通常会标记为需要手动审查的更改(例如 IAM 政策变更或资源移除)。在生产环境中使用该--require-approval never标志之前,请确保您的 CDK 代码和 CI/CD 管道经过充分测试且安全。

ENV=<environment> IMAGETAG=<image_tag> ECR_ARN=<ecr_repo_arn> cdk deploy --require-approval never
AWS DevOps
Task描述所需技能

创建功能分支,然后添加您的更改。

使用您之前创建的克隆存储库,创建功能分支,然后将更改添加到应用程序代码中。使用以下命令:

git checkout -b <feature_branch> git add . git commit -m “add your changes” git push origin <feature_branch>

以下是更改的示例:

  • 对 Lambda 函数逻辑的更改

  • 向 Lambda 代码添加新特性或功能

  • 修复错误或优化 Lambda 函数中的现有代码

GitHub 操作将使用可重复使用的工作流程并触发 CI/CD 管道。

AWS DevOps

合并您的更改。

创建拉取请求,并将您的更改合并到 main 中。

AWS DevOps

故障排除

事务解决方案

AccessDenied例如 AWS 账户,跨部署资源时会出错AccessDenied: User not authorized to perform: “sts:AssumeRole"

要帮助解决此问题,请执行以下操作来验证跨账户权限:

  • 确保为跨账户部署准备了必要的 IAM 角色和策略。

  • 检查assume角色权限配置是否正确。

由于版本不匹配而导致的兼容性问题,例如,过时的 CDK 版本undefined: awscdkStack出错。

要帮助解决此问题,请执行以下操作以验证您使用的是 AWS CDK 和 Go 的必需版本:

  • 确保你使用的是 AWS CDK 和 Go 的兼容版本。

  • 检查最新版本中是否存在任何已知问题或重大更改。

例如,由Error: No such file or directory于 YAML 配置不正确或受保护分支导致的 CI/CD 管道故障Permission denied

为了帮助解决 GitHub 操作配置问题,请验证是否正确引用和配置了可重复使用的工作流程。

相关资源

AWS 资源

其他资源