

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 企業藍圖工廠元件
<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) – DevOps CI/CD 管道，可將藍圖發佈為 Service Catalog 產品。 

雲端基礎設施團隊通常會管理整個企業藍圖工廠，因為他們必須核准每個藍圖。不過，DevOps 程式碼團隊通常負責組態管道和發行管道。為了發佈新的藍圖，開發人員只會與產品儲存庫、組態儲存庫和組態檔案互動。

## 產品儲存庫
<a name="architecture-product-repo"></a>

產品儲存庫是您存放組織核准藍圖的集中位置。 藍圖管理團隊和安全團隊會檢閱對此儲存庫的提取請求，以確保每個藍圖都符合組織和安全需求。在本指南中，我們將 GitHub 用於儲存庫，但您可以使用替代方法。

## 組態儲存庫
<a name="architecture-config-repo"></a>

組態儲存庫 （組態儲存庫） 是組織存放 Service Catalog 產品組合組態檔案的位置，以及透過 Enterprise Blueprint Factory 發行的產品。在本指南中，我們將 GitHub 用於儲存庫，但您可以使用替代方法。

## 組態檔案
<a name="architecture-config-file"></a>

Enterprise Blueprint Factory 組態檔案 （組態檔案） 存放在組態儲存庫中，該儲存庫由藍圖管理團隊所擁有。此檔案名稱為 **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 帳戶 目標 OU 成員的 中部署此產品組合的產品。此屬性是選用的。
+ `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` 是包含產品的目標產品組合。此屬性是選用的。
**注意**  
我們建議您僅將產品新增至透過 Enterprise Blueprint Factory 管理的產品組合。如果您想要將產品新增至非透過企業藍圖工廠管理的產品組合，使用者的 IAM 政策必須允許 [AssociateProductWithPortfolio](https://docs.aws.amazon.com/servicecatalog/latest/dg/API_AssociateProductWithPortfolio.html) 動作。不過，基於安全最佳實務，建議您只針對 Enterprise Blueprint Factory 組態管道允許此動作。
+ `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)專案。



![Enterprise Blueprint Factory 組態管道中的階段。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/enterprise-blueprint-factory/images/configuration-pipeline-stages.png)


以下是組態管道的階段：

1. **部署產品組合** – 組態管道會部署已新增至組態檔案的任何產品組合，或刪除已從組態檔案移除的任何產品組合。如果產品組合沒有變更，則管道會略過此階段。

1. **共用產品組合** – 組態管道會與目標組織單位 (OUs共用產品組合。如果產品組合共用沒有變更，則管道會略過此階段。

1. **部署Blueprint-Admin-Bootstrapping-Product** – 組態管道會從`ServiceCatalog-CodeRepo`儲存庫擷取`bp-pipeline`** **藍圖，並將其以 的形式部署至 Service Catalog`Bootstrapping-Admin-Product`。** **此產品是用來建立發行管道的 CloudFormation 範本。將此範本部署** **為 Service Catalog 產品有助於維持版本控制。如果`bp-pipeline`** **藍圖沒有變更，則管道會略過此階段。

1. **建立發行管道** – 根據組態檔案中的產品屬性，組態管道會準備堆疊參數並啟動 CloudFormation 堆疊，以建立產品的發行管道。 如需詳細資訊，請參閱本指南中的[發行管道](#architecture-release-pipeline)。

1. **部署產品** – 發行管道會將藍圖部署為 Service Catalog 產品，並將其與目標產品組合建立關聯。最終使用者可以在 中部署 AWS 帳戶 屬於目標 OU 成員的產品。

## 發行管道
<a name="architecture-release-pipeline"></a>

發行管道會將藍圖的發行自動化為 Service Catalog 產品。此管道是 [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 資源。當您的組織想要發佈新的藍圖時，開發人員會將 IaC 範本及其產品組態檔案上傳至產品儲存庫。將產品詳細資訊新增至組態檔案會觸發組態管道。組態管道會為此藍圖建立發行管道。藍圖的任何後續更新都會觸發此發行管道，以使用新版本更新 Service Catalog 中的產品。

發行管道包含[主動控制](apg-gloss.md#glossary-proactive-control)，可自動化藍圖的安全與合規檢查。*主動控制*旨在防止建立不合規的資源。這些控制可以減少其他類型的安全[控制](apg-gloss.md#glossary-security-control)所處理的安全事件數量，例如回應和偵測性控制。由於主動控制可確保部署的資源在部署之前符合規範，因此沒有需要回應或修復的偵測事件。

第一次叫用組態管道時，它會建立名為 的 Service Catalog 產品`Bootstrapping-Admin-Product`。此產品是發行管道的 CloudFormation 範本。如下圖所示，組態管道使用 `Bootstrapping-Admin-Product`產品為每個新藍圖建立專用發行管道。藍圖和發行管道之間有one-to-one的關係。



![組態管道使用產品為每個藍圖建立發行管道。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/enterprise-blueprint-factory/images/blueprint-pipeline-ratio.png)


**發行管道階段**

下圖顯示發行管道中的預設階段，以及管道與之互動的資源。管道中的每個階段都是 CodeBuild 專案。



![Enterprise Blueprint Factory 發行管道中的階段。](http://docs.aws.amazon.com/zh_tw/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. **版本檢查 **– 發行管道會根據產品組態檔案中定義的版本策略執行版本控制。如果產品版本定義為[不可變](apg-gloss.md#glossary-immutable-infrastructure)，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) 文件。