AWS Proton 如何预置基础设施 - AWS Proton

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

AWS Proton 如何预置基础设施

AWS Proton 可以通过以下几种方法之一预置基础设施:

  • AWS 托管式预置 - AWS Proton 代表您调用预置引擎。该方法仅支持 AWS CloudFormation 模板捆绑包。有关更多信息,请参阅AWS CloudFormation IaC 文件

  • CodeBuild 预置 - AWS Proton 使用 AWS CodeBuild 运行您提供的 Shell 命令。您的命令可以读取 AWS Proton 提供的输入,并负责预置或取消预置基础设施和生成输出值。该方法的模板捆绑包包括清单文件中的命令,以及这些命令可能需要的任何程序、脚本或其他文件。

    作为一个使用 CodeBuild 预置的示例,您可以包含使用 AWS Cloud Development Kit (AWS CDK) 预置 AWS 资源的代码,以及安装 CDK 和运行 CDK 代码的清单。

    有关更多信息,请参阅CodeBuild 配置模板包

    注意

    您可以将 CodeBuild 预置与环境和服务一起使用。目前,您无法通过这种方法预置组件。

  • 自托管式预置 - AWS Proton 向您提供的存储库发出拉取请求 (PR),您自己的基础设施部署系统在其中运行预置过程。该方法仅支持 Terraform 模板捆绑包。有关更多信息,请参阅Terraform IaC 文件

AWS Proton 单独确定和设置每个环境和服务的预置方法。在您创建或更新环境或服务时,AWS Proton 检查您提供的模板捆绑包,并确定模板捆绑包指示的预置方法。在环境级别,您提供环境及其潜在服务的预置方法可能需要的参数 - AWS Identity and Access Management (IAM) 角色、环境账户连接或基础设施存储库。

无论预置方法如何,使用 AWS Proton 预置服务的开发人员都会获得相同的体验。开发人员不需要了解预置方法,也不需要在服务预置过程中更改任何内容。服务模板设置预置方法,开发人员部署服务的每个环境提供服务实例预置所需的参数。

下图简要说明了不同预置方法的一些主要特征。表后面的部分提供了有关每种方法的详细信息。

预置方法 模板 预置者 状态跟踪者

AWS 托管式

清单、架构、IaC 文件 (CloudFormation)

AWS Proton(通过 CloudFormation)

AWS Proton(通过 CloudFormation)

CodeBuild

清单(包含命令)、架构、命令依赖项(例如 AWS CDK 代码)

AWS Proton(通过 CodeBuild)

AWS Proton(您的命令通过 CodeBuild 返回状态)

自行管理

清单、架构、IaC 文件 (Terraform)

您的代码(通过 Git 操作)

您的代码(通过 API 调用传递给 AWS)

AWS 托管式预置的工作方式

在环境或服务使用 AWS 托管式预置时,基础设施按以下方式进行预置:

  1. AWS Proton 客户(管理员或开发人员)创建 AWS Proton 资源(环境或服务)。客户为资源选择模板,并提供所需的参数。有关更多信息,请参阅AWS 托管式预置的注意事项一节。

  2. AWS Proton 渲染完整的 AWS CloudFormation 模板以预置资源。

  3. AWS Proton 调用 AWS CloudFormation 以使用渲染的模板开始预置。

  4. AWS Proton 持续监控 AWS CloudFormation 部署。

  5. 在预置完成时,AWS Proton 在失败时报告错误,并在成功时捕获预置输出,例如 Amazon VPC ID。

下图显示 AWS Proton 直接处理其中的大多数步骤。

该图说明了 AWS Proton 中的 AWS 托管式预置

AWS 托管式预置的注意事项

  • 基础设施预置角色 - 在环境或其中运行的任何服务实例可能使用 AWS 托管式预置时,管理员需要配置一个 IAM 角色(直接配置或作为 AWS Proton 环境账户连接的一部分)。AWS Proton 使用该角色预置这些 AWS 托管式预置资源的基础设施。该角色应有权使用 AWS CloudFormation 创建这些资源的模板包含的所有资源。

    有关更多信息,请参阅 IAM 角色AWS Proton IAM服务角色策略示例

  • 服务预置 - 在开发人员将使用 AWS 托管式预置的服务实例部署到环境时,AWS Proton 使用为该环境提供的角色预置服务实例的基础设施。开发人员看不到该角色,也无法更改该角色。

  • 具有管道的服务 - 使用 AWS 托管式预置的服务模板可能包含以 AWS CloudFormation YAML 架构编写的管道定义。AWS Proton 还可以调用 AWS CloudFormation 以创建管道。AWS Proton 用于创建管道的角色与每个单独环境的角色是分开的。该角色单独提供给 AWS Proton,仅在 AWS 账户级别提供一次,用于预置和管理所有 AWS 托管的管道。该角色应有权创建管道以及管道所需的其他资源。

    以下过程说明了如何向 AWS Proton 提供管道角色。

    AWS Proton console
    提供管道角色
    1. AWS Proton 控制台的导航窗格中,选择设置 > 账户设置,然后选择配置

    2. 使用管道 AWS 托管式角色部分为 AWS 托管式预置配置新的或现有的管道角色。

    AWS Proton API
    提供管道角色
    1. 使用 UpdateAccountSettings API 操作。

    2. pipelineServiceRoleArn 参数中提供您的管道服务角色的 Amazon 资源名称 (ARN)。

    AWS CLI

    提供管道角色

    运行以下命令:

    $ aws proton update-account-settings \ --pipeline-service-role-arn \ "arn:aws:iam::123456789012:role/my-pipeline-role"

CodeBuild 预置的工作方式

在环境或服务使用 CodeBuild 预置时,基础设施按以下方式进行预置:

  1. AWS Proton 客户(管理员或开发人员)创建 AWS Proton 资源(环境或服务)。客户为资源选择模板,并提供所需的参数。有关更多信息,请参阅CodeBuild 预置注意事项一节。

  2. AWS Proton 使用输入参数值渲染输入文件以预置资源。

  3. AWS Proton 调用 CodeBuild 以启动一个作业。CodeBuild 作业运行模板中指定的客户 Shell 命令。这些命令预置所需的基础设施,同时可以选择读取输入值。

  4. 在预置完成时,最终客户命令将预置状态返回到 CodeBuild,并调用 NotifyResourceDeploymentStatusChange AWS Proton API 操作以提供输出,例如 Amazon VPC ID(如果存在)。

    重要

    确保您的命令正确将预置状态返回到 CodeBuild 并提供输出。否则,AWS Proton 无法正确跟踪预置状态,也无法向服务实例提供正确的输出。

下图说明了 AWS Proton 执行的步骤以及您的命令在 CodeBuild 作业中执行的步骤。

该图说明了 AWS Proton 中的基于 CodeBuild 的预置

CodeBuild 预置注意事项

  • 基础设施预置角色 - 在环境或其中运行的任何服务实例可能使用基于 CodeBuild 的预置时,管理员需要配置一个 IAM 角色(直接配置或作为 AWS Proton 环境账户连接的一部分)。AWS Proton 使用该角色预置这些 CodeBuild 预置资源的基础设施。该角色应有权使用 CodeBuild 创建这些资源的模板中的命令预置的所有资源。

    有关更多信息,请参阅 IAM 角色AWS Proton IAM服务角色策略示例

  • 服务预置 - 在开发人员将使用 CodeBuild 预置的服务实例部署到环境时,AWS Proton 使用为该环境提供的角色预置服务实例的基础设施。开发人员看不到该角色,也无法更改该角色。

  • 具有管道的服务 - 使用 CodeBuild 预置的服务模板可能包含预置管道的命令。AWS Proton 还可以调用 CodeBuild 以创建管道。AWS Proton 用于创建管道的角色与每个单独环境的角色是分开的。该角色单独提供给 AWS Proton,仅在 AWS 账户级别提供一次,用于预置和管理所有基于 CodeBuild 的管道。该角色应有权创建管道以及管道所需的其他资源。

    以下过程说明了如何向 AWS Proton 提供管道角色。

    AWS Proton console
    提供管道角色
    1. AWS Proton 控制台的导航窗格中,选择设置 > 账户设置,然后选择配置

    2. 使用 CodeBuild 管道预置角色部分为 CodeBuild 预置配置新的或现有的管道角色。

    AWS Proton API
    提供管道角色
    1. 使用 UpdateAccountSettings API 操作。

    2. pipelineCodebuildRoleArn 参数中提供您的管道服务角色的 Amazon 资源名称 (ARN)。

    AWS CLI

    提供管道角色

    运行以下命令:

    $ aws proton update-account-settings \ --pipeline-codebuild-role-arn \ "arn:aws:iam::123456789012:role/my-pipeline-role"

自托管式预置的工作方式

在环境或服务配置为使用自托管式预置时,基础设施按以下方式进行预置:

  1. AWS Proton 客户(管理员或开发人员)创建 AWS Proton 资源(环境或服务)。客户为资源选择模板,并提供所需的参数。对于环境,客户还会提供链接的基础设施存储库。有关更多信息,请参阅自托管式预置的注意事项一节。

  2. AWS Proton 渲染完整的 Terraform 模板。它由一个或多个 Terraform 文件(可能位于多个文件夹中)和一个 .tfvars 变量文件组成。AWS Proton 将资源创建调用中提供的参数值写入到该变量文件。

  3. AWS Proton 使用渲染的 Terraform 模板向基础设施存储库提交 PR。

  4. 在客户(管理员或开发人员)合并 PR 时,客户的自动化代码触发预置引擎,以使用合并的模板开始预置基础设施。

    注意

    如果客户(管理员或开发人员)关闭 PR,则 AWS Proton 将 PR 识别为已关闭并将部署标记为已取消。

  5. 在预置完成时,客户的自动化代码调用 NotifyResourceDeploymentStatusChange AWS Proton API 操作以指示完成,提供状态(成功或失败)并提供输出,例如 Amazon VPC ID(如果存在)。

    重要

    确保您的自动化代码回调 AWS Proton 并提供预置状态和输出。否则,AWS Proton 将预置视为待处理的时间可能比应有的时间长,并继续显示进行中状态。

下图说明了 AWS Proton 执行的步骤以及您自己的预置系统执行的步骤。

该图说明了 AWS Proton 中的自托管式预置

自托管式预置的注意事项

  • 基础设施存储库 - 在管理员为环境配置自托管式预置时,他们需要提供链接的基础设施存储库。AWS Proton 向该存储库提交 PR,以预置环境的基础设施以及部署到环境中的所有服务实例。存储库中的客户拥有的自动化操作应担任一个 IAM 角色,该角色有权创建您的环境和服务模板包含的所有资源并具有反映目标 AWS 账户的身份。有关担任角色的示例 GitHub 操作,请参阅 "Configure AWS Credentials" Action For GitHub Actions 文档中的 Assuming a Role

  • 权限 - 您的预置代码必须根据需要对账户进行身份验证(例如,对 AWS 账户进行身份验证),并提供资源预置授权(例如,提供一个角色)。

  • 服务预置 - 在开发人员将使用自托管式预置的服务实例部署到环境时,AWS Proton 向与环境关联的存储库提交 PR 以预置服务实例的基础设施。开发人员看不到存储库,也无法更改存储库。

    注意

    无论预置方法如何,创建服务的开发人员使用相同的过程,并对它们的差异进行抽象处理。不过,对于自托管式预置,开发人员可能会遇到响应速度较慢的情况,因为他们需要等待某人(可能不是他们自己)将 PR 合并到基础设施存储库中,然后才能开始预置。

  • 具有管道的服务 - 具有自托管式预置的环境的服务模板可能包含使用 Terraform HCL 编写的管道定义(例如 AWS CodePipeline 管道)。要使 AWS Proton 能够预置这些管道,管理员向 AWS Proton 提供一个链接的管道存储库。在预置管道时,存储库中的客户拥有的自动化操作应担任一个 IAM 角色,该角色有权预置管道并具有反映目标 AWS 账户的身份。管道存储库和角色与用于每个单独环境的存储库和角色是分开的。链接的存储库单独提供给 AWS Proton,仅在 AWS 账户级别提供一次,用于预置和管理所有管道。该角色应有权创建管道以及管道所需的其他资源。

    以下过程说明了如何向 AWS Proton 提供管道存储库和角色。

    AWS Proton console
    提供管道角色
    1. AWS Proton 控制台的导航窗格中,选择设置 > 账户设置,然后选择配置

    2. 使用 CI/CD 管道存储库部分配置新的或现有的存储库链接。

    AWS Proton API
    提供管道角色
    1. 使用 UpdateAccountSettings API 操作。

    2. pipelineProvisioningRepository 参数中提供管道存储库的提供商、名称和分支。

    AWS CLI

    提供管道角色

    运行以下命令:

    $ aws proton update-account-settings \ --pipeline-provisioning-repository \ "provider=GITHUB,name=my-pipeline-repo-name,branch=my-branch"
  • 删除自托管式预置资源 - 除了资源定义以外,Terraform 模块可能还包含 Terraform 操作所需的配置元素。因此,AWS Proton 不能删除环境或服务实例的所有 Terraform 文件。相反,AWS Proton 将文件标记为删除,并在 PR 元数据中更新一个标记。您的自动化代码可以读取该标记,并使用它触发 Terraform 销毁命令。