

# Permissões de frota spot
<a name="spot-fleet-prerequisites"></a>

Se os usuários pretenderem criar ou gerenciar uma frota spot, será necessário conceder a eles as permissões necessárias.

Se você usar o console do Amazon EC2 para criar uma frota spot, ele criará duas funções vinculada ao serviço chamadas `AWSServiceRoleForEC2SpotFleet` e `AWSServiceRoleForEC2Spot`, além de uma função chamada `aws-ec2-spot-fleet-tagging-role` que concede à frota spot as permissões para solicitar, executar, encerrar e marcar recursos em seu nome. Se você usar a AWS CLI ou uma API, é necessário garantir que essas funções existam.

Use as instruções a seguir para conceder as permissões necessárias e criar as funções.

**Topics**
+ [Conceder aos usuários permissão para uma frota spot](#spot-fleet-iam-users)
+ [Função vinculada ao serviço para frota spot](#service-linked-roles-spot-fleet-requests)
+ [Função vinculada ao serviço para instâncias spot](#service-linked-roles-spot-instances)
+ [Função do IAM para marcar uma frota spot](#spot-fleet-service-linked-role)

## Conceder aos usuários permissão para uma frota spot
<a name="spot-fleet-iam-users"></a>

Se os usuários pretenderem criar ou gerenciar uma frota spot, certifique-se de conceder a eles as permissões necessárias.

**Para criar uma frota spot**

1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. No painel de navegação, escolha **Policies**, **Create policy**.

1. Na página **Criar política**, selecione **JSON**, e substitua o texto pelo indicado a seguir.

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

------

   A política de exemplo anterior concede a um usuário as permissões necessárias para a maioria dos casos de uso de frota spot. Para limitar o usuário a ações de API específicas, especifique somente essas ações de API.

   **APIs do EC2 e do IAM necessárias**

   As seguintes APIs devem ser incluídas na política:
   + `ec2:RunInstances` – Necessária para executar instâncias em uma frota spot
   + `ec2:CreateTags` – Necessária para marcar as solicitações, instâncias ou volumes da frota spot
   + `iam:PassRole` – Necessária para especificar a função da frota spot
   + `iam:CreateServiceLinkedRole` – Necessária para criar a função vinculada ao serviço
   + `iam:ListRoles` – Necessária para enumerar funções do IAM existentes
   + `iam:ListInstanceProfiles` – Necessária para enumerar perfis da instância existente
**Importante**  
Se você especificar um perfil para o perfil de instância do IAM na especificação ou no modelo de inicialização, deverá conceder ao usuário a permissão de passar o perfil para o serviço. Para fazer isso, na política do IAM inclua `"arn:aws:iam::*:role/IamInstanceProfile-role"` como um recurso para a ação `iam:PassRole`. Para obter mais informações, consulte [Conceder permissões ao usuário para passar uma função a um produto da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html) no *Guia do usuário do IAM*.

   **APIs de frota spot**

   Adicione as seguintes ações da API de frota spot à política, conforme necessário:
   + `ec2:RequestSpotFleet`
   + `ec2:ModifySpotFleetRequest`
   + `ec2:CancelSpotFleetRequests`
   + `ec2:DescribeSpotFleetRequests`
   + `ec2:DescribeSpotFleetInstances`
   + `ec2:DescribeSpotFleetRequestHistory`

   **APIs opcionais do IAM**

   (Opcional) Para permitir que um usuário crie perfis ou perfis de instância usando o console do IAM, é necessário adicionar as seguintes ações à política:
   + `iam:AddRoleToInstanceProfile`
   + `iam:AttachRolePolicy`
   + `iam:CreateInstanceProfile`
   + `iam:CreateRole`
   + `iam:GetRole`
   + `iam:ListPolicies`

1. Escolha **Revisar política**.

1. Na página **Review policy (Revisar política)**, digite um nome e uma descrição para a política e escolha **Create policy (Criar política)**.

1. Para conceder acesso, adicione as permissões aos seus usuários, grupos ou perfis:
   + Usuários e grupos no Centro de Identidade do AWS IAM:

     Crie um conjunto de permissões. Siga as instruções em [Criação de um conjunto de permissões](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html) no *Guia do usuário do Centro de Identidade do AWS IAM*.
   + Usuários gerenciados no IAM com provedor de identidades:

     Crie um perfil para a federação de identidades. Siga as instruções em [Criando um perfil para um provedor de identidades de terceiros (federação)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html) no *Guia do Usuário do IAM*.
   + Usuários do IAM:
     + Crie um perfil que seu usuário possa assumir. Siga as instruções em [Criação de um perfil para um usuário do IAM](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html) no *Guia do usuário do IAM*.
     + (Não recomendado) Vincule uma política diretamente a um usuário ou adicione um usuário a um grupo de usuários. Siga as instruções em [Adição de permissões a um usuário (console)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) no *Guia do usuário do IAM*.

## Função vinculada ao serviço para frota spot
<a name="service-linked-roles-spot-fleet-requests"></a>

O Amazon EC2 usa funções vinculadas ao serviço para as permissões de que ela precisa para chamar outros produtos da AWS em seu nome. Uma função vinculada ao serviço é um tipo exclusivo de função do IAM vinculado diretamente a um serviço da AWS. As funções vinculadas a serviços oferecem uma maneira segura de delegar permissões a serviços da AWS, pois somente o serviço vinculado pode assumir uma função vinculada ao serviço. Para obter mais informações, consulte [Perfis vinculados ao serviço](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html) no *Guia do usuário do IAM*.

O Amazon EC2 usa a função vinculada ao serviço chamada **AWSServiceRoleForEC2SpotFleet** para executar e gerenciar instâncias em seu nome.

**Importante**  
Se você especificar uma [AMI criptografada](AMIEncryption.md) ou um snapshot do Amazon EBS criptografado na frota spot, será necessário conceder ao perfil **AWSServiceRoleForEC2SpotFleet** permissão para usar a CMK para que o Amazon EC2 possa executar instâncias em seu nome. Para obter mais informações, consulte [Conceder acesso às CMKs para uso com AMIs criptografadas e snapshots do EBS](#spot-fleet-service-linked-roles-access-to-cmks).

### Permissões concedidas por AWSServiceRoleForEC2SpotFleet
<a name="service-linked-role-permissions-granted-by-AWSServiceRoleForEC2SpotFleet"></a>

O perfil **AWSServiceRoleForEC2SpotFleet** concede à frota spot permissão para solicitar, executar, encerrar e marcar instâncias em seu nome. O Amazon EC2 usa essa função vinculada ao serviço para concluir as seguintes ações:
+ `ec2:RequestSpotInstances` - Solicitar Instâncias spot
+ `ec2:RunInstances` - executar instâncias
+ `ec2:TerminateInstances` - encerrar instâncias
+ `ec2:DescribeImages` - descrever imagens de máquina da Amazon (AMIs) para as instâncias
+ `ec2:DescribeInstanceStatus` - descrever o status das instâncias
+ `ec2:DescribeSubnets` – descrever as sub-redes das instâncias
+ `ec2:CreateTags` - adiciona etiquetas à solicitação, às instâncias e aos volumes da frota spot
+ `elasticloadbalancing:RegisterInstancesWithLoadBalancer` - adicionar as instâncias especificadas ao load balancer especificado.
+ `elasticloadbalancing:RegisterTargets` - registrar os destinos especificados no grupo de destino especificado.

### Criar a função vinculada ao serviço
<a name="service-linked-role-creating-for-spot-fleet"></a>

Na maioria das circunstâncias, você não precisa criar manualmente uma função vinculada ao serviço. O Amazon EC2 cria a função **AWSServiceRoleForEC2Spotleet** vinculada ao serviço na primeira vez que você criar uma frota spot usando o console. 

Se você tinha uma solicitação de frota spot ativa antes de outubro de 2017, quando o Amazon EC2 começou a oferecer suporte a essa função vinculada ao serviço, o Amazon EC2 criou a função **AWSServiceRoleForEC2SpotFleet** em sua conta da AWS. Para obter mais informações, consulte [Uma nova função apareceu em minha conta da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_roles.html#troubleshoot_roles_new-role-appeared) no *Guia do usuário do IAM*.

Se você usar a AWS CLI ou uma API para criar uma frota spot, verifique se essa função existe.

**Para criar o perfil AWSServiceRoleForEC2SpotFleet para a frota spot usando o console**

1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. No painel de navegação, escolha **Perfis**.

1. Escolha **Criar Perfil**.

1. Na página **Selecionar entidade confiável**, faça o seguinte:

   1. Em **Tipo de entidade confiável**, escolha **Serviços da AWS**.

   1. Em **Caso de uso**, para **Serviço ou caso de uso**, escolha **EC2**.

   1. Em **Caso de uso**, Escolha **EC2 - Frota spot**.
**nota**  
O caso de uso **EC2: frota spot** criará automaticamente uma política com as permissões necessárias do IAM e vai sugerir **AWSEC2SpotFleetServiceRolePolicy** como nome do perfil.

   1. Escolha **Próximo**.

1. Na página **Adicionar permissões**, escolha **Próximo**.

1. Na página **Nomear, revisar e criar**, escolha **Criar função**.

**Para criar o perfil AWSServiceRoleForEC2SpotFleet para a frota spot usando a AWS CLI**  
Use o comando [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) da seguinte forma.

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

Se você não precisar mais usar a frota spot, é recomendável excluir a função **AWSServiceRoleForEC2SpotFleet**. Depois que a função for excluída da conta, o Amazon EC2 criará a função novamente se você solicitar uma frota spot usando o console. Para saber mais, consulte [Excluir um perfil vinculado ao serviço](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#id_roles_manage_delete_slr) no *Guia do usuário do IAM*.

### Conceder acesso às CMKs para uso com AMIs criptografadas e snapshots do EBS
<a name="spot-fleet-service-linked-roles-access-to-cmks"></a>

Se você especificar uma [AMI criptografada](AMIEncryption.md) ou um snapshot do Amazon EBS criptografado na solicitação de frota spot e usar uma chave gerenciada pelo cliente para criptografia, será necessário conceder ao perfil **AWSServiceRoleForEC2SpotFleet** permissão para usar a CMK para que o Amazon EC2 possa executar instâncias em seu nome. Para isso, adicione uma concessão à CMK, conforme exibido no procedimento a seguir.

Durante a definição de permissões, as concessões são uma alternativa às políticas de chave. Para obter mais informações, consulte [Uso de concessões](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) e [Uso de políticas de chave no AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html), no *Guia do desenvolvedor do AWS Key Management Service*.

**Para conceder à função AWSServiceRoleForEC2SpotFleet permissões para usar a CMK**
+ Use o comando [create-grant](https://docs.aws.amazon.com/cli/latest/reference/kms/create-grant.html) para adicionar uma concessão à CMK e especificar a entidade principal (a função vinculada ao serviço **AWSServiceRoleForEC2SpotFleet**) que recebe permissão para executar as operações permitidas pela concessão. A CMK é especificada pelo parâmetro `key-id` e pelo ARN da CMK. A entidade principal é especificada pelo parâmetro `grantee-principal` e pelo ARN da função vinculada ao serviço **AWSServiceRoleForEC2SpotFleet**.

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

## Função vinculada ao serviço para instâncias spot
<a name="service-linked-roles-spot-instances"></a>

O Amazon EC2 usa a função vinculada ao serviço denominada **AWSServiceRoleForEC2Spot** para executar e gerenciar Instâncias spot em seu nome. Para obter mais informações, consulte [Função vinculada ao serviço para solicitações de instâncias spot](service-linked-roles-spot-instance-requests.md).

## Função do IAM para marcar uma frota spot
<a name="spot-fleet-service-linked-role"></a>

A função do IAM `aws-ec2-spot-fleet-tagging-role` concede à frota spot permissão para marcar a solicitação, as instâncias e os volumes de frota spot. Para obter mais informações, consulte [Marcar uma solicitação nova ou existente da frota spot e as instâncias e os volumes que ela executa](tag-spot-fleet.md).

**Importante**  
Se você optar por marcar as instâncias na frota e também por manter a capacidade visada (a solicitação de frota spot é do tipo `maintain`), as diferenças nas permissões definidas para o usuário e a `IamFleetRole` poderão levar a um comportamento inconsistente de marcação de instâncias na frota. Se o `IamFleetRole` não incluir a permissão `CreateTags`, algumas das instâncias executadas pela frota não serão marcadas. Embora estejamos trabalhando para corrigir essa inconsistência, para garantir que todas as instâncias executadas pela frota sejam marcadas, recomendamos que você use a função `aws-ec2-spot-fleet-tagging-role` para `IamFleetRole`. Outra opção é para usar uma função existente, anexe a `AmazonEC2SpotFleetTaggingRole`Política gerenciada da AWS à função existente. Caso contrário, você precisará adicionar manualmente a permissão `CreateTags` à política existente.

**Para criar uma função do IAM para marcar uma frota spot**

1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. No painel de navegação, escolha **Perfis**.

1. Escolha **Criar Perfil**.

1. Na página **Select trusted entity** (Selecionar entidade confiável), em **Trusted entity type** (Tipo de entidade confiável), escolha **AWS service** (Serviço da ).

1. Em **Caso de uso**, em **Casos de uso para outros serviços da AWS**, escolha **EC2** e escolha **EC2 - marcação de frota Spot**.

1. Escolha **Próximo**.

1. Na página **Adicionar permissões**, escolha **Próximo**.

1. Na página **Name, review, and create** (Nomear, revisar e criar), para **Role name** (Nome da função), digite um nome para a função (por exemplo, **aws-ec2-spot-fleet-tagging-role**).

1. Revise as informações na página e escolha **Create role** (Criar função).

### Prevenção contra o ataque do “substituto confuso” em todos os serviços
<a name="cross-service-confused-deputy-prevention"></a>

O [problema “confused deputy”](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) é um problema de segurança em que uma entidade que não tem permissão para executar uma ação pode coagir uma entidade mais privilegiada a executá-la. Recomendamos o uso das chaves de contexto de condição global [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) e [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) na política de confiança `aws-ec2-spot-fleet-tagging-role` para limitar as permissões de acesso ao recurso que a frota spot concede a outro serviço.

**Para adicionar as chaves de condição AWS:SourceArn e AWS:SourceAccount à política de confiança `aws-ec2-spot-fleet-tagging-role`**

1. Abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. No painel de navegação, escolha **Perfis**.

1. Encontre o `aws-ec2-spot-fleet-tagging-role` criado anteriormente e escolha o link (não a caixa de seleção).

1. Em **Summary** (Resumo), escolha a guia **Trust relationships** (Relacionamentos de confiança) e, em seguida, escolha **Edit trust policy** (Editar política de confiança).

1. Na instrução JSON, adicione um elemento `Condition` que contenha suas chaves de contexto de condição global `aws:SourceAccount` e `aws:SourceArn` para evitar o [problema confused deputy](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html), como segue:

   ```
   "Condition": {
         "ArnLike": {
           "aws:SourceArn": "arn:aws:ec2:us-east-1:111122223333:spot-fleet-request/sfr-*"
         },
         "StringEquals": {
           "aws:SourceAccount": "111122223333"
         }
   ```
**nota**  
Se você utilizar ambas as chaves de contexto de condição global, e o valor `aws:SourceArn` contiver o ID da conta, o valor `aws:SourceAccount` e a conta no valor `aws:SourceArn` deverão utilizar o mesmo ID de conta quando utilizados na mesma instrução de política.

   A política de confiança final será a seguinte:

------
#### [ 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. Escolha **Atualizar política**.

A tabela a seguir fornece valores potenciais para `aws:SourceArn` para limitar o escopo do seu `aws-ec2-spot-fleet-tagging-role` em diferentes graus de especificidade.


****  

| Operação de API | Serviço chamado | Escopo | `aws:SourceArn` | 
| --- | --- | --- | --- | 
| RequestSpotFleet | AWS STS (AssumeRole) | Limita a capacidade de AssumeRole em aws-ec2-spot-fleet-tagging-role para solicitações de frota spot na conta especificada. | arn:aws:ec2:\$1:123456789012:spot-fleet-request/sfr-\$1 | 
| RequestSpotFleet | AWS STS (AssumeRole) | Limita a capacidade de AssumeRole em aws-ec2-spot-fleet-tagging-role para solicitações de frota spot na conta e na região especificada. Observe que essa função não será utilizável em outras regiões. | arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-\$1 | 
| RequestSpotFleet | AWS STS (AssumeRole) | Limita a capacidade de AssumeRole em aws-ec2-spot-fleet-tagging-role para apenas ações que afetam a frota sfr-11111111-1111-1111-1111-111111111111. Observe que essa função pode não ser utilizável para outras frotas spot. Além disso, essa função não pode ser usada para lançar novas frotas spot por meio de request-spot-fleet. | arn:aws:ec2:us-east-1:123456789012:spot-fleet-request/sfr-11111111-1111-1111-1111-111111111111 | 