

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

# 建立新的容器配方版本
<a name="create-container-recipes"></a>

本節說明如何建立新的容器配方版本。

**Topics**
+ [使用主控台建立新的容器配方版本](#create-container-recipe-version)
+ [使用 建立容器配方 AWS CLI](#create-container-recipe-cli)

## 使用主控台建立新的容器配方版本
<a name="create-container-recipe-version"></a>

建立新版本的容器配方幾乎與建立新配方相同。差別在於，在大多數情況下，會預先選取特定詳細資訊以符合基本配方。下列清單說明建立新配方和建立新現有配方版本之間的差異。

**配方詳細資訊**
+ **名稱** – *無法編輯*。
+ **版本** – 必要。此詳細資訊不會預先填入目前版本或任何種類的序列。以 *major.minor.patch* 格式輸入您要建立的版本編號。如果版本已存在，您會遇到錯誤。

**基礎映像**
+ **選取影像**選項 – 預先選取，但可編輯。如果您變更基礎映像來源的選擇，可能會遺失其他取決於您選擇的原始選項的詳細資訊。

  對於 Docker 容器映像，您可以選擇託管在 DockerHub 上的公有映像、Amazon ECR 中的現有容器映像，或 Amazon 受管容器映像。若要查看與基礎映像選取項目相關聯的詳細資訊，請選擇符合您選取的標籤。

------
#### [ Managed images ]
  + **映像作業系統 (OS)** – *無法編輯*。
  + **影像名稱** – 根據您對現有配方所做的基礎影像選擇組合預先選取。不過，如果您變更**選取影像**選項，則會遺失預先選取的**影像名稱**。
  + **自動版本控制選項** – *不符合*您的基本配方。自動版本控制選項預設為**使用選取的作業系統版本**選項。
**重要**  
如果您使用語意版本控制來啟動管道建置，請務必將此值變更為**使用最新的可用作業系統版本**。若要進一步了解映像建置器資源的語意版本控制，請參閱[Image Builder 中的語意版本控制](ibhow-semantic-versioning.md)。

------
#### [ ECR image ]
  + **映像作業系統 (OS)** – 已預先選取，但可編輯。
  + **作業系統版本** – 已預先選取，但可編輯。
  + **ECR 映像 ID** – 預先填入，但可編輯。

------
#### [ Docker Hub image ]
  + **映像作業系統 (OS)** – *無法編輯*。
  + **作業系統版本** – 已預先選取，但可編輯。
  + **Docker 影像 ID** – 預先填入，但可編輯。

------

**執行個體組態**
+ **AMI 來源** （必要） – 識別要用作容器建置和測試執行個體基礎映像的自訂 AMI。這可以是 AMI ID 或包含 AMI ID 的 AWS Systems Manager (SSM) 參數存放區參數。
  + **AMI ID** – 此設定不會預先填入您的原始項目。輸入基礎映像的 AMI ID。範例：`ami-1234567890abcdef1`。
  + **SSM 參數** – 輸入 SSM 參數存放區參數的名稱或 ARN，其中包含基礎映像的 AMI ID。範例：`/ib/test/param` 或 `arn:aws:ssm:us-east-1:111122223333:parameter/ib/test/param`。
+ 

**儲存體 (磁碟區)**  
**EBS 磁碟區 1 (AMI 根目錄）** – 預先填入。您無法編輯根磁碟區 **裝置名稱**、**快照**或 **IOPS** 選擇。不過，您可以變更所有剩餘的設定，例如**大小**。您也可以新增磁碟區。
**注意**  
如果您指定了從另一個帳戶與您共用的基本 AMI，則指定的任何次要磁碟區的快照也必須與您的 帳戶共用。

**工作目錄**
+ **工作目錄路徑** – 預先填入，但可編輯。

**元件**
+ **元件** – 已包含在配方中的元件會顯示在每個元件清單結尾的**所選**元件區段中 （建置和測試）。您可以移除或重新排序選取的元件，以符合您的需求。

  CIS 強化元件未遵循 Image Builder 配方中的標準元件排序規則。CIS 強化元件一律會最後執行，以確保基準測試會針對您的輸出映像執行。
**注意**  
建置和測試元件清單會根據元件擁有者類型顯示可用的元件。若要新增元件，請選擇**新增建置元件**，然後選取適用的擁有權篩選條件。例如，若要新增與 AWS Marketplace 產品相關聯的建置元件，請選取 `AWS Marketplace`。這會在列出 AWS Marketplace 元件的主控台界面右側開啟選擇面板。  
針對 CIS 元件，選取 `Third party managed`。

  您可以為所選元件設定下列設定：
  + **版本控制選項** – 已預先選取，但您可以進行變更。我們建議您選擇**使用最新的可用元件版本**選項，以確保您的映像建置一律取得最新版本的元件。如果您需要在配方中使用特定元件版本，您可以選擇**指定元件版本**，然後在出現的**元件版本方塊中輸入版本**。
  + **輸入參數** – 顯示元件接受的輸入參數。**值**會預先填入先前版本配方的值。如果您在此配方中第一次使用此元件，且已為輸入參數定義預設值，則預設值會顯示在帶有灰色文字**的值**方塊中。如果未輸入其他值，Image Builder 會使用預設值。

    如果需要輸入參數，但元件中沒有定義的預設值，您必須提供值。如果缺少任何必要參數且未定義預設值，Image Builder 將不會建立配方版本。
**重要**  
元件參數是純文字值，且會登入 AWS CloudTrail。建議您使用 AWS Secrets Manager 或 AWS Systems Manager 參數存放區來存放秘密。如需 Secrets Manager 的詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[什麼是 Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。如需 AWS Systems Manager 參數存放區的詳細資訊，請參閱*AWS Systems Manager 《 使用者指南*》中的[AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

  若要展開**版本控制選項**或**輸入參數**的設定，您可以選擇設定名稱旁的箭頭。若要展開所有所選元件的所有設定，您可以切換關閉和開啟**全部展開**。

**Dockerfile 範本**
+ **Dockerfile 範本** – 預先填入，但可編輯。您可以指定 Image Builder 在執行時間以組建資訊取代的任何下列內容變數。

     
**parentImage （必要）**  
在建置時，此變數會解析為配方的基本映像。  
範例：  

  ```
  FROM
  {{{ imagebuilder:parentImage }}}
  ```  
**環境 （如果指定元件則為必要）**  
此變數會解析為執行元件的指令碼。  
範例：  

  ```
  {{{ imagebuilder:environments }}}
  ```  
**元件 （選用）**  
Image Builder 會解析容器配方包含之元件的建置和測試元件指令碼。此變數可以放置在環境變數之後 Dockerfile 的任何位置。  
範例：  

  ```
  {{{ imagebuilder:components }}}
  ```

**目標儲存庫**
+ **目標儲存庫名稱** – 如果管道的分佈組態中沒有為管道執行的區域 （區域 1) 指定其他儲存庫，則儲存輸出映像的 Amazon ECR 儲存庫。

**若要建立新的容器配方版本：**

1. 在容器配方詳細資訊頁面頂端，選擇**建立新版本**。系統會將您導向容器**配方的建立**配方頁面。

1. 若要建立新版本，請進行變更，然後選擇**建立配方**。

如需如何在建立映像管道時建立容器配方的詳細資訊，請參閱本指南**入門**一節[步驟 2：選擇配方](start-build-container-pipeline.md#start-build-container-step2)中的 。

## 使用 建立容器配方 AWS CLI
<a name="create-container-recipe-cli"></a>

若要使用 中的 `imagebuilder create-container-recipe`命令建立 Image Builder 容器配方 AWS CLI，請遵循下列步驟：

**先決條件**  
執行本節中的映像建置器命令以使用 建立容器配方之前 AWS CLI，您必須建立配方將使用的元件。下列步驟中的容器配方範例是指本指南 [從 建立自訂元件 AWS CLI](create-component.md#create-component-ib-cli)區段中建立的範例元件。

建立元件後，或者如果您使用的是現有的元件，請注意您要包含在配方中的 ARNs。

1. 

**建立 CLI 輸入 JSON 文件**

   您可以使用內嵌**create-container-recipe**命令參數提供命令的所有輸入。不過，產生的命令可能很長。若要簡化命令，您可以改為提供包含所有容器配方設定的 JSON 檔案
**注意**  
JSON 檔案中資料值的命名慣例遵循為映像建置器 API 操作請求參數指定的模式。若要檢閱 API 操作請求參數，請參閱 *EC2 Image Builder API 參考*中的 [CreateContainerRecipe](https://docs.aws.amazon.com/imagebuilder/latest/APIReference/API_CreateContainerRecipe.html) 命令。  
若要提供資料值做為命令列參數，請參閱 *AWS CLI 命令參考*中指定的參數名稱。

   以下是此範例中參數的摘要：
   + **元件** （必要物件陣列） – 包含`ComponentConfiguration`物件陣列。至少必須指定一個組建元件：
**注意**  
Image Builder 會依照您在配方中指定的順序安裝元件。不過，CIS 強化元件一律會最後執行，以確保基準測試會針對您的輸出映像執行。
     + **componentARN** （字串，必要） – 元件 ARN。
**提示**  
若要使用範例建立您自己的容器配方，請將範例 ARNs 取代為您用於配方之元件的 ARNs。其中包括每個 的 AWS 區域、名稱和版本編號。
     + **參數** （物件陣列） – 包含`ComponentParameter`物件陣列。如果需要輸入參數，但元件中沒有定義的預設值，您必須提供值。如果缺少任何必要參數且未定義預設值，Image Builder 將不會建立配方版本。
**重要**  
元件參數是純文字值，且會登入 AWS CloudTrail。建議您使用 AWS Secrets Manager 或 AWS Systems Manager 參數存放區來存放秘密。如需 Secrets Manager 的詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[什麼是 Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)。如需 AWS Systems Manager 參數存放區的詳細資訊，請參閱*AWS Systems Manager 《 使用者指南*》中的[AWS Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。
       + **name** （字串，必要） – 要設定的元件參數名稱。
       + **value** （字串陣列，必要） – 包含字串陣列，以設定具名元件參數的值。如果為元件定義了預設值，且未提供其他值，則 AWS TOE 會使用預設值。
   + **containerType** （字串，必要） – 要建立的容器類型。有效值包括 `DOCKER`。
   + **dockerfileTemplateData** （字串） – 用來建置映像的 Dockerfile 範本，以內嵌資料 Blob 表示。
   + **name** （字串，必要） – 容器配方的名稱。
   + **description** （字串） – 容器配方的描述。
   + **parentImage** （字串，必要） – 要在容器配方中使用的 Docker 容器映像，做為自訂映像的基準。
     + DockerHub 上託管的公有映像
     + Amazon ECR 中的現有容器映像
     + Amazon 受管容器映像
   + **platformOverride** （字串） – 當您使用自訂基礎映像時，指定作業系統平台。
   + **semanticVersion** （字串，必要） – 以下列格式指定的容器配方語意版本，每個位置都有數值來表示特定版本：*<major>.<minor>.<patch>*。例如，即改為 `1.0.0`。若要進一步了解映像建置器資源的語意版本控制，請參閱[Image Builder 中的語意版本控制](ibhow-semantic-versioning.md)。
   + **tags** （字串映射） – 連接至容器配方的標籤。
   + **instanceConfiguration** （物件） – 一組選項，可用來設定執行個體以建置和測試容器映像。
     + **image** （字串） – 容器建置和測試執行個體的基礎映像。這可以包含 AMI ID，也可以指定 AWS Systems Manager (SSM) 參數存放區參數，字首為 `ssm:`，後面接著參數名稱或 ARN。如果您使用 SSM 參數，參數值必須包含 AMI ID。如果您未指定基礎映像，映像建置器會使用適當的 Amazon ECS 最佳化 AMI 做為基礎映像。
     + **blockDeviceMappings** （物件陣列） – 定義要連接的區塊型設備，以便從 **image** 參數中指定的映像建置器 AMI 建置執行個體。
       + **deviceName** （字串） – 這些映射適用的裝置。
       + **ebs** （物件） – 用於管理此映射的 Amazon EBS 特定組態。
         + **deleteOnTermination** （布林值） – 用於設定關聯裝置終止時的刪除。
         + **encrypted** （布林值） – 用於設定裝置加密。
         + **volumeSize** （整數） – 用於覆寫裝置的磁碟區大小。
         + **volumeType** （字串） – 用於覆寫裝置的磁碟區類型。
   + **targetRepository** （物件，必要） – 如果管道執行的區域 （區域 1) 的管道分佈組態中沒有指定其他儲存庫，則容器映像的目的地儲存庫。
     + **repositoryName** （字串，必要） – 儲存輸出容器映像的容器儲存庫名稱。此名稱以儲存庫位置為字首。
     + **service** （字串，必要） – 指定註冊此映像的 服務。
   + **workingDirectory** （字串） – 用於建置和測試工作流程的工作目錄。

   ```
   {
   	"components": [ 
   	  { 
   		 "componentArn": "arn:aws:imagebuilder:us-west-2:111122223333:component/helloworldal2/x.x.x"
   	  }
   	],
   	"containerType": "DOCKER",
   	"description": "My Linux Docker container image",
   	"dockerfileTemplateData": "FROM {{{ imagebuilder:parentImage }}}\n{{{ imagebuilder:environments }}}\n{{{ imagebuilder:components }}}",
   	"name": "amazonlinux-container-recipe",
   	"parentImage": "amazonlinux:latest",
   	"platformOverride": "Linux",
   	"semanticVersion": "1.0.2",
   	"tags": { 
   	  "sometag" : "Tag detail" 
   	},
   	"instanceConfiguration": {
   	  "image": "ami-1234567890abcdef1",
   	  "blockDeviceMappings": [
   		 {
   			"deviceName": "/dev/xvda",
   			"ebs": {
   				"deleteOnTermination": true,
   				"encrypted": false,
   				"volumeSize": 8,
   				"volumeType": "gp2"
   			 }
   		  }			
   	  ]
   	},
   	"targetRepository": { 
   	  "repositoryName": "myrepo",
   	  "service": "ECR"
   	},
   	"workingDirectory": "/tmp"
   }
   ```

1. 

**建立配方**

   使用下列命令來建立配方。在 `--cli-input-json` 參數中提供您在上一個步驟中建立的 JSON 檔案名稱：

   ```
   aws imagebuilder create-container-recipe --cli-input-json file://create-container-recipe.json
   ```
**注意**  
您必須在 JSON 檔案路徑的開頭包括 `file://` 標記。
JSON 檔案的路徑應遵循執行命令之基礎作業系統的適當慣例。例如，Windows 使用反斜線 (\$1) 來參考目錄路徑，而 Linux 和 macOS 則使用正斜線 (/)。