

# スポットフリートアクセス許可
<a name="spot-fleet-prerequisites"></a>

ユーザーがスポットフリートを作成または管理する場合、必要な許可を付与する必要があります。

Amazon EC2 コンソールを使用してスポットフリートを作成した場合、`AWSServiceRoleForEC2SpotFleet` および `AWSServiceRoleForEC2Spot` というサービスにリンクされた 2 つのロールと、`aws-ec2-spot-fleet-tagging-role` というロールが作成されます。ユーザーの代わりに、リソースのリクエスト、起動、終了、タグ付けを行うアクセス許可をスポットフリートに与えます。AWS CLI または API を使用する場合は、これらのロールが存在することを確認する必要があります。

次の手順に従って、必要なアクセス許可を付与し、ロールを作成します。

**Topics**
+ [ユーザーにスポットフリートの許可を付与する](#spot-fleet-iam-users)
+ [スポットフリート用のサービスにリンクされたロール](#service-linked-roles-spot-fleet-requests)
+ [スポットインスタンス用のサービスにリンクされたロール](#service-linked-roles-spot-instances)
+ [スポットフリートにタグ付けするための IAM ロール](#spot-fleet-service-linked-role)

## ユーザーにスポットフリートの許可を付与する
<a name="spot-fleet-iam-users"></a>

ユーザーがスポットフリートを作成または管理する場合、必ず必要な許可を付与してください。

**スポットフリートのポリシーを作成するには**

1. IAM コンソールの [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開いてください。

1. ナビゲーションペインで、[Policies]、[Create policy] の順に選択してください。********

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": "*"
           }
       ]
   }
   ```

------

   前述したポリシーの例では、ほとんどのスポットフリートのユースケースで必要な許可をユーザーに付与します。特定の API アクションに制限するには、代わりにこれらの API アクションのみを指定します。

   必要な EC2 および IAM の API****

   ポリシーには、次の API を含める必要があります。
   + `ec2:RunInstances` - スポットフリートでインスタンスを起動するために必要
   + `ec2:CreateTags` - スポットフリートのリクエスト、インスタンス、またはボリュームのタグ付けに必要
   + `iam:PassRole` - スポットフリートロールを指定するために必要
   + `iam:CreateServiceLinkedRole` - サービスにリンクされたロールの作成に必要
   + `iam:ListRoles` - 既存の IAM ロールを列挙するために必要
   + `iam:ListInstanceProfiles` - 既存のインスタンスプロファイルを列挙するために必要
**重要**  
起動仕様または起動テンプレートで IAM インスタンスプロファイルのロールを指定する場合は、そのロールをサービスに渡す許可をユーザーに付与する必要があります。これを行うには、IAM ポリシーで `iam:PassRole` アクションのリソースとして `"arn:aws:iam::*:role/IamInstanceProfile-role"` を含めます。詳細については、「IAM ユーザーガイド」の「[AWS サービスにロールを渡すアクセス権限をユーザーに付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)」を参照してください。

   スポットフリートの API****

   必要に応じて、次のスポットフリート 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. [**ポリシーの確認**] ページでポリシー名と説明を入力し、[**ポリシーの作成**] を選択してください。

1. アクセス権限を付与するにはユーザー、グループ、またはロールにアクセス許可を追加します。
   + AWS IAM アイデンティティセンター のユーザーとグループ:

     アクセス許可セットを作成します。「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[アクセス許可セットを作成する](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)」の手順に従ってください。
   + IAM 内で、ID プロバイダーによって管理されているユーザー:

     ID フェデレーションのロールを作成します。詳細については *IAM ユーザーガイド* の [サードパーティー ID プロバイダー (フェデレーション) 用のロールを作成する](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) の指示に従います。

## スポットフリート用のサービスにリンクされたロール
<a name="service-linked-roles-spot-fleet-requests"></a>

Amazon EC2 は、ユーザーに代わって AWS の他のサービスを呼び出すために必要なアクセス許可のために、サービスにリンクされたロールを使用します。サービスにリンクされたロールは、AWS のサービスに直接リンクされた一意のタイプの IAM ロールです。サービスにリンクされたロールは、AWS のサービスにアクセス許可を委任するためのセキュアな方法を提供します。これは、リンクされたサービスのみが、サービスにリンクされたロールを引き受けることができるためです。詳細については「*IAM ユーザーガイド*」の「[Service-linked roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html)」を参照してください。

Amazon EC2 は、AWSServiceRoleForEC2SpotFleet という、サービスにリンクされたロールを使用して、ユーザーの代わりにインスタンスを起動して管理します。****

**重要**  
[暗号化された AMI](AMIEncryption.md) または暗号化された Amazon EBS スナップショットをスポットフリートで指定した場合は、CMK を使用して Amazon EC2 がユーザーの代わりにインスタンスを起動する許可を **AWSServiceRoleForEC2SpotFleet** ロールに付与する必要があります。詳細については、「[暗号化された AMI および EBS スナップショット用の CMK へのアクセス権の付与](#spot-fleet-service-linked-roles-access-to-cmks)」を参照してください。

### AWSServiceRoleForEC2SpotFleet によって付与されるアクセス許可
<a name="service-linked-role-permissions-granted-by-AWSServiceRoleForEC2SpotFleet"></a>

**[AWSServiceRoleForEC2SpotFleet]** ロールは、ユーザーに代わってインスタンスのリクエスト、起動、終了、タグ付けを行う許可をスポットフリートに付与します。Amazon EC2 は、このサービスにリンクされたロールを使用して、以下のアクションを完了します。
+ `ec2:RequestSpotInstances` - スポットインスタンスをリクエスト
+ `ec2:RunInstances` - インスタンスを起動
+ `ec2:TerminateInstances` - インスタンスを終了
+ `ec2:DescribeImages` - インスタンスの Amazon マシンイメージ (AMI) を表示
+ `ec2:DescribeInstanceStatus` - インスタンスのステータスを表示
+ `ec2:DescribeSubnets` - インスタンスのサブネットを記述
+ `ec2:CreateTags` - スポットフリートリクエスト、インスタンス、ボリュームにタグを追加
+ `elasticloadbalancing:RegisterInstancesWithLoadBalancer` - 指定されたインスタンスを指定されたロードバランサーに追加
+ `elasticloadbalancing:RegisterTargets` - 指定されたターゲットを指定されたターゲットグループに登録

### サービスにリンクされたロールの作成
<a name="service-linked-role-creating-for-spot-fleet"></a>

ほとんどの状況では、サービスにリンクされたロールを手動で作成する必要はありません。Amazon EC2 は、コンソールを使用してスポットフリートを初めて作成するときに、**AWSServiceRoleForEC2SpotFleet** サービスにリンクされたロールを作成します。

Amazon EC2 がこのサービスにリンクされたロールのサポートを開始した 2017 年 10 月よりも前にアクティブなスポットフリートリクエストを行った場合、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 を使用してスポットフリートを作成する場合、最初にこのロールが存在しているか確認する必要があります。

**コンソールを使用してスポットフリートの [AWSServiceRoleForEC2SpotFleet] ロールを作成するには**

1. IAM コンソールの [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開いてください。

1. ナビゲーションペインで **Roles (ロール) ** を選択してください。

1. [**Create role**] を選択してください。

1. **[信頼されたエンティティを選択]** ページで、以下の操作を実行してください。

   1. **[信頼できるエンティティタイプ]** で、**[AWS サービス]** を選択してください。

   1. **[ユースケース]** の **[サービスまたはユースケース]** で、**[EC2]** を選択してください。

   1. **[ユースケース]** で、**[EC2 - スポットフリート]** を選択してください。
**注記**  
**[EC2 - スポットフリート]** ユースケースでは、必要な IAM アクセス許可を持つポリシーが自動的に作成され、ロール名として **[AWSEC2SpotFleetServiceRolePolicy]** が提案されます。

   1. [**Next**] を選択してください。

1. **[アクセス許可を追加]** ページで **[次へ]** を選択してください。

1. **[名前、確認、および作成]** ページで、**[ロールの作成]** をクリックしてください。

**AWS CLI を使用してスポットフリートの [AWSServiceRoleForEC2SpotFleet] ロールを作成するには**  
次のように、create-service-linked-role コマンドを使用します。[https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html](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
```

スポットフリートを使用する必要がなくなった場合は、**AWSServiceRoleForEC2SpotFleet** ロールを削除することをお勧めします。このロールがアカウントから削除された後、コンソールを使用してスポットフリートをリクエストすると､ Amazon EC2 はロールを再作成します。詳細については、「*IAM ユーザーガイド*」の「[サービスにリンクされたロールの削除](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#id_roles_manage_delete_slr)」を参照してください。

### 暗号化された AMI および EBS スナップショット用の CMK へのアクセス権の付与
<a name="spot-fleet-service-linked-roles-access-to-cmks"></a>

[暗号化された AMI](AMIEncryption.md) または暗号化された Amazon EBS スナップショットをスポットフリートリクエストで指定し、カスタマー管理された型キーを暗号化に使用する場合は、CMK を使用して、Amazon EC2 がユーザーの代わりにインスタンスを起動する許可を、**AWSServiceRoleForEC2SpotFleet** ロールに付与する必要があります。これを行うには、次の手順で示すように、CMK に付与を追加する必要があります。

アクセス権限を設定するときは、付与がキーポリシーの代わりになります。詳細については、 デベロッパーガイドの「許可の使用」と「 でのキーポリシーの使用」を参照してください。[https://docs.aws.amazon.com/kms/latest/developerguide/grants.html](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)[AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)*AWS Key Management Service*

**CMK を使用するアクセス許可を AWSServiceRoleForEC2SpotFleet ロールに付与するには**
+ create-grant コマンドを使用して CMK に付与を追加し、プリンシパル (サービスにリンクされたロール AWSServiceRoleForEC2SpotFleet) を指定します。このプリンシパルには、付与が許可するオペレーションを実行するためのアクセス許可が提供されます。[https://docs.aws.amazon.com/cli/latest/reference/kms/create-grant.html](https://docs.aws.amazon.com/cli/latest/reference/kms/create-grant.html)****CMK を指定するには、 パラメータと CMK の ARN を使用します。`key-id`プリンシパルを指定するには、 パラメータとサービスにリンクされたロール AWSServiceRoleForEC2SpotFleet の ARN を使用します。`grantee-principal`****

  ```
  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"
  ```

## スポットインスタンス用のサービスにリンクされたロール
<a name="service-linked-roles-spot-instances"></a>

Amazon EC2 は、AWSServiceRoleForEC2Spot という、サービスにリンクされたロールを使用して、ユーザーの代わりに スポットインスタンス を起動して管理します。****詳細については、「[スポットインスタンスリクエスト向けのサービスにリンクされたロール](service-linked-roles-spot-instance-requests.md)」を参照してください。

## スポットフリートにタグ付けするための IAM ロール
<a name="spot-fleet-service-linked-role"></a>

`aws-ec2-spot-fleet-tagging-role` IAM ロールは、スポットフリートリクエスト、インスタンス、ボリュームにタグ付けするアクセス権限をスポットフリートに付与します。詳細については、「[新しいまたは既存のスポットフリートリクエスト、およびそのフリートが起動するインスタンスとボリュームにタグ付けする](tag-spot-fleet.md)」を参照してください。

**重要**  
フリートのインスタンスにタグ付けすることを選択し、ターゲット容量を維持することを選択した場合 (スポットフリートリクエストのタイプは `maintain`)、ユーザーと `IamFleetRole` の許可の違いにより、フリートのインスタンスのタグ付け動作に整合性がなくなる可能性があります。`IamFleetRole` に `CreateTags` アクセス許可が含まれていない場合、フリートによって起動されたインスタンスの一部がタグ付けされていない可能性があります。当社はこの不整合の修正に取り組んでいますが、フリートによって起動されたすべてのインスタンスがタグ付けされるようにするために、`IamFleetRole`には`aws-ec2-spot-fleet-tagging-role`ロールを使用することをお勧めします。または、既存のロールを使用するには、`AmazonEC2SpotFleetTaggingRole` の AWS 管理ポリシーを既存のロールにアタッチします。それ以外の場合は、既存のポリシーに `CreateTags` アクセス許可を手動で追加する必要があります。

**スポットフリートにタグ付けする IAM ロールを作成するには**

1. IAM コンソールの [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) を開いてください。

1. ナビゲーションペインで **Roles (ロール) ** を選択してください。

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 - スポットフリートのタグ付け) を選択してください。

1. [**Next**] を選択してください。

1. **[アクセス許可を追加]** ページで **[次へ]** を選択してください。

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)は、アクションを実行するためのアクセス許可を持たないエンティティが、より特権のあるエンティティにアクションの実行を強制できてしまう場合に生じる、セキュリティ上の問題です。`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. ナビゲーションペインで **[Roles]** (ロール) を選択してください。

1. 前に作成した `aws-ec2-spot-fleet-tagging-role` を見つけ、リンク (チェックボックスではありません) を選択してください。

1. **[Summary]** (概要) にある **[Trust relationships]** (信頼関係) タブを開き、**[Edit trust policy]** (信頼ポリシーの編集) をクリックしてください。

1. [「混乱した代理」問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)を防止するために、JSON ステートメント内で、以下のようにグローバル条件コンテキストキー `aws:SourceAccount` および `aws:SourceArn` を含む `Condition` 要素を追加ます。

   ```
   "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-ec2-spot-fleet-tagging-role` の範囲を制限するために想定される `aws:SourceArn` の値を、その特異性の様々なレベルについてまとめました。


****  

| API オペレーション: | 呼び出されたサービス | スコープ | `aws:SourceArn` | 
| --- | --- | --- | --- | 
| RequestSpotFleet | AWS STS (AssumeRole) | aws-ec2-spot-fleet-tagging-role が持つ AssumeRole の機能を、指定されたアカウントの spot-fleet-requests に制限します。 | arn:aws:ec2:\$1:123456789012:spot-fleet-request/sfr-\$1 | 
| 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-\$1 | 
| RequestSpotFleet | AWS STS (AssumeRole) | aws-ec2-spot-fleet-tagging-role が持つ AssumeRoleの機能を、フリート sfr-11111111-1111-1111-1111-111111111111 に影響を与えるアクションのみに制限します。このロールは、他のスポットフリートでは使用できない場合があることに注意してください。また、このロールを使用して request-spot-fleet により新しいスポットフリートを起動することはできません。 | arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-11111111-1111-1111-1111-111111111111 | 