

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

# 透過允許 AMI 在 Amazon EC2 控制 AMI 的探索及使用
<a name="ec2-allowed-amis"></a>

若要控制使用者在 AWS 帳戶對於 Amazon Machine Images (AMI) 的探索及使用，您可以使用*允許 AMI* 功能。您可指定 AMI 必須符合的條件，才能在您的帳戶中可見且可供使用。在啟用條件之後，啟動執行個體的使用者只會看到並存取符合指定條件的 AMI。例如，您可指定受信任的 AMI 供應商清單作為條件，只有來自這些供應商的 AMI 才可見且可供使用。

在啟用允許 AMI 設定之前，您可啟用*稽核模式*，以預覽 AMI 是否可見且可供使用。這可讓您根據需要調整條件，確保只有預期的 AMI 可見且可供您帳戶的使用者使用。此外，使用 [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) 命令，來尋找使用不符合指定條件的 AMI 啟動的執行個體。此資訊可指導您決定是否更新啟動組態以使用符合規範的 AMI (例如，在啟動範本指定不同 AMI)，或調整條件以允許這些 AMI。

您可直接在帳戶或使用宣告式政策，在帳戶層級指定允許 AMI 設定。這些設定必須在您想要控制 AMI 用量的每個 AWS 區域 位置設定。您可使用宣告式政策同時在多個區域及多個帳戶套用設定。使用宣告式政策時，您無法直接在帳戶中修改設定。本主題說明如何直接在帳戶內配置設定。如需使用宣告式政策的相關資訊，請參閱「AWS Organizations 使用者指南」**中的[宣告式政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

**注意**  
允許 AMI 功能僅可針對公共 AMI 或與您的帳戶共享的 AMI 控制其探索及使用。其不限制您帳戶擁有的 AMI。無論您設定什麼條件，您帳戶建立的 AMI 一律可供您帳戶的使用者探索及使用。

**允許 AMI 的主要優點**
+ **合規性和安全性**：使用者只能探索及使用符合指定條件的 AMI，進而降低以不合規方式使用 AMI 的風險。
+ **高效管理**：透過減少允許 AMI 數量可讓管理剩餘的 AMI 變得更簡單、更有效率。
+ **集中帳戶層級實作**：直接在帳戶內或使用宣告式政策，在帳戶層級配置允許 AMI 設定。這可提供集中且有效的方式來控制整個帳戶的 AMI 使用情況。

**Topics**
+ [允許 AMI 運作方式](#how-allowed-amis-works)
+ [實作允許 AMI 的最佳實務](#best-practice-for-implementing-allowed-amis)
+ [所需的 IAM 許可](#iam-permissions-for-allowed-amis)
+ [管理允許的 AMI 的設定](manage-settings-allowed-amis.md)

## 允許 AMI 運作方式
<a name="how-allowed-amis-works"></a>

如需控制在帳戶中可探索及使用哪些 AMI，您可定義評估 AMI 的條件集。這些條件由如下圖所示的一個或多個 `ImageCriterion` 組成。說明性文字遵循圖表。

![允許的 AMI ImageCriteria 組態階層。](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/ami_allowed-amis-imagecriteria.png)


組態具有三個層級：
+ **1** – 參數值
  + 多值參數：
    + `ImageProviders`
    + `ImageNames`
    + `MarketplaceProductCodes`

      AMI 可比對參數內允許的*任何*值。

      範例：`ImageProviders` = `amazon` **OR** 帳戶 `111122223333` **OR** 帳戶 `444455556666` (圖表中並未顯示參數值的評估邏輯。)
  + 單一值參數：
    + `CreationDateCondition`
    + `DeprecationTimeCondition`
+ **2** – `ImageCriterion`
  + 透過 **AND** 邏輯來分組多個參數。
  + AMI 必須比對 `ImageCriterion` 允許的*所有*參數。
  + 範例：`ImageProviders` = `amazon` **AND** `CreationDateCondition` = 300 天或以下
+ **3** – `ImageCriteria`
  + 使用 **OR** 邏輯來分組多個 `ImageCriterion`。
  + AMI 可比對允許的*任何* `ImageCriterion`。
  + 構成用於評估 AMI 的完整組態。

**Topics**
+ [允許的 AMI 參數](#allowed-amis-criteria)
+ [允許的 AMI 組態](#allowed-amis-json-configuration)
+ [條件評估方式](#how-allowed-amis-criteria-are-evaluated)
+ [限制](#allowed-amis-json-configuration-limits)
+ [允許 AMI 操作](#allowed-amis-operations)

### 允許的 AMI 參數
<a name="allowed-amis-criteria"></a>

還可設定以下參數來建立 `ImageCriterion`：

`ImageProviders`  
允許其 AMI 的 AMI 服務提供者。  
有效值是由 AWS和 AWS 帳戶 IDs 定義的別名，如下所示：  
+ `amazon` - 此別名可識別由 Amazon 的經驗證的服務提供者建立的 AMI
+ `aws-marketplace` – 識別 中已驗證提供者所建立 AMIs 的別名 AWS Marketplace
+ `aws-backup-vault` - 此別名可識別位於邏輯氣隙 AWS 備份保存庫帳戶的備份 AMI。如果您使用 AWS Backup 邏輯氣隙隔離保存庫功能，請確定此別名包含為 AMI 供應商。
+ AWS 帳戶 IDs – 一或多個 12 位數 AWS 帳戶 IDs
+ `none` - 表示只能探索及使用由您帳戶建立的 AMI。無法探索及使用公用或共用 AMI。指定後不可指定其他條件。

`ImageNames`  
允許的 AMI 名稱，使用完全相符或萬用字元 (`?` 或 `*`)。

`MarketplaceProductCodes`  
允許 AMIs AWS Marketplace 的產品代碼。

`CreationDateCondition`  
允許的 AMI 的最長存留期。

`DeprecationTimeCondition`  
自允許的 AMI 棄用以來的最長期間。

若要了解每個條件的有效值與約束條件，請參閱 *Amazon EC2 API 參考*中的 [ImageCriterionRequest](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImageCriterionRequest.html)。

### 允許的 AMI 組態
<a name="allowed-amis-json-configuration"></a>

允許的 AMI 核心組態為 `ImageCriteria` 組態，其定義允許 AMI 的條件。下面的 JSON 結構顯示可指定的參數：

```
{
    "State": "enabled" | "disabled" | "audit-mode",  
    "ImageCriteria" : [
        {
            "ImageProviders": ["string",...],
            "MarketplaceProductCodes": ["string",...],           
            "ImageNames":["string",...],
            "CreationDateCondition" : {
                "MaximumDaysSinceCreated": integer
            },
            "DeprecationTimeCondition" : {
                "MaximumDaysSinceDeprecated": integer
            }
         },
         ...
}
```

#### ImageCriteria 範例
<a name="allowed-amis-json-configuration-example"></a>

下面的 `ImageCriteria` 範例可設定四個 `ImageCriterion`。若 AMI 與這些 `ImageCriterion` 中的任何一個相符，則允許該 AMI。若要了解有關如何評估條件的詳細資訊，請參閱 [條件評估方式](#how-allowed-amis-criteria-are-evaluated)。

```
{
    "ImageCriteria": [
        // ImageCriterion 1: Allow AWS Marketplace AMIs with product code "abcdefg1234567890"
        {
            "MarketplaceProductCodes": [
                "{{abcdefg1234567890}}"
            ]
        },
        // ImageCriterion 2: Allow AMIs from providers whose accounts are
        // "123456789012" OR "123456789013" AND AMI age is less than 300 days
        {
            "ImageProviders": [
                "{{123456789012}}",
                "{{123456789013}}"
            ],
            "CreationDateCondition": {
                "MaximumDaysSinceCreated": {{300}}
            }
        },
        // ImageCriterion 3: Allow AMIs from provider whose account is "123456789014" 
        // AND with names following the pattern "golden-ami-*"
        {
            "ImageProviders": [
                "{{123456789014}}"
            ],
            "ImageNames": [
                "{{golden-ami-*}}"
            ]
        },
        // ImageCriterion 4: Allow AMIs from Amazon or verified providers 
        // AND which aren't deprecated
        {
            "ImageProviders": [
                "amazon"
            ],
            "DeprecationTimeCondition": {
                "MaximumDaysSinceDeprecated": {{0}}
            }
        }
    ]
}
```

### 條件評估方式
<a name="how-allowed-amis-criteria-are-evaluated"></a>

下表說明了確定是否允許 AMI 的評估規則，並顯示了 `AND` 或 `OR` 運算子如何在每個層級套用：


| 評估層級 | 運算子 | 需要是允許的 AMI | 
| --- | --- | --- | 
| ImageProviders、ImageNames 及 MarketplaceProductCodes 的參數值 | OR | AMI 必須與每個參數清單中至少一個值相符 | 
| ImageCriterion | AND | AMI 必須與每個 ImageCriterion 的全部參數相符 | 
| ImageCriteria | OR | AMI 必須與 ImageCriterion 任意一個參數相符 | 

我們使用上述評估規則，來了解如何套用規則至 [ImageCriteria 範例](#allowed-amis-json-configuration-example)：
+ `ImageCriterion` 1：允許具有 AWS Marketplace 產品代碼的 AMIs `abcdefg1234567890`

  `OR`
+ `ImageCriterion` 2：允許滿足以下兩項條件的 AMI：
  + 由任一帳戶 `123456789012` `OR` `123456789013` 擁有
    + `AND`
  + 在過去 300 天內建立

  `OR`
+ `ImageCriterion` 3：允許滿足以下兩項條件的 AMI：
  + 由帳戶 `123456789014` 擁有
    + `AND`
  + 以模式 `golden-ami-*` 命名

  `OR`
+ `ImageCriterion` 4：允許滿足以下兩項條件的 AMI：
  + 由 Amazon 或經驗證的服務提供者發布 (由 `amazon` 別名指定)
    + `AND`
  + 未棄用 (自棄用以來的最長天數為 `0`)

### 限制
<a name="allowed-amis-json-configuration-limits"></a>

`ImageCriteria` 可包括最多：
+ 10 `ImageCriterion`

每個 `ImageCriterion` 可包括最多：
+ `ImageProviders` 的 200 個值
+ `ImageNames` 的 50 個值 
+ `MarketplaceProductCodes` 的 50 個值 

**限制範例**

使用上述 [ImageCriteria 範例](#allowed-amis-json-configuration-example)：
+ 有 4 個 `ImageCriterion`。最多可新增 6 個至請求，達到上限 10 個。
+ 在第一個 `ImageCriterion` 中， 有 1 個 `MarketplaceProductCodes` 的值。最多可新增 49 個至此 `ImageCriterion`，達到上限 50 個。
+ 在第二個 `ImageCriterion` 中， 有 2 個 `ImageProviders` 的值。最多可新增 198 個至此 `ImageCriterion`，達到上限 200 個。
+ 在第三個 `ImageCriterion` 中， 有 1 個 `ImageNames` 的值。最多可新增 49 個至此 `ImageCriterion`，達到上限 50 個。

### 允許 AMI 操作
<a name="allowed-amis-operations"></a>

允許的 AMI 功能有三種操作狀態來管理映像條件：**已啟用**、**已停用**和**稽核模式**。這些模式可讓您啟用或停用映像條件，或根據需要來檢閱這些條件。

**已啟用**

當啟用允許 AMI 時：
+ 會套用 `ImageCriteria`。
+ 僅可在 EC2 主控台以及透過使用映像的 API (例如，描述、複製、儲存或執行使用映像的其他動作) 來探索允許 AMI。
+ 只能使用允許 AMI 啟動執行個體。

**Disabled**

當停用允許 AMI 時：
+ 不會套用 `ImageCriteria`。
+ AMI 的可探索性或使用方式不受任何限制。

**稽核模式**

 在稽核模式中：
+ 會套用 `ImageCriteria`，但 AMI 的可探索性或使用方式不受任何限制。
+ 在 EC2 主控台中，對於每個 AMI，**允許映像**欄位會顯示**是**或**否**，以指示啟用允許 AMI 時，帳戶使用者可否探索及使用該 AMI。
+ 在命令列，`describe-image` 操作的回應包括 `"ImageAllowed": true` 或 `"ImageAllowed": false`，以指示當允許 AMI 啟用時，帳戶使用者可否探索及使用 AMI。
+ 在 EC2 主控台，當啟用允許 AMI 時，AMI 目錄會在帳戶使用者無法探索或使用的 AMI 旁邊顯示**不允許**。

## 實作允許 AMI 的最佳實務
<a name="best-practice-for-implementing-allowed-amis"></a>

實作允許 AMIs 時，請考慮這些最佳實務，以確保順利轉換，並將對您 AWS 環境的潛在干擾降至最低。

1. **啟用稽核模式**

   從在稽核模式啟用允許 AMI 開始。此狀態可讓您無需實際限制存取，即可查看哪些 AMI 會受到您的條件影響，提供無風險的評估期。

1. **設定允許 AMI 條件**

   仔細確定哪些 AMI 供應商符合您組織的安全性策略、合規性要求和營運需求。
**注意**  
使用 AWS 受管服務時，例如 Amazon ECS、Amazon EKS 或 AWS Lambda `amazon` 受管執行個體，建議您指定別名以允許 建立AMIs AWS。這些服務取決於 Amazon 發布的 AMI 來啟動執行個體。  
設定任何 AMI `CreationDateCondition` 約束條件時要謹慎。設定過度限制的日期條件 （例如，AMIs 必須少於 5 天） 可能會導致執行個體啟動失敗，無論 AMIs 來自 AWS 或其他供應商，都不會在您指定的時間範圍內更新。  
建議將 `ImageNames` 與 `ImageProviders` 配對，以便實現更好的控制與特徵。單獨使用 `ImageNames` 可能無法唯一識別 AMI。

1. **檢查對預期業務流程的影響**

   您可使用主控台或者 CLI，來確定透過不滿足指定條件的 AMI 來啟動的任何執行個體。此資訊可指導您決定是否更新啟動組態以使用符合規範的 AMI (例如，在啟動範本指定不同 AMI)，或調整條件以允許這些 AMI。

   主控台：使用 [ec2-instance-launched-with-allowed-ami](https://docs.aws.amazon.com/config/latest/developerguide/ec2-instance-launched-with-allowed-ami.html) AWS Config 規則，檢查執行中或已停止的執行個體是否使用AMIs 啟動。 AMIs 若 AMI 不滿足允許的 AMI 條件，則規則為 **NON\_COMPLIANT**；若滿足條件，則規則為 **COMPLIANT**。僅當允許的 AMI 設定被設為**已啟用**或**稽核模式**時，規則才能運作。

   CLI：執行 [describe-instance-image-metadata](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-image-metadata.html) 命令並篩選回應，確定使用不符合指定條件的 AMI 啟動的任何執行個體。

   若要了解主控台與 CLI 的說明，請參閱 [尋找透過不允許的 AMI 啟動的執行個體](manage-settings-allowed-amis.md#identify-instances-with-allowed-AMIs)。

1. **啟用允許 AMI**

   在確認條件不會對預期業務流程產生負面影響之後，請啟用允許 AMI。

1. **監控執行個體啟動**

   繼續監控您應用程式和所用 AWS 受管服務的 AMIs 執行個體啟動，例如 Amazon EMR、Amazon ECR、Amazon EKS 和 AWS Elastic Beanstalk。檢查是否有任何意外問題，並對允許 AMI 條件進行必要調整。

1. **試驗新的 AMI**

   若要測試不符合目前允許 AMIs 設定的第三方 AMIs， AWS 建議下列方法：
   + 使用單獨的 AWS 帳戶：建立無法存取您關鍵業務資源的帳戶。確認在此帳戶中，未啟用允許的 AMI 設定；或者明確允許您想要測試的 AMI，以便測試這些 AMI。
   + 在另一個測試 AWS 區域：使用可使用第三方 AMIs的區域，但您尚未啟用允許 AMIs設定的區域。

   在測試新的 AMI 時，這些方法可協助確保您的業務關鍵性資源保持安全。

## 所需的 IAM 許可
<a name="iam-permissions-for-allowed-amis"></a>

若要使用允許 AMI 功能，您需要下列 IAM 許可：
+ `GetAllowedImagesSettings`
+ `EnableAllowedImagesSettings`
+ `DisableAllowedImagesSettings`
+ `ReplaceImageCriteriaInAllowedImagesSettings`