

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

# AWS Service Catalog 使用程式碼儲存庫在 中佈建 Terraform 產品
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository"></a>

*Rahul Sharad Gaikwad 醫生和 Tamilselvan P，Amazon Web Services*

## 總結
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-summary"></a>

AWS Service Catalog 支援對 [HashiCorp Terraform](https://developer.hashicorp.com/terraform/tutorials/aws-get-started) 組態進行管控的自助式佈建。如果您使用 Terraform，則可以使用 Service Catalog 做為單一工具， AWS 在 內大規模組織、管理和分發 Terraform 組態。您可以存取 Service Catalog 金鑰功能，包括將標準化和預先核准的基礎設施編目為程式碼 (IaC) 範本、存取控制、具有最低權限存取的雲端資源佈建、版本控制、共用到數千個 AWS 帳戶和標記。工程師、資料庫管理員和資料科學家等最終使用者，會看到他們有權存取的產品和版本清單，而且可以透過單一動作進行部署。

此模式可協助您使用 Terraform 程式碼部署 AWS 資源。GitHub 儲存庫中的 Terraform 程式碼可透過 Service Catalog 存取。使用此方法，您可以將產品與現有的 Terraform 工作流程整合。管理員可以使用 Terraform 建立 Service Catalog 產品組合，並將 AWS Launch Wizard 產品新增至這些產品組合。

以下是此解決方案的優點：
+ 由於 Service Catalog 中的復原功能，如果在部署期間發生任何問題，您可以將產品還原至先前的版本。
+ 您可以輕鬆識別產品版本之間的差異。這可協助您解決部署期間的問題。
+ 您可以在 Service Catalog 中設定儲存庫連線，例如 GitHub 或 GitLab。您可以直接透過儲存庫進行產品變更。

如需 整體優勢的詳細資訊 AWS Service Catalog，請參閱[什麼是 Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html)。

## 先決條件和限制
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ 包含 ZIP 格式 Terraform 組態檔案的 GitHub、BitBucket 或其他儲存庫。
+ AWS Serverless Application Model 命令列界面 (AWS SAM CLI)，[已安裝](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)。
+ AWS Command Line Interface (AWS CLI)，[已安裝](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)並[設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
+ Go，[已安裝](https://go.dev/doc/install)。
+ Python 3.9 版，[已安裝](https://www.python.org/downloads/release/python-3913/)。 AWS SAM CLI 需要此版本的 Python。
+ 寫入和執行 AWS Lambda 函數的許可，以及存取和管理 Service Catalog 產品和產品組合的許可。

## Architecture
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-architecture"></a>

![從程式碼儲存庫在 Service Catalog 中佈建 Terraform 產品的架構圖](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/7d0d76e8-9485-4b3f-915f-481b6a7cdcd9/images/e83fa44a-4ca6-4438-a0d1-99f09a3541bb.png)


該圖顯示以下工作流程：

1. 當 Terraform 組態就緒時，開發人員會建立包含所有 Terraform 程式碼的 .zip 檔案。開發人員會將 .zip 檔案上傳至連線至 Service Catalog 的程式碼儲存庫。

1. 管理員會將 Terraform 產品與 Service Catalog 中的產品組合建立關聯。管理員也會建立啟動限制，允許最終使用者佈建產品。

1. 在 Service Catalog 中，最終使用者使用 Terraform 組態啟動 AWS 資源。他們可以選擇要部署的產品版本。

## 工具
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-tools"></a>

**AWS 服務**
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一項運算服務，可協助您執行程式碼，無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展，因此您只需支付使用的運算時間。
+ [AWS Service Catalog](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/introduction.html) 可協助您集中管理已核准的 IT 服務目錄 AWS。最終使用者可在機構所設的限制範圍內，迅速地只部署自己需要且經核准的 IT 服務。

**其他服務**
+ [Go](https://go.dev/doc/install) 是 Google 支援的開放原始碼程式設計語言。
+ [Python](https://www.python.org/) 是一種一般用途的電腦程式設計語言。

**程式碼儲存庫**

如果您需要可透過 Service Catalog 部署的範例 Terraform 組態，您可以使用 GitHub [Amazon Macie Organization Setup using Terraform](https://github.com/aws-samples/aws-macie-customization-terraform-samples) 儲存庫中的組態。不需要在此儲存庫中使用程式碼範例。

## 最佳實務
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-best-practices"></a>
+ 透過 Service Catalog 啟動產品時，不要在 Terraform 組態檔案 (`terraform.tfvars`) 中提供變數的值，而是設定變數值。
+ 僅將產品組合的存取權授予特定使用者或管理員。
+ 遵循最低權限原則，並授予執行任務所需的最低許可。如需詳細資訊，請參閱《 AWS Identity and Access Management (IAM) 文件》中的[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPracticesAndUseCases.html)。

## 史詩
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-epics"></a>

### 設定您的本機工作站
<a name="set-up-your-local-workstation"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| （選用） 安裝 Docker。 | 如果您想要在開發環境中執行 AWS Lambda 函數，請安裝 Docker。如需相關說明，請參閱 Docker 文件中的[安裝 Docker 引擎](https://docs.docker.com/engine/install/)。 | DevOps 工程師 | 
| 安裝適用於 Terraform 的 AWS Service Catalog 引擎。 | 1. 輸入下列命令以複製 [AWS Service Catalog Engine for Terraform](https://github.com/aws-samples/service-catalog-engine-for-terraform-os) 儲存庫。<pre>git clone https://github.com/aws-samples/service-catalog-engine-for-terraform-os.git</pre><br />2. 導覽至複製儲存庫的根目錄。<br />3. 輸入以下命令。這會安裝引擎。<pre>run ./bin/bash/deploy-tre.sh -r</pre><br />在自動安裝期間，不會使用預設設定檔中的 AWS 區域 設定。相反地，您可以在執行此命令時提供 區域。 | DevOps 工程師、AWS 管理員 | 

### 連接 GitHub 儲存庫
<a name="connect-the-github-repository"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 GitHub 儲存庫的連線。 | 1. 登入 AWS 管理主控台，然後開啟**開發人員工具**主控台。您可以選擇 AWS CodePipeline 或 等服務來存取開發人員工具主控台 AWS CodeDeploy。<br />2. 在左側導覽窗格中，選擇**設定**，然後選擇**連線**。<br />3. 選擇**建立連線**。<br />4. 選取您維護 Terraform 原始程式碼的儲存庫。例如，您可以選擇 **Bitbucket**、**GitHub** 或 **GitHub Enterprise Server**。<br />5. 輸入連線的名稱，然後選擇**連線**。<br />6. 出現提示時，請驗證儲存庫。<br />身分驗證完成後，會建立連線，且狀態會變更為**作用中**。 | AWS 管理員 | 

### 在 Service Catalog 中建立 Terraform 產品
<a name="create-a-terraform-product-in-service-catalog"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 Service Catalog 產品。 | 1. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />2. 導覽至**管理**區段，然後選擇**產品清單**。<br />3. 選擇**建立產品**。<br />4. 在**產品詳細資訊區段的建立**產品頁面上，選擇**外部**產品類型。 ****Service Catalog 使用此產品類型來支援 Terraform Community Edition 產品。<br />5. 輸入 Service Catalog 產品的名稱和擁有者。<br />6. 選取**使用 CodeStar 供應商指定程式碼儲存庫**。<br />7. 輸入儲存庫的下列資訊：**使用 連線至您的供應商 AWS CodeConnections** – 選取您先前建立的連線。**儲存庫** – 選取儲存庫。**分支** – 選取分支。**範本檔案路徑** – 選擇儲存程式碼範本檔案的路徑。檔案名稱應以 結尾`tar.gz`。<br />8. 在**版本名稱和描述**下，提供產品版本的相關資訊。<br />9. 選擇**建立產品**。 | AWS 管理員 | 
| 建立組合。 | 1. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />2. 導覽至**管理**區段，然後選擇**產品組合**。<br />3. 選擇**建立產品組合**。<br />4. 輸入下列值：**產品組合名** – `Sample terraform`**產品組合描述** – `Sample portfolio for Terraform configurations`**擁有者** – 您的聯絡資訊，例如電子郵件地址<br />5. 選擇**建立**。 | AWS 管理員 | 
| 將 Terraform 產品新增至產品組合。 | 1. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />2. 導覽至**管理**區段，然後選擇**產品清單**。<br />3. 選取您先前建立的 Terraform 產品。<br />4. 選擇**動作**，然後選擇**將產品新增至產品組合**。<br />5. 選擇`Sample terraform`產品組合。<br />6. 選擇**將產品新增至產品組合**。 | AWS 管理員 | 
| 建立存取政策。 | 1. 開啟 [AWS Identity and Access Management (IAM) 主控台](https://console.aws.amazon.com/iam/)。<br />2. 在導覽窗格上選擇 **Policies (政策)**。<br />3. 在內容窗格中，選擇 **Create policy (建立政策)**。<br />4. 選擇 **JSON **選項。<br />5. 在此模式[額外資訊](#provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-additional)區段的*存取政策*中輸入範例 JSON 政策。<br />6. 選擇**下一步**。<br />7. 在**檢閱和建立**頁面上的政策**名稱**方塊中，輸入 `TerraformResourceCreationAndArtifactAccessPolicy`。<br />8. 選擇**建立政策**。 | AWS 管理員 | 
| 建立自訂信任政策。 | 1. 開啟 [ IAM 主控台](https://console.aws.amazon.com/iam/)。<br />2. 在導覽窗格中，選擇 **Roles** (角色)。<br />3. 選擇 **Create Role** (建立角色)。<br />4. 在**信任的實體類型**下，選擇**自訂信任政策**。<br />5. 在 JSON 政策編輯器中，在此模式[的其他資訊](#provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-additional)區段的*信任政策*中輸入範例 JSON 政策。<br />6. 選擇**下一步**。<br />7. 在**許可政策**下，選擇您先前建立`TerraformResourceCreationAndArtifactAccessPolicy`的 。<br />8. 選擇**下一步**。<br />9. 在**角色詳細資訊**下，於**角色名稱**方塊中，輸入 `SCLaunch-product`。  角色名稱必須以 開頭`SCLaunch`。<br />10. 選擇建**立角色**。 | AWS 管理員 | 
| 將啟動限制新增至 Service Catalog 產品。 | 1. 以具有管理許可的使用者 AWS 管理主控台 身分登入 。<br />2. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />3. 在導覽窗格中，選擇**產品組合**。<br />4. 選擇您先前建立的產品組合。<br />5. 在**Portfolio 詳細資訊**頁面上，選擇**限制**條件索引標籤，然後選擇**建立限制條件**。<br />6. For**Product**，選取您先前建立的 Terraform 產品。<br />7. 在**啟動限制下**，針對**方法**，選擇**輸入角色名稱**。<br />8. 在**角色名稱**方塊中，輸入 `SCLaunch-product`。<br />9. 選擇**建立**。 | AWS 管理員 | 
| 授予產品存取權。 | 1. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />2. 在導覽窗格中，選擇**產品組合**。<br />3. 選擇您先前建立的產品組合。<br />4. 選擇**Access**tab，然後選擇**授予存取權**。<br />5. 選擇 **Roles**tab，然後選擇應有權部署此產品的角色。<br />6. 選擇 **Grant access (授與存取權)**。 | AWS 管理員 | 
| 啟動產品。 | 1. 以具有部署 Service Catalog 產品許可的使用者 AWS 管理主控台 身分登入 。<br />2. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />3. 在導覽窗格中，選擇**產品**。<br />4. 選擇您先前建立的生產，然後選擇**啟動產品**。<br />5. 輸入產品名稱並定義任何必要的參數。<br />6. **ChooseLaunch 產品**。 | DevOps 工程師 | 

### 驗證部署
<a name="verify-the-deployment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證部署。 | Service Catalog 佈建工作流程有兩個 AWS Step Functions 狀態機器：+ `ManageProvisionedProductStateMachine`– Service Catalog 會在佈建新的 Terraform 產品和更新現有的 Terraform 佈建產品時叫用此狀態機器。<br />+ `TerminateProvisionedProductStateMachine`– Service Catalog 會在終止現有的 Terraform 佈建產品時叫用此狀態機器。<br />您可以檢查`ManageProvisionedProductStateMachine`狀態機器的日誌，以確認已佈建產品。1. 登入 AWS 管理主控台，然後開啟 [AWS Step Functions 主控台](https://console.aws.amazon.com/states/home)。<br />2. 在左側導覽窗格中，選擇**狀態機器**。<br />3. 選擇 `ManageProvisionedProductStateMachine`。<br />4. 在**執行**清單中，輸入佈建的產品 ID 以尋找執行。狀態檔案後端儲存貯體名稱開頭為 `sc-terraform-engine-state-`。<br />5. 驗證已在帳戶中建立所有必要的資源。 | DevOps 工程師 | 

### 清除基礎設施
<a name="clean-up-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 刪除佈建的產品。 | 1. 以具有部署 Service Catalog 產品許可的使用者 AWS 管理主控台 身分登入 。<br />2. 開啟 [AWS Service Catalog 主控台](https://console.aws.amazon.com/servicecatalog/)。<br />3. 在左側導覽中，選擇**佈建的產品**。<br />4. 選取您建立的產品。<br />5. 在**動作**清單中，選擇**終止**。<br />6. 在確認文字方塊中，輸入 `terminate`，然後選擇**終止佈建的產品**。<br />7. 重複這些步驟來終止所有佈建的產品。 | DevOps 工程師 | 
| 移除適用於 Terraform 的 AWS Service Catalog 引擎。 | 1. 以具有管理許可的使用者 AWS 管理主控台 身分登入 。<br />2. 開啟 [Amazon Simple Storage Service (Amazon S3) 主控台](https://console.aws.amazon.com/s3/)。<br />3. 在導覽窗格中，選擇 **儲存貯體**。<br />4. 選取儲存`sc-terraform-engine-logging-XXXX`貯體。<br />5. 選擇**空白**。<br />6. 針對下列儲存貯體重複步驟 4–5：`sc-terraform-engine-state-XXXX``terraform-engine-bootstrap-XXXX`<br />7. 開啟[AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)，然後驗證您是否正確 AWS 區域。<br />8. 在左側導覽中，選擇**堆疊**。<br />9. 選取 `SAM-TRE`，然後選擇**刪除**。等待堆疊刪除。<br />10. 選取 `Bootstrap-TRE`，然後選擇**刪除**。等待堆疊刪除。 | AWS 管理員 | 

## 相關資源
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-resources"></a>

**AWS 文件**
+ [Terraform 產品入門](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/getstarted-Terraform.html)

**Terraform 文件**
+ [Terraform 安裝](https://learn.hashicorp.com/tutorials/terraform/install-cli)
+ [Terraform 後端組態](https://developer.hashicorp.com/terraform/language/backend)
+ [Terraform AWS 提供者文件](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)

## 其他資訊
<a name="provision-a-terraform-product-in-aws-service-catalog-by-using-a-code-repository-additional"></a>

**存取政策**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/servicecatalog:provisioning": "true"
                }
            }
        },
        {
            "Action": [
                "s3:CreateBucket*",
                "s3:DeleteBucket*",
                "s3:Get*",
                "s3:List*",
                "s3:PutBucketTagging"
            ],
            "Resource": "arn:aws:s3:::*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "resource-groups:CreateGroup",
                "resource-groups:ListGroupResources",
                "resource-groups:DeleteGroup",
                "resource-groups:Tag"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "tag:GetResources",
                "tag:GetTagKeys",
                "tag:GetTagValues",
                "tag:TagResources",
                "tag:UntagResources"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

**信任政策**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "GivePermissionsToServiceCatalog",
            "Effect": "Allow",
            "Principal": {
                "Service": "servicecatalog.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account_id:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringLike": {
                    "aws:PrincipalArn": [
                        "arn:aws:iam::accounti_id:role/TerraformEngine/TerraformExecutionRole*",
                        "arn:aws:iam::accounti_id:role/TerraformEngine/ServiceCatalogExternalParameterParserRole*",
                        "arn:aws:iam::accounti_id:role/TerraformEngine/ServiceCatalogTerraformOSParameterParserRole*"
                    ]
                }
            }
        }
    ]
}
```