

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

# Spot Fleet 許可
<a name="spot-fleet-prerequisites"></a>

**重要**  
Spot Fleet 使用沒有計劃投資的舊版 API。我們建議您改用 EC2 Fleet 或 Auto Scaling 群組。如需詳細資訊，請參閱[最好的機群方法是什麼？](which-fleet-method-to-use.md)。

如果使用者將會建立或管理 Spot 機群，您必須授予這些使用者所需的許可。

如果使用 Amazon EC2 主控台來建立 Spot Fleet，它會建立名為 `AWSServiceRoleForEC2SpotFleet` 和 `AWSServiceRoleForEC2Spot` 的兩個服務連結角色，以及名為 `aws-ec2-spot-fleet-tagging-role` 的角色來授與 Spot Fleet 許可，以代表您請求、啟動、終止和標記資源。如果您使用 AWS CLI 或 API，您必須確保這些角色存在。

請使用下列指示，授與必要的許可並建立角色。

**Topics**
+ [將 Spot 機群的許可授予使用者](#spot-fleet-iam-users)
+ [Spot Fleet 的服務連結角色](#service-linked-roles-spot-fleet-requests)
+ [Spot 執行個體的服務連結角色](#service-linked-roles-spot-instances)
+ [標記 Spot Fleet 的 IAM 角色](#spot-fleet-service-linked-role)

## 將 Spot 機群的許可授予使用者
<a name="spot-fleet-iam-users"></a>

如果使用者將會建立或管理 Spot 機群，請務必授予這些使用者所需的許可。

**為 Spot 機群建立政策**

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**政策**、**建立政策**。

1. 在**建立政策**頁面上，選擇 **JSON**，使用下列內容來替代其文字。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:RunInstances",
                   "ec2:CreateTags",
                   "ec2:RequestSpotFleet",
                   "ec2:ModifySpotFleetRequest",
                   "ec2:CancelSpotFleetRequests",
                   "ec2:DescribeSpotFleetRequests",
                   "ec2:DescribeSpotFleetInstances",
                   "ec2:DescribeSpotFleetRequestHistory"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::*:role/aws-ec2-spot-fleet-tagging-role"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iam:CreateServiceLinkedRole",
                   "iam:ListRoles",
                   "iam:ListInstanceProfiles"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

   上述範例政策會向使用者授予大多數 Spot Fleet 使用案例所需的許可。若要將使用者限制於特定的 API 動作，請改為僅指定這些 API 動作。

   **需要的 EC2 和 IAM API**

   必須在原則中包含下列 API：
   + `ec2:RunInstances` – 在 Spot Fleet 中啟動執行個體所需
   + `ec2:CreateTags` – 標記 Spot Fleet 請求、執行個體或磁碟區所需
   + `iam:PassRole` – 指定 Spot Fleet 角色所需
   + `iam:CreateServiceLinkedRole` – 建立服務連結角色所需
   + `iam:ListRoles` – 列舉現有 IAM 角色所需
   + `iam:ListInstanceProfiles` – 列舉現有執行個體描述檔所需
**重要**  
如果您在啟動規格或啟動範本中為 IAM 執行個體設定檔指定角色，您必須授予使用者許可，以將角色傳遞到服務。若要執行此操作，請在 IAM 政策中包含 `"arn:aws:iam::*:role/{{IamInstanceProfile-role}}"`，做為 `iam:PassRole` 動作的資源。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[授予使用者將角色傳遞至 AWS 服務的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

   **Spot Fleet API**

   視需要將下列 Spot Fleet API 動作新增至您的政策：
   + `ec2:RequestSpotFleet`
   + `ec2:ModifySpotFleetRequest`
   + `ec2:CancelSpotFleetRequests`
   + `ec2:DescribeSpotFleetRequests`
   + `ec2:DescribeSpotFleetInstances`
   + `ec2:DescribeSpotFleetRequestHistory`

   **選用的 IAM API**

   (選用) 若要讓使用者能夠使用 IAM 主控台建立角色或執行個體設定檔，您必須將下列動作新增至政策中：
   + `iam:AddRoleToInstanceProfile`
   + `iam:AttachRolePolicy`
   + `iam:CreateInstanceProfile`
   + `iam:CreateRole`
   + `iam:GetRole`
   + `iam:ListPolicies`

1. 選擇**檢閱政策**。

1. 在 **Review policy (檢閱政策)** 頁面上，輸入政策名稱和說明，然後選擇 **Create policy (建立政策)**。

1. 若要提供存取權，請新增權限至您的使用者、群組或角色：
   + 中的使用者和群組 AWS IAM Identity Center：

     建立權限合集。請按照《*AWS IAM Identity Center 使用者指南*》中的[建立權限合集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)說明進行操作。
   + 透過身分提供者在 IAM 中管理的使用者：

     建立聯合身分的角色。遵循《*IAM 使用者指南*》的[為第三方身分提供者 (聯合) 建立角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)中的指示。
   + IAM 使用者：
     + 建立您的使用者可擔任的角色。請按照《*IAM 使用者指南*》的[為 IAM 使用者建立角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)中的指示。
     + (不建議) 將政策直接附加至使用者，或將使用者新增至使用者群組。請遵循《*IAM 使用者指南*》的[新增許可到使用者 (主控台)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) 中的指示。

## Spot Fleet 的服務連結角色
<a name="service-linked-roles-spot-fleet-requests"></a>

Amazon EC2 使用許可的服務連結角色，它需要代表您呼叫其他 AWS 服務。服務連結角色是直接連結至 AWS 服務的唯一 IAM 角色類型。服務連結角色提供將許可委派給 AWS 服務的安全方式，因為只有連結的服務可以擔任服務連結角色。如需詳細資訊，請參閱「IAM 使用者指南」**中的[服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html)。

Amazon EC2 使用名為 **AWSServiceRoleForEC2SpotFleet** 的服務連結角色來代您管理執行個體。

**重要**  
如果您在 Spot 機群中指定[加密的 AMI](AMIEncryption.md) 或加密的 Amazon EBS 快照，則必須授予 **AWSServiceRoleForEC2SpotFleet** 角色許可才能使用 CMK，使得 Amazon EC2 可以代表您啟動執行個體。如需詳細資訊，請參閱[授與 CMK 的存取權，以便與加密的 AMI 和 EBS 快照搭配使用](#spot-fleet-service-linked-roles-access-to-cmks)。

### AWSServiceRoleForEC2SpotFleet 授與的許可
<a name="service-linked-role-permissions-granted-by-AWSServiceRoleForEC2SpotFleet"></a>

**AWSServiceRoleForEC2SpotFleet** 角色會授予 Spot 機群許可，以代表您請求、啟動、終止及標記執行個體。Amazon EC2 會使用此服務連結角色來完成下列動作：
+ `ec2:RequestSpotInstances` - 請求 競價型執行個體
+ `ec2:RunInstances` - 啟動執行個體
+ `ec2:TerminateInstances` - 終止執行個體
+ `ec2:DescribeImages` - 描述 Amazon Machine Images (AMI) 的執行個體
+ `ec2:DescribeInstanceStatus` - 監控執行個體的狀態
+ `ec2:DescribeSubnets` - 描述執行個體的子網絡
+ `ec2:CreateTags` - 將標籤新增至 Spot Fleet 請求、執行個體和磁碟區
+ `elasticloadbalancing:RegisterInstancesWithLoadBalancer` - 將指定執行個體新增到指定的負載平衡器
+ `elasticloadbalancing:RegisterTargets` - 向指定的目標群組登錄指定的目標

### 建立服務連結角色
<a name="service-linked-role-creating-for-spot-fleet"></a>

在大部分情況下，您不需要手動建立服務連結角色。您第一次使用主控台建立 Spot Fleet 時，Amazon EC2 會建立 **AWSServiceRoleForEC2SpotFleet** 服務連結角色。

如果您在 2017 年 10 月之前擁有使用中的 Spot Fleet 請求，則當 Amazon EC2 開始支援此服務連結角色時，Amazon EC2 會在您的 AWS 帳戶中建立 **AWSServiceRoleForEC2SpotFleet** 角色。如需詳細資訊，請參閱[《IAM 使用者指南》中的我的 AWS 帳戶中出現的新角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_roles.html#troubleshoot_roles_new-role-appeared)。 **

如果您使用 AWS CLI 或 API 來建立 Spot 機群，您必須先確保此角色存在。

**使用主控台為 Spot 機群建立 AWSServiceRoleForEC2SpotFleet 角色**

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**角色**。

1. 選擇 **Create Role** (建立角色)。

1. 在 **Select trusted entity** (選取信任的實體) 頁面上，執行以下作業：

   1. 針對**信任的實體類型**，請選擇 **AWS 服務**。

   1. 在**使用案例**下，針對**服務或使用案例**，選擇 **EC2**。

   1. 針對**使用案例**，請選擇 **EC2 - Spot 機群**。
**注意**  
**EC2 - Spot 機群**使用案例會自動建立具有必要 IAM 許可的政策，並將 **AWSEC2SpotFleetServiceRolePolicy** 建議做為角色名稱。

   1. 選擇**下一步**。

1. 在 **Add permissions** (新增許可) 頁面上，選擇 **Next** (下一步)。

1. 在**命名、檢閱和建立**頁面上，選擇**建立角色**。

**使用 建立 Spot Fleet 的 AWSServiceRoleForEC2SpotFleet 角色 AWS CLI**  
使用如下所示的 [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) 命令。

```
aws iam create-service-linked-role --aws-service-name spotfleet.amazonaws.com
```

如果您不再需要使用 Spot Fleet，建議您刪除 **AWSServiceRoleForEC2SpotFleet** 角色。從您的帳戶中刪除此角色後，如果您使用主控台請求 Spot Fleet，Amazon EC2 會再次建立此角色。如需詳細資訊，請參閱「IAM 使用者指南」**中的[刪除服務連結角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#id_roles_manage_delete_slr)。

### 授與 CMK 的存取權，以便與加密的 AMI 和 EBS 快照搭配使用
<a name="spot-fleet-service-linked-roles-access-to-cmks"></a>

如果您在 Spot 機群請求中指定[加密的 AMI](AMIEncryption.md) 或加密的 Amazon EBS 快照，並且使用客戶受管金鑰進行加密，則您必須授予 **AWSServiceRoleForEC2SpotFleet** 角色許可才能使用 CMK，使得 Amazon EC2 可以代表您啟動執行個體。若要執行此動作，您必須新增授與至 CMK，如以下列程序所示。

提供許可時，授與為金鑰政策的替代方案。如需詳細資訊，請參閱 *AWS Key Management Service 開發人員指南*中的[使用授予](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)和[在 AWS KMS中使用金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

**授與 AWSServiceRoleForEC2SpotFleet 角色許可以使用 CMK**
+ 使用 [create-grant](https://docs.aws.amazon.com/cli/latest/reference/kms/create-grant.html) 命令來新增授與至 CMK，並指定獲授與許可能夠執行授與所允許作業的委託人 (**AWSServiceRoleForEC2SpotFleet** 服務連結角色)。CMK 是透過 `key-id` 參數和 CMK 的 ARN 指定。委託人是透過 `grantee-principal` 參數和 **AWSServiceRoleForEC2SpotFleet** 服務連結角色的 ARN 指定。

  ```
  aws kms create-grant \
      --region {{us-east-1}} \
      --key-id arn:aws:kms:{{us-east-1}}:{{444455556666}}:key/{{1234abcd-12ab-34cd-56ef-1234567890ab}} \
      --grantee-principal arn:aws:iam::{{111122223333}}:role/aws-service-role/spotfleet.amazonaws.com/AWSServiceRoleForEC2SpotFleet \
      --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"
  ```

## Spot 執行個體的服務連結角色
<a name="service-linked-roles-spot-instances"></a>

Amazon EC2 使用名為 **AWSServiceRoleForEC2Spot** 的服務連結角色來代您管理 競價型執行個體。如需詳細資訊，請參閱[Spot 執行個體請求的服務連結角色](service-linked-roles-spot-instance-requests.md)。

## 標記 Spot Fleet 的 IAM 角色
<a name="spot-fleet-service-linked-role"></a>

`aws-ec2-spot-fleet-tagging-role` IAM 角色授予 Spot Fleet 許可，以標記 Spot Fleet 請求、執行個體和磁碟區。如需詳細資訊，請參閱[標記新的或現有的 Spot 機群請求及其啟動的執行個體和磁碟區](tag-spot-fleet.md)。

**重要**  
如果您選擇標記機群中的執行個體，並也選擇維護目標容量 (Spot 機群請求為類型 `maintain`)，為使用者與 `IamFleetRole` 所設定的許可差異可能會導致機群中執行個體標記行為的不一致。如果 `IamFleetRole` 不包含 `CreateTags` 許可，則可能無法標記由機群啟動的某些執行個體。雖然我們正在努力修正此不一致，但為了確保標記由機群啟動的所有執行個體，建議您針對 `IamFleetRole` 使用 `aws-ec2-spot-fleet-tagging-role` 角色。或者，若要使用現有角色，請將 `AmazonEC2SpotFleetTaggingRole` AWS 受管政策連接至現有角色。否則，您需要手動將 `CreateTags` 許可新增至現有政策。

**若要建立用於標記 Spot Fleet 的 IAM 角色**

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**角色**。

1. 選擇 **Create Role** (建立角色)。

1. 在 **Select trusted entity** (選取受信任實體) 頁面，於 **Trusted entity type** (受信任實體的類型) 下，選擇 **AWS service** ( 服務)。

1. 在 **Use case** (使用案例) 下，從 **Use cases for other AWS services** (其他服務的使用案例)，選擇 **EC2**，然後選擇 **EC2 - Spot Fleet Tagging** (EC2 - Spot 機群標記)。

1. 選擇**下一步**。

1. 在 **Add permissions** (新增許可) 頁面上，選擇 **Next** (下一步)。

1. 在 **Name, review, and create** (名稱，檢閱和建立) 頁面上，針對 **Role name** (角色名稱) 輸入角色的名稱 (例如 **aws-ec2-spot-fleet-tagging-role**)。

1. 檢視頁面上的資訊，然後選擇 **Create role** (建立角色)。

### 預防跨服務混淆代理人
<a name="cross-service-confused-deputy-prevention"></a>

[混淆代理人問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)屬於安全性議題，其中沒有執行動作許可的實體可以強制具有更多權限的實體執行該動作。若要限制 Spot 機群為資源提供另一項服務的許可，我們建議在 `aws-ec2-spot-fleet-tagging-role` 信任政策中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全域條件內容金鑰。

**將 aws:SourceArn 和 aws:SourceAccount 條件金鑰新增至 `aws-ec2-spot-fleet-tagging-role` 信任政策**

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**角色**。

1. 尋找您先前建立的 `aws-ec2-spot-fleet-tagging-role`，並選擇連結 (而非核取方塊)。

1. 在 **Summary** (摘要) 下，選擇 **Trust relationships** (信任關係) 索引標籤，然後選擇 **Edit trust policy** (編輯信任政策)。

1. 在 JSON 陳述式中，加入一個 `Condition` 元素，其中包含 `aws:SourceAccount` 和 `aws:SourceArn` 全域條件內容金鑰來防止[混淆代理問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)，如下所式：

   ```
   "Condition": {
         "ArnLike": {
           "aws:SourceArn": "arn:aws:ec2:us-east-1:{{111122223333}}:spot-fleet-request/sfr-*"
         },
         "StringEquals": {
           "aws:SourceAccount": "{{111122223333}}"
         }
   ```
**注意**  
如果 `aws:SourceArn` 值包含帳戶 ID，且同時使用這兩個全域條件內容金鑰，則在相同政策陳述式中使用 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的帳戶時，必須使用相同的帳戶 ID。

   最終信任政策如下所示：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Sid": "ConfusedDeputyPreventionExamplePolicy",
       "Effect": "Allow",
       "Principal": {
         "Service": "spotfleet.amazonaws.com"
       },
       "Action": "sts:AssumeRole",
       "Condition": {
         "ArnLike": {
           "aws:SourceArn": "arn:aws:ec2:{{us-east-1}}:{{111122223333}}:spot-fleet-request/sfr-*"
         },
         "StringEquals": {
           "aws:SourceAccount": "{{111122223333}}"
         }
       }
     }
   }
   ```

------

1. 選擇**更新政策**。

下表提供了 `aws:SourceArn` 的潛在值，以不同程度地限制 `aws-ec2-spot-fleet-tagging-role` 的範圍。


****  

| API 操作 | 呼叫的服務 | Scope (範圍) | `aws:SourceArn` | 
| --- | --- | --- | --- | 
| RequestSpotFleet | AWS STS (AssumeRole) | 將 aws-ec2-spot-fleet-tagging-role 上的 AssumeRole 功能限制為指定帳戶中的 spot-fleet-requests。 | arn:aws:ec2:\*:{{123456789012}}:spot-fleet-request/sfr-\* | 
| RequestSpotFleet | AWS STS (AssumeRole) | 將 aws-ec2-spot-fleet-tagging-role 上的 AssumeRole 功能限制為指定帳戶和指定區域中的 spot-fleet-requests。請注意，此角色在其他區域中無法使用。 | arn:aws:ec2:{{us-east-1}}:{{123456789012}}:spot-fleet-request/sfr-\* | 
| RequestSpotFleet | AWS STS (AssumeRole) | 將 aws-ec2-spot-fleet-tagging-role 上的 AssumeRole 功能限制為僅限影響機群 sfr-11111111-1111-1111-1111-111111111111 的動作。請注意，此角色可能無法用於其他 Spot 機群。此外，此角色無法用於透過 request-spot-fleet 啟動任何新的 Spot 機群。 | arn:aws:ec2:{{us-east-1}}:{{123456789012}}:spot-fleet-request/sfr-{{11111111-1111-1111-1111-111111111111}} | 