

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

# 使用 AWS CodePipeline 和 Amazon Bedrock 将 AWS Organizations 政策作为代码进行管理
<a name="manage-organizations-policies-as-code"></a>

*Andre Cavalcante 和 Mariana Pessoa de Queiroz，Amazon Web Services*

## Summary
<a name="manage-organizations-policies-as-code-summary"></a>

您可以使用中的*授权策略* AWS Organizations 来集中配置和管理成员账户中委托人和资源的访问权限。[服务控制策略 (SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 定义组织中 AWS Identity and Access Management (IAM) 角色和用户的最大可用权限。[资源控制策略 (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) 定义组织中资源可用的最大权限。

此模式可帮助您管理通过持续集成 SCPs 和 RCPs 持续部署 (CI/CD) 管道部署的基础架构即代码 (IaC)。通过使用 AWS CloudFormation 或 Hashicorp Terraform 来管理这些策略，您可以减轻与构建和维护多个授权策略相关的负担。

此模式包括下列功能：
+ 您可以使用*清单文件*（`scp-management.json` 和 `rcp-management.json`）创建、删除和更新授权策略。
+ 您使用的是护栏，而不是政策。可以在清单文件中定义护栏及其目标。
+ 该管道使用 AWS CodeBuild 和 AWS CodePipeline，合并并优化了清单文件中的护栏。对于清单文件中的每个语句，管道会将护栏组合成单个 SCP 或 RCP，然后将其应用于定义的目标。
+ AWS Organizations 将策略应用于您的目标。*目标*可以是 AWS 账户、组织单位 (OU)、环境（这是一组帐户或 OUs 您在`environments.json`文件中定义的帐户）或一组共享[AWS 标签](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/what-are-tags.html)的帐户。
+ Amazon Bedrock 将读取管道日志并汇总所有政策变更。
+ 管道要求人工审批。审批者可以查看 Amazon Bedrock 准备的执行摘要，这有助于他们了解变更。

## 先决条件和限制
<a name="manage-organizations-policies-as-code-prereqs"></a>

**先决条件**
+  AWS 账户 在中作为一个组织进行管理的多个项目 AWS Organizations。有关更多信息，请参阅[创建组织](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_create.html)。
+ SCP 和 RCP 功能已在中启用。 AWS Organizations有关更多信息，请参阅[启用策略类型](https://docs.aws.amazon.com/organizations/latest/userguide/enable-policy-type.html)。
+ [已安装](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) Terraform 版本 1.9.8 或更高版本。
+ 如果您不是通过 Terraform 管道部署此解决方案，则必须将 Terraform 状态文件存储[在](https://developer.hashicorp.com/terraform/language/backend/s3)部署策略管理管道的亚马逊简单存储服务 (Amazon S3) 存储桶 AWS 账户 中。
+ [已安装](https://www.python.org/downloads/) Python 3.13.3 或更高版本

**限制**
+ 您不能使用此模式来管理 SCPs 或 RCPs 在此 CI/CD 管道之外创建的内容。但是，可以通过管道重新创建现有策略。有关更多信息，请参阅此模式[其他信息](#manage-organizations-policies-as-code-additional)部分的*将现有策略迁移到管道*。
+ 每个账户中的账户数量和策略受[配额和服务限制](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html)的约束 AWS Organizations。 OUs
+ 此模式不能用于在中配置[管理策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_management_policies.html) AWS Organizations，例如备份策略、标签策略、聊天应用程序策略或声明性策略。

## 架构
<a name="manage-organizations-policies-as-code-architecture"></a>

下图所示为策略管理管道及其关联资源的工作流。

![\[发布 SCPs 并 RCPs 通过策略管理管道。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/372a1ace-5b2e-4f93-9f88-b5b0519ded48/images/a2cceb99-2b93-48e0-b072-bc61a572201f.png)


下图显示了如下工作流：

1. 用户提交对远程存储库主分支中的 `scp-management.json` 或 `rcp-management.json` 清单文件所做的更改。

1. 对`main`分支的更改会启动管道。 AWS CodePipeline

1. CodePipeline 启动`Validate-Plan` CodeBuild 项目。此项目使用远程存储库中的 Python 脚本验证策略和策略清单文件。该 CodeBuild 项目执行以下操作：

   1. 检查 SCP 和 RCP 清单文件是否包含唯一语句 IDs () `Sid`。

   1. 使用 `scp-policy-processor/main.py` 和 `rcp-policy-processor/main.py` Python 脚本将护栏文件夹中的护栏串联起来，形成单一的 RCP 或 SCP 策略。它会将具有相同 `Resource`、`Action` 和 `Condition` 的护栏相结合。

   1.  AWS Identity and Access Management Access Analyzer 用于验证经过优化的最终策略。如有任何发现，管道会停止。

   1. 创建 Terraform 用于创建资源的 `scps.json` 和 `rcps.json` 文件。

   1. 运行将创建 Terraform 执行计划的 `terraform plan` 命令。

1. （可选）该`Validate-Plan` CodeBuild 项目使用`bedrock-prompt/prompt.py`脚本向 Amazon Bedrock 发送提示。您可以在 `bedrock-prompt/prompt.txt` 文件中定义提示。Amazon Bedrock 使用 Anthropic Claude Sonnet 3.5，通过分析 Terraform 和 Python 日志来生成拟议变更的摘要。

1. CodePipeline 使用亚马逊简单通知服务 (Amazon SNS) Service 主题来通知批准者必须对更改进行审查。如果 Amazon Bedrock 生成变更摘要，则通知中将包含此摘要。

1. 策略批准者在中批准该操作。 CodePipeline如果 Amazon Bedrock 生成了变更摘要，则批准者可以在批准 CodePipeline 之前查看该摘要。

1. CodePipeline 启动`Apply` CodeBuild 项目。该项目使用 Terraform 来应用 RCP 和 SCP 的更改。 AWS Organizations

与此架构关联的 IaC 模板还部署了以下支持策略管理管道的资源：
+ 用于存储 CodePipeline 项目和脚本的 Amazon S3 存储桶，例如`scp-policy-processor/main.py`和 `bedrock-prompt/prompt.py`
+ 用于加密此解决方案创建的资源的 AWS Key Management Service (AWS KMS) 密钥

## 工具
<a name="manage-organizations-policies-as-code-tools"></a>

**AWS 服务**
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 是完全托管式人工智能服务，通过统一的 API 提供多种高性能基础模型供您使用。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 是一项完全托管式构建服务，可编译源代码、运行单元测试和生成部署就绪的构件。 
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 可帮助您快速对软件发布过程的不同阶段进行建模和配置，并自动执行持续发布软件变更所需步骤。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)是一项账户管理服务，可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。
+ [适用于 Python (Boto3) 的 AWS SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)是一个软件开发套件，可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他工具**
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一款 IaC 工具，可帮助您使用代码来配置和管理云基础架构和资源。

**代码存储库**

此模式的代码可在[organizations-policy-pipeline](https://github.com/aws-samples/organizations-policy-pipeline) GitHub 存储库中找到。以下是 `sample-repository` 文件夹中包含的关键文件：
+ 在 `environments` 文件夹中，`environments.json` 包含环境列表。*环境*是一组目标，它们可以包含 AWS 账户 IDs 或组织单位 (OUs)。
+ 在 `rcp-management` 文件夹中：
  + 该`guardrails`文件夹包含您的个人护栏 RCPs
  + 该`policies`文件夹包含个人 RCPs
  + `rcp-management.json`清单文件可帮助您管理 RCP 护栏（已满）及其 RCPs相关目标。
+ 在 `scp-management` 文件夹中：
  + 该`guardrails`文件夹包含您的个人护栏 SCPs
  + 该`policies`文件夹包含个人 SCPs
  + `scp-management.json`清单文件可帮助您管理 SCP 护栏（已满）及其 SCPs相关目标。
+ 该`utils`文件夹包含脚本，可以帮助您迁移当前脚本 SCPs ， RCPs 以便您可以通过管道对其进行管理。有关更多信息，请参阅此模式的[其他信息](#manage-organizations-policies-as-code-additional)部分。

## 最佳实践
<a name="manage-organizations-policies-as-code-best-practices"></a>
+ 在设置管道之前，我们建议您确认自己尚未达到 AWS Organizations [配额](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_reference_limits.html)限制。
+ 我们建议您仅将 AWS Organizations 管理账户用于必须在该账户中执行的任务。有关详细信息，请参阅[管理账户的最佳实践](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_best-practices_mgmt-acct.html#bp_mgmt-acct_use-mgmt)。

## 操作说明
<a name="manage-organizations-policies-as-code-epics"></a>

### 设置目标账户
<a name="set-up-the-target-account"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建存储库。 | 创建一个存储库，供您的安全运营团队管理策略。使用 AWS CodeConnections [支持的](https://docs.aws.amazon.com/dtconsole/latest/userguide/supported-versions-connections.html)第三方存储库提供商之一。 | DevOps 工程师 | 
| 委派策略管理。 | 将 AWS Organizations 策略的管理委托给您部署管道的成员账户。有关说明，请参阅[使用创建基于资源的委托策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs-policy-delegate.html)。 AWS Organizations有关策略示例，请参阅此模式[其他信息](#manage-organizations-policies-as-code-additional)部分的*基于资源的委托策略示例*。 | AWS 管理员 | 
| （可选）启用基础模型。 | 如果您想生成政策变更摘要，请在部署管道的 Amazon Bedrock 中启用对 Anthropic Claude 3.5 Sonnet 基础模型 AWS 账户 的访问权限。有关说明，请参阅[添加或移除对 Amazon Bedrock 基础模型的访问权限](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html)。 | 常规 AWS | 

### 部署管道资源
<a name="deploy-the-resources-for-the-pipeline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 输入以下命令以从中克隆[organizations-policy-pipeline ](https://github.com/aws-samples/organizations-policy-pipeline)存储库 GitHub：`git clone https://github.com/aws-samples/organizations-policy-pipeline.git` | DevOps 工程师 | 
| 定义您的部署方法。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps 工程师 | 
| 部署管道。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps 工程师，Terraform | 
| 连接远程存储库。 | 在上一步中，Terraform 创建了与第三方 CodeConnections 存储库的连接。在 [AWS 开发人员工具控制台](https://console.aws.amazon.com/codesuite/settings/connections)中，将连接状态从 `PENDING` 改为 `AVAILABLE`。有关说明，请参阅[更新待处理的连接](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-update.html)。 | AWS DevOps | 
| 订阅 Amazon SNS 主题。 | Terraform 创建了一个 Amazon SNS 主题。为端点订阅主题并确认订阅，以便审批者收到有关管道中存在待审批操作的通知。有关说明，请参阅[创建对 Amazon SNS 主题的订阅](https://docs.aws.amazon.com/sns/latest/dg/sns-create-subscribe-endpoint-to-topic.html)。 | 常规 AWS | 

### 定义护栏和政策
<a name="define-your-guardrails-and-policies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 填充远程存储库。 | 从克隆的存储库中，将 `sample-repository` 文件夹的内容复制到您的远程存储库。这包括 `environments`、`rcp-management`、`scp-management` 和 `utils` 文件夹。 | DevOps 工程师 | 
| 定义您的环境。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps 工程师 | 
| 定义护栏。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps 工程师 | 
| 定义政策。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps 工程师 | 

### 使用清单文件来管理策略
<a name="use-the-manifest-file-to-manage-the-policies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置清单文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | DevOps 工程师 | 
| 启动管道。 | 提交更改并将其推送到您在 `variables.tf` 文件中定义的远程存储库的分支。通常，这是 `main` 分支。 CI/CD 管道会自动启动。如有任何管道错误，请参阅此模式的[问题排查](#manage-organizations-policies-as-code-troubleshooting)部分。 | DevOps 工程师 | 
| 审批更改。 | `Validate-Plan` CodeBuild 项目完成后，策略批准者会通过您之前配置的 Amazon SNS 主题收到通知。执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | AWS 总负责人、策略审批者 | 
| 验证部署。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | 常规 AWS | 

## 问题排查
<a name="manage-organizations-policies-as-code-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 管道 `Validate-Plan` 阶段出现清单文件错误 | 如果 `scp-management.json` 或 `rcp-management.json` 文件中出现任何错误，管道输出中会出现“清单文件在验证与计划阶段出现管道错误”的消息。可能的错误包括环境名称不正确、字段或值重复 SIDs或无效。执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | 
| IAM Access Analyzer 在管道的 `Validate-Plan` 阶段有发现 | 如果护栏或策略定义中存在任何错误，管道输出中会出现“验证与计划阶段 IAM Access Analyzer 中的发现”的消息。此模式使用 IAM Access Analyzer 验证最终策略。执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/manage-organizations-policies-as-code.html) | 

## 相关资源
<a name="manage-organizations-policies-as-code-resources"></a>
+ [JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)（IAM 文档）
+ [资源控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)（AWS Organizations 文档）
+ [服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)（AWS Organizations 文档）
+ [添加或移除对 Amazon Bedrock 基础模型的访问权限](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access-modify.html)（Amazon Bedrock 文档）
+ [批准或拒绝 CodePipeline（CodePipeline 文档）中的批准操作](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals-approve-or-reject.html)

## 附加信息
<a name="manage-organizations-policies-as-code-additional"></a>

**基于资源的委派策略示例**

以下是基于资源的授权策略示例。 AWS Organizations它允许委派的管理员账户 RCPs 为组织 SCPs 管理和管理。在以下示例策略中，请将 `<MEMBER_ACCOUNT_ID>` 替换为您部署策略管理管道的账户的 ID。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DelegationToAudit",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<MEMBER_ACCOUNT_ID>:root"
      },
      "Action": [
        "organizations:ListTargetsForPolicy",
        "organizations:CreatePolicy",
        "organizations:DeletePolicy",
        "organizations:AttachPolicy",
        "organizations:DetachPolicy",
        "organizations:DisablePolicyType",
        "organizations:EnablePolicyType",
        "organizations:UpdatePolicy",
        "organizations:DescribeEffectivePolicy",
        "organizations:DescribePolicy",
        "organizations:DescribeResourcePolicy"
      ],
      "Resource": "*"
    }
  ]
}
```

**将现有策略迁移至管道**

如果您已有 SCPs 或 RCPs 想要通过此管道进行迁移和管理，则可以使用代码仓库`sample-repository/utils`文件夹中的 Python 脚本。这些脚本包括：
+ `check-if-scp-exists-in-env.py` – 此脚本检查指定策略是否适用于您在 `environments.json` 文件中定义的特定环境中的任何目标。输入以下命令运行此脚本：

  ```
  python3 check-if-scp-exists-in-env.py \
     --policy-type <POLICY_TYPE> \
     --policy-name <POLICY_NAME> \
     --env-id <ENV_ID>
  ```

  在此命令中替换以下内容：
  + `<POLICY_TYPE>` 为 `scp` 或者 `rcp`
  + `<POLICY_NAME>` 是 SCP 或 RCP 的名称
  + `<ENV_ID>` 是您在 `environments.json` 文件中定义的环境的 ID
+ `create-environments.py`— 此脚本根据当前环境 SCPs 和 RCPs 您的环境创建一个 environments.json 文件。它不包括通过部署的策略 AWS Control Tower。输入以下命令运行此脚本，其中 `<POLICY_TYPE>` 为 `scp` 或 `rcp`：

  ```
  python create-environments.py --policy-type <POLICY_TYPE>
  ```
+ `verify-policies-capacity.py`— 此脚本会检查您定义的每个环境，以确定每个 AWS Organizations 与策略相关的配额还剩多少容量。可以在 `environments.json` 文件中定义要检查的环境。输入以下命令运行此脚本，其中 `<POLICY_TYPE>` 为 `scp` 或 `rcp`：

  ```
  python verify-policies-capacity.py --policy-type <POLICY_TYPE>
  ```