

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

# 建置自訂 AWS ParallelCluster AMI
<a name="building-custom-ami-v3"></a>

使用 AWS ParallelCluster 命令列界面 (CLI) 或 API 時，您只需為建立或更新 AWS ParallelCluster 映像和叢集時建立 AWS 的資源付費。如需詳細資訊，請參閱[AWS 使用的 服務 AWS ParallelCluster](aws-services-v3.md)。

**重要**  
如果您建置自訂 AMI，則必須在每個新 AWS ParallelCluster 版本中重複用來建立自訂 AMI 的步驟。

在進一步閱讀之前，我們建議您先檢閱 [自訂引導操作](custom-bootstrap-actions-v3.md)區段。判斷您要進行的修改是否可以編寫指令碼，並支援未來的 AWS ParallelCluster 版本。

雖然通常建立自訂 AMI 並不理想，但在某些情況下 AWS ParallelCluster ，需要為 建置自訂 AMI。本教學課程說明如何為這些案例建置自訂 AMI。

**先決條件**
+ AWS ParallelCluster [已安裝 ](install-v3-parallelcluster.md)。
+  AWS CLI [已安裝並設定 。](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ 您有 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
+ 您有一個 IAM 角色，具有執行 CLI [`pcluster`](pcluster-v3.md) 和建置映像所需的[許可](iam-roles-in-parallelcluster-v3.md#iam-roles-in-parallelcluster-v3-example-user-policies)。

## 如何自訂 AWS ParallelCluster AMI
<a name="how-to-customize-the-aws-parallelcluster-ami-v3"></a>

有兩種方式可建置自訂 AWS ParallelCluster AMI。這兩種方法之一是使用 CLI AWS ParallelCluster 建立新的 AMI。另一種方法需要您手動修改，以建置可在 下使用的新 AMI AWS 帳戶。

## 建置自訂 AWS ParallelCluster AMI
<a name="build-a-custom-aws-parallelcluster-ami-v3"></a>

如果您有自訂 AMI 和軟體，您可以在其 AWS ParallelCluster 上套用 所需的變更。 AWS ParallelCluster 依賴 EC2 Image Builder 服務來建置自訂 AMIs。如需詳細資訊，請參閱[映像建置器使用者指南](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)。

重點：
+ 程序大約需要 1 小時。如果在建置時要安裝其他 [`Build`](Build-v3.md) /[`Components`](Build-v3.md#Build-v3-Components)，則此時間可能會有所不同。
+ AMI 會標記主要元件的版本。這些包括核心、排程器和 [EFA](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) 驅動程式。元件版本的子集也會在 AMI 描述中報告。
+ 從 AWS ParallelCluster 3.0.0 開始，一組新的 CLI 命令可用來管理映像的生命週期。其中包括 [`build-image`](pcluster.build-image-v3.md)、[`list-images`](pcluster.list-images-v3.md)、[`describe-image`](pcluster.describe-image-v3.md) 和 [`delete-image`](pcluster.delete-image-v3.md)。
+ 此方法可重複。您可以重新執行它來保持 AMIs更新 （例如作業系統更新），然後在更新現有叢集時使用它們。

**注意**  
如果您在 AWS 中國分割區中使用此方法，您可能會遇到網路錯誤。例如，當您從 GitHub 或作業系統儲存庫下載套件時，您可能會從 `pcluster build-image`命令看到這些錯誤。如果發生這種情況，我們建議您使用下列其中一種替代方法：  
遵循繞過此命令[修改 AWS ParallelCluster AMI](#modify-an-aws-parallelcluster-ami-v3)的方法。
在另一個分割區和區域中建置映像，例如 `us-east-1`，然後存放/還原它以將其移至中國區域。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[使用 S3 存放和還原 AMI ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-store-restore.html)。

步驟：

1. 設定您的 AWS 帳戶 登入資料，讓 AWS ParallelCluster 用戶端可以代表您呼叫 AWS API 操作。如需必要許可的清單，請參閱[AWS Identity and Access Management 中的 許可 AWS ParallelCluster](iam-roles-in-parallelcluster-v3.md)。

1. 建立基本*建置映像*組態檔案。若要這樣做，請指定[`InstanceType`](Build-v3.md#yaml-build-image-Build-InstanceType)要用來建置映像的 和 [`ParentImage`](Build-v3.md#yaml-build-image-Build-ParentImage)。這些是用來建立 AMI 的起點。如需選用建置參數的詳細資訊，請參閱[映像組態](image-builder-configuration-file-v3.md)。

   ```
   Build:
    InstanceType: <BUILD_INSTANCE_TYPE>
    ParentImage: <BASE_AMI_ID>
   ```

1. 使用 CLI 命令[`pcluster build-image`](pcluster.build-image-v3.md)從您提供做為基礎的 AWS ParallelCluster AMI 開始建置 AMI。

   ```
   $ pcluster build-image --image-id IMAGE_ID --image-configuration IMAGE_CONFIG.yaml --region REGION
       {
    "image": {
      "imageId": "IMAGE_ID",
      "imageBuildStatus": "BUILD_IN_PROGRESS",
      "cloudformationStackStatus": "CREATE_IN_PROGRESS",
      "cloudformationStackArn": "arn:aws:cloudformation:us-east-1:123456789012:stack/IMAGE_ID/abcd1234-ef56-gh78-ij90-1234abcd5678",
      "region": "us-east-1",
      "version": "3.15.0"
    }
   }
   ```
**警告**  
`pcluster build-image` 使用預設 VPC。如果您使用 AWS Control Tower 或 AWS 登陸區域刪除預設 VPC，則必須在映像組態檔案中指定子網路 ID。如需詳細資訊，請參閱[`SubnetId`](HeadNode-v3.md#yaml-HeadNode-Networking-SubnetId)。

   如需其他參數的清單，請參閱[`pcluster build-image`](pcluster.build-image-v3.md)命令參考頁面。上述命令的結果如下：
   + 根據映像組態建立 CloudFormation 堆疊。堆疊包含建置所需的所有 EC2 Image Builder 資源。
   + 建立的資源包括自訂映像建置器 AWS ParallelCluster 元件可新增至的官方映像建置器元件。如需詳細資訊，請參閱 *EC2 * [ Image Builder 使用者指南中的使用映像建置器建立自訂元件](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-component.html)。
   + EC2 Image Builder 會啟動建置執行個體、套用 AWS ParallelCluster 技術指南、安裝 AWS ParallelCluster 軟體堆疊，以及執行必要的組態任務。 AWS ParallelCluster 技術指南用於建置和引導 AWS ParallelCluster。
   + 執行個體會停止，並從中建立新的 AMI。
   + 另一個執行個體會從新建立的 AMI 啟動。在測試階段，EC2 Image Builder 會執行 Image Builder 元件中定義的測試。
   + 如果建置成功，則會刪除堆疊。如果建置失敗，堆疊會保留並可供檢查。

1. 您可以執行下列命令來監控建置程序的狀態。建置完成後，您可以執行它來擷取回應中提供的 AMI ID。

   ```
   $ pcluster describe-image --image-id IMAGE_ID --region REGION
       
   # BEFORE COMPLETE
   {
    "imageConfiguration": {
      "url": "https://parallelcluster-1234abcd5678efgh-v1-do-not-delete.s3.amazonaws.com/parallelcluster/3.15.0/images/IMAGE_ID-abcd1234efgh5678/configs/image-config.yaml?...",
    },
    "imageId": "IMAGE_ID",
    "imagebuilderImageStatus": "BUILDING",
    "imageBuildStatus": "BUILD_IN_PROGRESS",
    "cloudformationStackStatus": "CREATE_IN_PROGRESS",
    "cloudformationStackArn": "arn:aws:cloudformation:us-east-1:123456789012:stack/IMAGE_ID/abcd1234-ef56-gh78-ij90-1234abcd5678",
    "region": "us-east-1",
    "version": "3.15.0",
    "cloudformationStackTags": [
      {
        "value": "3.15.0",
        "key": "parallelcluster:version"
      },
      {
        "value": "IMAGE_ID",
        "key": "parallelcluster:image_name"
      },
      ...
    ],
    "imageBuildLogsArn": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/imagebuilder/ParallelClusterImage-IMAGE_ID",
    "cloudformationStackCreationTime": "2022-04-05T21:36:26.176Z"
   }
   
   # AFTER COMPLETE
   {
    "imageConfiguration": {
      "url": "https://parallelcluster-1234abcd5678efgh-v1-do-not-delete.s3.us-east-1.amazonaws.com/parallelcluster/3.15.0/images/IMAGE_ID-abcd1234efgh5678/configs/image-config.yaml?Signature=..."
    },
    "imageId": "IMAGE_ID",
    "imageBuildStatus": "BUILD_COMPLETE",
    "region": "us-east-1",
    "ec2AmiInfo": {
        "amiName": "IMAGE_ID 2022-04-05T21-39-24.020Z",
        "amiId": "ami-1234stuv5678wxyz",
        "description": "AWS ParallelCluster AMI for alinux2, kernel-4.14.238-182.422.amzn2.x86_64, lustre-2.10.8-5.amzn2.x86_64, efa-1.13.0-1.amzn2.x86_64, dcv-2021.1.10598-1.el7.x86_64, slurm-20-11-8-1",
        "state": "AVAILABLE",
        "tags": [
         {
           "value": "2021.3.11591-1.el7.x86_64",
           "key": "parallelcluster:dcv_version"
         },
         ...
        ],
      "architecture": "x86_64"
    },
    "version": "3.15.0"      
   }
   ```

1. 若要建立叢集，請在叢集組態的 [`CustomAmi`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-Image-CustomAmi) 欄位中輸入 AMI ID。

**故障診斷和監控 AMI 建立程序**

影像建立會在大約一小時的時間內完成。您可以執行 [`pcluster describe-image`](pcluster.describe-image-v3.md)命令或日誌擷取命令來監控程序。

```
$ pcluster describe-image --image-id IMAGE_ID --region REGION
```

此[`build-image`](pcluster.build-image-v3.md)命令會使用建置映像所需的所有 Amazon EC2 資源建立 CloudFormation 堆疊，並啟動 EC2 Image Builder 程序。

執行 [`build-image`](pcluster.build-image-v3.md)命令後，您可以使用 擷取 CloudFormation 堆疊事件[`pcluster get-image-stack-events`](pcluster.get-image-stack-events-v3.md)。您可以使用 `--query` 參數篩選結果，以查看最新的事件。如需詳細資訊，請參閱*AWS Command Line Interface 《 使用者指南*》中的[篩選 AWS CLI 輸出](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html)。

```
$ pcluster get-image-stack-events --image-id IMAGE_ID --region REGION --query "events[0]"
{
 "eventId": "ParallelClusterImage-CREATE_IN_PROGRESS-2022-04-05T21:39:24.725Z",
 "physicalResourceId": "arn:aws:imagebuilder:us-east-1:123456789012:image/parallelclusterimage-IMAGE_ID/3.15.0/1",
 "resourceStatus": "CREATE_IN_PROGRESS",
 "resourceStatusReason": "Resource creation Initiated",
 "resourceProperties": "{\"InfrastructureConfigurationArn\":\"arn:aws:imagebuilder:us-east-1:123456789012:infrastructure-configuration/parallelclusterimage-abcd1234-ef56-gh78-ij90-1234abcd5678\",\"ImageRecipeArn\":\"arn:aws:imagebuilder:us-east-1:123456789012:image-recipe/parallelclusterimage-IMAGE_ID/3.15.0\",\"DistributionConfigurationArn\":\"arn:aws:imagebuilder:us-east-1:123456789012:distribution-configuration/parallelclusterimage-abcd1234-ef56-gh78-ij90-1234abcd5678\",\"Tags\":{\"parallelcluster:image_name\":\"IMAGE_ID\",\"parallelcluster:image_id\":\"IMAGE_ID\"}}",
 "stackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/IMAGE_ID/abcd1234-ef56-gh78-ij90-1234abcd5678",
 "stackName": "IMAGE_ID",
 "logicalResourceId": "ParallelClusterImage",
 "resourceType": "AWS::ImageBuilder::Image",
 "timestamp": "2022-04-05T21:39:24.725Z"
}
```

約 15 分鐘後，堆疊事件會出現在與映像建置器建立相關的日誌事件項目中。您現在可以使用 和 [`pcluster get-image-log-events`](pcluster.get-image-log-events-v3.md)命令列出映像日誌串流[`pcluster list-image-log-streams`](pcluster.list-image-log-streams-v3.md)並監控映像建置器步驟。

```
$ pcluster list-image-log-streams --image-id IMAGE_ID --region REGION \
    --query 'logStreams[*].logStreamName'

 "3.15.0/1"
]

$ pcluster get-image-log-events --image-id IMAGE_ID --region REGION \
--log-stream-name 3.15.0/1 --limit 3
{
 "nextToken": "f/36295977202298886557255241372854078762600452615936671762",
 "prevToken": "b/36295977196879805474012299949460899222346900769983430672",
 "events": [
   {
     "message": "ExecuteBash: FINISHED EXECUTION",
     "timestamp": "2022-04-05T22:13:26.633Z"
   },
   {
     "message": "Document arn:aws:imagebuilder:us-east-1:123456789012:component/parallelclusterimage-test-abcd1234-ef56-gh78-ij90-1234abcd5678/3.15.0/1",
     "timestamp": "2022-04-05T22:13:26.741Z"
   },
   {
     "message": "TOE has completed execution successfully",
     "timestamp": "2022-04-05T22:13:26.819Z"
   }
 ]
}
```

繼續檢查 [`describe-image`](pcluster.describe-image-v3.md)命令，直到您看到 `BUILD_COMPLETE` 狀態為止。

```
$ pcluster describe-image --image-id IMAGE_ID --region REGION
{
 "imageConfiguration": {
   "url": "https://parallelcluster-1234abcd5678efgh-v1-do-not-delete.s3.us-east-1.amazonaws.com/parallelcluster/3.15.0/images/IMAGE_ID-abcd1234efgh5678/configs/image-config.yaml?Signature=..."
 },
 "imageId": "IMAGE_ID",
 "imageBuildStatus": "BUILD_COMPLETE",
 "region": "us-east-1",
 "ec2AmiInfo": {
     "amiName": "IMAGE_ID 2022-04-05T21-39-24.020Z",
     "amiId": "ami-1234stuv5678wxyz",
     "description": "AWS ParallelCluster AMI for alinux2, kernel-4.14.238-182.422.amzn2.x86_64, lustre-2.10.8-5.amzn2.x86_64, efa-1.13.0-1.amzn2.x86_64, dcv-2021.1.10598-1.el7.x86_64, slurm-20-11-8-1",
     "state": "AVAILABLE",
     "tags": [
      {
        "value": "2021.3.11591-1.el7.x86_64",
        "key": "parallelcluster:dcv_version"
      },
      ...
     ],
   "architecture": "x86_64"
 },
 "version": "3.15.0"      
}
```

如果您需要對自訂 AMI 建立問題進行疑難排解，請建立映像日誌的封存，如下列步驟所述。

視 `--output` 參數而定，可以將日誌存檔在 Amazon S3 儲存貯體或本機檔案中。

```
$ pcluster export-image-logs --image-id IMAGE_ID --region REGION \
--bucket BUCKET_NAME --bucket-prefix BUCKET_FOLDER
{
 "url": "https://BUCKET_NAME.s3.us-east-1.amazonaws.com/BUCKET-FOLDER/IMAGE_ID-logs-202209071136.tar.gz?AWSAccessKeyId=..."
}

$ pcluster export-image-logs --image-id IMAGE_ID \
--region REGION --bucket BUCKET_NAME --bucket-prefix BUCKET_FOLDER --output-file /tmp/archive.tar.gz
{
 "path": "/tmp/archive.tar.gz"
}
```

封存包含與映像建置器程序和 CloudFormation 堆疊事件相關的 CloudWatch Logs 串流。命令可能需要幾分鐘的時間才能執行。

 **管理自訂 AMIs** 

從 AWS ParallelCluster 3.0.0 開始，在 CLI 中新增一組新的命令，以建置、監控和管理映像生命週期。如需 命令的詳細資訊，請參閱 [pcluster 命令](pcluster-v3.md)。

## 修改 AWS ParallelCluster AMI
<a name="modify-an-aws-parallelcluster-ami-v3"></a>

此方法包含透過在官方 AWS ParallelCluster AMI 上新增自訂來修改官方 AMI。 AWS ParallelCluster AMIs 會以新版本更新。這些 AMIs 具有安裝和設定時， AWS ParallelCluster 運作所需的所有元件。您可以從其中一個開始，做為您的基礎。

重點：
+ 此方法比 [`build-image`](pcluster.build-image-v3.md)命令更快。不過，這是手動程序，無法自動重複。
+ 透過此方法，您無法存取可透過 CLI 取得的日誌擷取和映像生命週期管理命令。

步驟：

------
#### [ New Amazon EC2 console ]

1. 尋找對應至您使用之特定 AWS 區域 的 AMI。若要尋找，請使用 [`pcluster list-official-images`](pcluster.list-official-images-v3.md)命令搭配 `--region` 參數，以選取特定 AWS 區域 和 `--os`和 `--architecture` 參數，以您想要使用的作業系統和架構來篩選所需的 AMI。從輸出擷取 Amazon EC2 映像 ID。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)：// 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇**影像**，然後選擇 **AMIs**。搜尋擷取的 EC2 映像 ID，選取 AMI，然後從 **AMI 選擇啟動執行個體**。

1. 向下捲動並選擇您的**執行個體類型**。

1. 選擇您的**金鑰對**和**啟動執行個體**。

1. 使用作業系統使用者和 SSH金鑰登入您的執行個體。

1. 手動自訂執行個體以符合您的需求。

1. 執行下列命令來準備您的執行個體以建立 AMI。

   ```
   sudo /usr/local/sbin/ami_cleanup.sh
   ```

1. 從主控台中，選擇**執行個體狀態**和**停止執行個體**。

   導覽至**執行個體**、選擇新執行個體、選取**執行個體狀態**和**停止執行個體**。

1. 使用 Amazon EC2 主控台或 AWS CLI [create-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-image.html) 從執行個體建立新的 AMI。

**從 Amazon EC2 主控台**

   1. 在導覽窗格中，選擇 **Instances (執行個體)**。

   1. 選擇您建立和修改的執行個體。

   1. 在**動作**中，選擇**映像**，然後選擇**建立映像**。

   1. 選擇 **Create Image (建立映像)**。

1. 在叢集組態的 [`CustomAmi`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-Image-CustomAmi) 欄位中輸入新的 AMI ID，然後建立叢集。

------
#### [ Old Amazon EC2 console ]

1. 尋找對應至您使用之特定 AWS 區域 的 AWS ParallelCluster AMI。若要尋找它，您可以使用 [`pcluster list-official-images`](pcluster.list-official-images-v3.md)命令搭配 `--region` 參數，選取特定 AWS 區域 和 `--os`和 `--architecture` 參數，以您想要使用的作業系統和架構來篩選所需的 AMI。您可以從輸出擷取 Amazon EC2 Image ID。

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)：// 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇**影像**，然後選擇 **AMIs**。設定**公用映像**的篩選條件，並搜尋擷取的 EC2 映像 ID，選取 AMI，然後選擇**啟動**。

1. 選擇您的執行個體類型，然後選取**下一步：設定執行個體詳細資訊**或**檢閱並啟動**以啟動您的執行個體。

1. 選擇**啟動**、選取您的**金鑰對**和**啟動執行個體**。

1. 使用作業系統使用者和 SSH 金鑰來登入執行個體。如需詳細資訊，請導覽至**執行個體**，選取新的執行個體並**連線**。

1. 手動自訂執行個體以符合您的需求。

1. 執行下列命令，以備妥執行個體來建立 AMI：

   ```
   sudo /usr/local/sbin/ami_cleanup.sh
   ```

1. 從 Amazon EC2 主控台，在導覽窗格中選擇**執行個體**，選擇您的新執行個體，然後選擇**動作**、**執行個體狀態**和**停止**。

1. 使用 Amazon EC2 主控台或 AWS CLI [create-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-image.html) 從執行個體建立新的 AMI。

**從 Amazon EC2 主控台**

   1. 在導覽窗格中，選擇 **Instances (執行個體)**。

   1. 選擇您建立和修改的執行個體。

   1. 在**動作**中，選擇**映像**，然後選擇**建立映像**。

   1. 選擇 **Create Image (建立映像)**。

1. 在叢集組態的 [`CustomAmi`](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-Image-CustomAmi) 欄位中輸入新的 AMI ID，然後建立叢集。

------