

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

# 企业蓝图工厂组件
<a name="architecture-components"></a>

企业蓝图工厂由以下组件组成：
+ [产品存储库](#architecture-product-repo)-用于存储蓝图的存储库。
+ [配置存储库](#architecture-config-repo)-存储库，用于存储用于定义您的产品 AWS Service Catalog 组合和产品的配置文件。
+ [配置文件](#architecture-config-file)-用于定义哪些蓝图可用、谁可以使用蓝图以及如何使用蓝图的配置文件。
+ [配置管道](#architecture-config-pipeline) — 一种 DevOps CI/CD 管道，用于设置 Service Catalog 产品组合和产品组合份额，并为每个产品创建发布管道。
+ [发布管道](#architecture-release-pipeline) — 将蓝图作为 Service Catalog 产品发布的 DevOps CI/CD 管道。 

云基础架构团队通常管理整个企业蓝图工厂，因为他们必须批准每个蓝图。但是， DevOps 代码团队通常负责配置管道和发布管道。为了发布新的蓝图，开发人员只能与产品存储库、配置存储库和配置文件进行交互。

## 产品存储库
<a name="architecture-product-repo"></a>

产品存储库是您存储组织批准的蓝图的集中位置。 蓝图管理团队和安全团队会审查对该存储库的拉取请求，以确保每个蓝图都符合组织和安全要求。在本指南中，我们使用 GitHub 存储库，但你可以使用其他方法。

## 配置存储库
<a name="architecture-config-repo"></a>

配置存储库（配置存储库）是您的组织存储通过企业蓝图工厂发布的 Service Catalog 产品组合和产品的配置文件的位置。在本指南中，我们使用 GitHub 存储库，但你可以使用其他方法。

## 配置文件
<a name="architecture-config-file"></a>

企业蓝图工厂配置文件（配置文件）存储在配置存储库中，该存储库归蓝图管理团队所有。这个文件的名字是 **bp** \_config.yml。当开发者更新此文件时，蓝图管理团队会审查所做的更改。将更改合并到主分支会启动配置管道。配置文件协调通过企业蓝图工厂管理的所有蓝图的发布、共享和分发。

配置文件是一个 YAML 文件，由两个主要对象组成：`portfolios`和。`products`以下是示例配置文件示例：

```
portfolios:  
  - portfolio_name: blueprint-portfolio
    owner: Blueprint-team
    provider_name: AWS
    description: "Blueprint portfolio"
    portfolio_access_role:
       - arn:aws:iam::123456789012:role/examplerole
       - arn:aws:iam::123456789012:user/exampleuser
    share_to_ou:
     - org_id: "o-exampleOrgID"
    stack_tags:
      DataClassification: Confidential
      Organization: AWS
products:
  - name: BP-S3-Product
    description: "Blueprint for BP-S3 product"
    product_config_file: 'BP-S3/product_config.json'
    owner: Blueprint-team
    stack_tags:
      DataClassification: Confidential
      Organization: AWS
    portfolio_associations:
      - blueprint-portfolio
    launch_constraint_role: arn:aws:iam::123456789012:role/examplelaunchrole
```

在`portfolios`对象中，您可以定义您的目标 Service Catalog 产品组合。对于每个投资组合，您需要提供以下属性：
+ `portfolio_name`是投资组合的名称。此属性是必需的。
+ `owner`是拥有投资组合的团队的名称。此属性是可选的。
+ `provider_name`是管理投资组合的团队或组织的名称。默认值为 `AWS`。此属性是必需的。
+ `description`是对投资组合的简要描述。此属性是可选的。
+ `portfolio_access_roles`是允许访问产品组合及其关联产品的 AWS Identity and Access Management (IAM) [身份](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)（用户、角色或群组）。此属性是可选的。
+ `share_to_ou`是与之共享产品组合 AWS Organizations 的[组织单位](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_ous.html) (OU)。最终用户可以在目标组织单位的成员 AWS 账户 中部署此产品组合的产品。此属性是可选的。
+ `stack_tags`是应用于投资组合的[标签](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html)。此属性是可选的。

在`products`对象中，您可以在 Service Catalog 中定义要作为产品发布的每个蓝图。您为每件商品提供以下属性：
+ `name`是 Service Catalog 中产品的名称。此属性是必需的。
+ `description`是对产品的简要描述。此属性是必需的。
+ `product_config_file`是存储在产品存储库中的蓝图产品配置文件的名称。此属性是必需的。
+ `owner`是拥有该产品的团队的名称。此属性是必需的。
+ `stack_tags`是应用于产品的标签。此属性是可选的。
+ `portfolio_associations`是包含该产品的目标产品组合。此属性是可选的。
**注意**  
我们建议您仅将产品添加到通过企业蓝图工厂管理的产品组合中。如果您要将产品添加到不通过企业蓝图工厂管理的产品组合中，则用户的 IAM 策略必须允许该[AssociateProductWithPortfolio](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_AssociateProductWithPortfolio.html)操作。但是，作为安全最佳实践，我们建议您仅允许企业蓝图工厂配置管道执行此操作。
+ `launch_constraint_role`是 Service Catalog 在最终用户启动产品时扮演的启动[角色](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/constraints-launch.html)。此属性是必需的。

## 配置管道
<a name="architecture-config-pipeline"></a>

配置管道（配置管道）可自动配置 Service Catalog 产品组合和投资组合份额。它还为每种产品创建发布渠道。该管道是一种[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)资源。对配置文件的更新会调用配置管道。

首次调用配置管道时，它会创建两个未在配置文件中定义的额外投资组合：
+ `Blueprint-portfolio`— 您通过企业蓝图工厂部署的每个产品都将添加到此产品组合中。此产品组合可供您在配置文件中指定的 IAM 委托人和组织单位使用。
+ `Bootstrapping-Admin-Portfolio`— 该`Bootstrapping-Admin-Product`产品与该产品组合相关联。该产品是发布渠道的 CloudFormation 模板。仅允许蓝图管理团队访问此产品组合，以便他们可以管理管理产品。

**配置管道阶段**

下图显示了配置管道中的各个阶段以及管道与之交互的资源。流程中的每个阶段都是一个[AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)项目。



![企业蓝图工厂配置管道中的阶段。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/enterprise-blueprint-factory/images/configuration-pipeline-stages.png)


以下是配置管道的各个阶段：

1. **部署产品组合**-配置管道部署已添加到配置文件中的所有产品组合，或删除已从配置文件中删除的所有产品组合。如果投资组合没有变化，则流程将跳过此阶段。

1. **共享投资组合**-配置管道与目标组织单位 (OU) 共享投资组合。如果投资组合份额没有变化，则此阶段将跳过管道。

1. **部署 Blueprint-Admin-Bootstrapping-Product** — 配置管道从存储库中获取`bp-pipeline`****蓝图并将其部署到 S `ServiceCatalog-CodeRepo` ervice Catalog 中。`Bootstrapping-Admin-Product` ****此产品是用于创建发布管道的 CloudFormation 模板。将此模板部署****为 Service Catalog 产品有助于维护版本控制。如果`bp-pipeline`****蓝图没有更改，则管道将跳过此阶段。

1. **创建发布管道** — 根据配置文件中的产品属性，配置管道准备堆栈参数并启动为产品创建发布管道的 CloudFormation 堆栈。 有关更多信息，请参阅本指南中的[发布管道](#architecture-release-pipeline)。

1. **部署产品**-发布管道将蓝图部署为 Service Catalog 产品，并将其与目标产品组合相关联。作为目标 OU 成员的最终用户现在可以在中 AWS 账户 部署产品。

## 发布管道
<a name="architecture-release-pipeline"></a>

发布管道可自动将蓝图作为 Service Catalog 产品发布。该管道是一种[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)资源。当您的组织想要发布新蓝图时，开发人员会将 IaC 模板及其产品配置文件上传到产品存储库。将产品详细信息添加到配置文件会触发配置管道。配置管道为该蓝图创建发布管道。对蓝图的任何后续更新都会触发此发布管道，使用新版本更新 Service Catalog 中的产品。

发布渠道包括主动控制措施，可自动对蓝图进行安全性和合规性检查。*主动控制*旨在防止创建不合规的资源。这些控制措施可以减少其他类型的安全控制措施所处理的安全事件的数量，例如响应式控制和侦测控制。由于主动控制可确保部署的资源在部署之前合规，因此不会出现需要响应或补救的检测事件。

首次调用配置管道时，它会创建一个名为的 Service Catalog 产品`Bootstrapping-Admin-Product`。该产品是发布渠道的 CloudFormation模板。如下图所示，配置管道使用`Bootstrapping-Admin-Product`产品为每个新蓝图创建专用的发布管道。蓝图和发布管道之间存在一对一的关系。



![配置管道使用产品为每个蓝图创建发布管道。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/enterprise-blueprint-factory/images/blueprint-pipeline-ratio.png)


**发布管道阶段**

下图显示了发布管道中的默认阶段以及管道与之交互的资源。流程中的每个阶段都是一个 CodeBuild 项目。



![企业蓝图工厂发布管道中的各个阶段。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/enterprise-blueprint-factory/images/release-pipeline-stages.png)


以下是发布流程的各个阶段：

1. **文件对齐**-此阶段验证蓝图是 CloudFormation [模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-overview.html#cfn-concepts-templates)还是 AWS Cloud Development Kit (AWS CDK) [构造](https://docs.aws.amazon.com/cdk/v2/guide/constructs.html)。如果蓝图是一个 AWS CDK 构造，则此阶段会将 AWS CDK 构造合成一个 CloudFormation 模板。此过程通过实现部署的自动化和标准化。 CloudFormation如果发现任何错误，则管道将失败。

1. **语法检查**-语法错误是导致 CloudFormation 部署错误的常见原因。[在此阶段，[AWS CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) 通过将模板与资源规范进行比较来检查语法错误。AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html)它还会执行其他检查，例如检查资源属性的有效值以及是否遵守最佳实践。如果发现任何错误，管道就会失败，cfn-lint 会返回建议。

1. **控制检查** — 在此阶段，[cfn\_nag](https://github.com/stelligent/cfn_nag) 通过搜索模式来检查是否存在潜在的安全问题。例如，它会检查过于宽松的安全组和 AWS Identity and Access Management (IAM) 策略、缺少加密和密码文字。如果发现任何错误，则管道将失败，并且 cfn\_nag 会返回建议。

1. **版本检查**-发布管道根据产品配置文件中定义的版本策略执行版本控制。如果产品版本被定义为不可变，则 Service Catalog 会停用先前的产品版本。

1. **发布产品**-发布渠道在 Service Catalog 中发布产品。

**注意**  
发布管道是可自定义的。例如，您可以移除任何不适用于您的用例的阶段。如果要添加其他控制检查、其他验证或手动批准步骤，也可以添加更多阶段。本指南不包括修改发布管道的说明。有关更多信息，请参阅 [CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 和 [CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) 文档。