

# Perfil de instancia de instancias administradas de Amazon ECS
<a name="managed-instances-instance-profile"></a>

Un perfil de instancia es un contenedor de IAM que ocupa exactamente un rol de IAM y permite que las instancias de instancias administradas de Amazon ECS asuman ese rol de forma segura. El perfil de instancia contiene un rol de instancia que el agente de ECS asume para registrar las instancias con los clústeres y comunicarse con el servicio de ECS.

**importante**  
Si utiliza instancias administradas de Amazon ECS con la política administrada `AmazonECSInfrastructureRolePolicyForManagedInstances`, el nombre de rol de instancia debe empezar por `ecsInstanceRole`. La política define el alcance de `iam:PassRole` en `arn:aws:iam::*:role/ecsInstanceRole*`, por lo que un nombre que no coincida provoca un error de autorización al iniciar la tarea. Esto es común con CloudFormation cuando se omite `RoleName`, porque CloudFormation genera automáticamente nombres como `MyStack-InstanceRole-ABC123`.  
Si, en su lugar, utiliza una política de roles de infraestructura personalizada, el rol de instancia puede tener cualquier nombre siempre que la política incluya una concesión `iam:PassRole` dirigida al ARN del rol de instancia.

## Creación de un rol con la política de confianza
<a name="create-instance-role"></a>

Sustituya cada *entrada del usuario* por información propia.

1. Cree un archivo con el nombre `ecsInstanceRole-trust-policy.json`, que contenga la política de confianza que se va a utilizar para el rol de IAM. El archivo debe contener lo siguiente:

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": { "Service": "ec2.amazonaws.com"},
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. Utilice el siguiente comando de la AWS CLI para crear un rol con el nombre `ecsInstanceRole` mediante la política de confianza que creó en el paso anterior.

   ```
   aws iam create-role \
         --role-name ecsInstanceRole \
         --assume-role-policy-document file://ecsInstanceRole-trust-policy.json
   ```

1. Asocie la política `AmazonECSInstanceRolePolicyForManagedInstances` administrada por AWS al rol `ecsInstanceRole`.

   ```
   aws iam attach-role-policy \
         --role-name ecsInstanceRole \
         --policy-arn arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances
   ```
**nota**  
Si opta por aplicar permisos con privilegios mínimos y especificar sus propios permisos en su lugar, puede agregar los siguientes permisos para solucionar problemas relacionados con las tareas con instancias administradas de Amazon ECS:   
`ecs:StartTelemetrySession`
`ecs:PutSystemLogEvents`

También puede usar el flujo de trabajo de **Política de confianza personalizada** de la consola de IAM para crear el rol. Para obtener instrucciones, consulte [Creating a role using custom trust policies (console)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html) en la *Guía del usuario de IAM*.

Después de crear el archivo, debe conceder a su usuario permiso para transferir el rol a Amazon ECS.

## Creación del perfil de instancia con la AWS CLI
<a name="create-instance-profile"></a>

Tras crear el rol, cree el perfil de instancia con la AWS CLI:

```
aws iam create-instance-profile --instance-profile-name ecsInstanceRole 
```

Agregue el rol al perfil de instancia:

```
aws iam add-role-to-instance-profile \
   --instance-profile-name ecsInstanceRole \
   --role-name ecsInstanceRole
```

Compruebe que el perfil se haya creado correctamente:

```
aws iam get-instance-profile --instance-profile-name ecsInstanceRole 
```

## Creación del perfil de instancia con CloudFormation
<a name="create-instance-profile-cfn"></a>

Puede usar AWS CloudFormation para crear el rol de instancia y el perfil de instancia. Elija una de las siguientes opciones en función de si utiliza la política AWS de infraestructura administrada de o una política personalizada.

### Opción 1: uso de la convención de nomenclatura ecsInstanceRole (recomendado)
<a name="create-instance-profile-cfn-managed"></a>

Al usar la política de infraestructura administrada de AWS, debe establecer explícitamente `RoleName` en un valor que comience por `ecsInstanceRole`. Si omite `RoleName`, CloudFormation generará automáticamente un nombre que no coincida con la condición `iam:PassRole` de la política administrada y las tareas no se iniciarán.

```
Resources:
  EcsInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: ecsInstanceRole
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances

  EcsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: ecsInstanceRole
      Roles:
        - !Ref EcsInstanceRole
```

### Opción 2: uso de un nombre de rol personalizado
<a name="create-instance-profile-cfn-custom"></a>

Si prefiere dejar que CloudFormation genere el nombre del rol o utiliza un nombre personalizado que no comience por `ecsInstanceRole`, debe agregar una política integrada al rol de infraestructura que conceda `iam:PassRole` al rol de instancia.

```
Resources:
  EcsInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      # No RoleName — CFN auto-generates
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances

  EcsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref EcsInstanceRole

  EcsInfrastructureRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonECSInfrastructureRolePolicyForManagedInstances
      Policies:
        - PolicyName: PassInstanceRoleToEC2
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action: iam:PassRole
                Resource: !GetAtt EcsInstanceRole.Arn
                Condition:
                  StringLike:
                    iam:PassedToService: "ec2.*"
```

## Solución de problemas
<a name="managed-instances-instance-profile-troubleshooting"></a>

### Se produce el error de autorización iam:PassRole en las tareas
<a name="managed-instances-instance-profile-ts-passrole"></a>

Si las tareas fallan con un error `ResourceInitializationError` que menciona `iam:PassRole`, compruebe que el nombre del rol de la instancia comience por `ecsInstanceRole`. Puede comprobar el nombre generado automáticamente en la consola de CloudFormation, en la pestaña **Recursos** de la pila. Si el nombre no coincide, siga estos pasos:
+ Agregue `RoleName: ecsInstanceRole` al recurso de `AWS::IAM::Role`.
+ Agregue una política integrada `iam:PassRole` explícita al rol de infraestructura. Para obtener más información, consulte [Opción 2: uso de un nombre de rol personalizado](#create-instance-profile-cfn-custom).