

# Amazon ECS マネージドインスタンスのインスタンスプロファイル
<a name="managed-instances-instance-profile"></a>

インスタンスプロファイルは、1 つの IAM ロールのみを保持し、Amazon ECS マネージドインスタンスがそのロールを安全に引き受けることを許可する IAM コンテナです。インスタンスプロファイルには、クラスターにインスタンスを登録し、ECS サービスと通信するために ECS エージェントが引き受けるインスタンスロールが含まれています。

**重要**  
`AmazonECSInfrastructureRolePolicyForManagedInstances` マネージドポリシーで Amazon ECS マネージドインスタンスを使用する場合、インスタンスロール名は `ecsInstanceRole` で始まる必要があります。ポリシーの範囲は `iam:PassRole` から `arn:aws:iam::*:role/ecsInstanceRole*` であるため、名前が一致しない場合、タスクの起動時に認証エラーが発生します。CloudFormation は `MyStack-InstanceRole-ABC123` のような名前を自動生成するため、これは `RoleName` を省略した場合に CloudFormation でよく発生します。  
代わりにカスタムインフラストラクチャロールポリシーを使用する場合、ポリシーにインスタンスロール ARN をターゲットとする `iam:PassRole` の付与が含まれている限り、インスタンスロールには任意の名前を付けることができます。

## 信頼ポリシーでロールを作成する
<a name="create-instance-role"></a>

すべての {{[ユーザー入力]}} は、お客様の情報で置き換えてください。

1. IAM ロールに使用する信頼ポリシーが含まれている `ecsInstanceRole-trust-policy.json` という名前のファイルを作成します。ファイルには次の内容が含まれます。

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

****  

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

------

1. 前のステップで作成した信頼ポリシーを使用して、`ecsInstanceRole` という名前のロールを作成するには、次の AWS CLI コマンドを使用します。

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

1. AWS 管理ポリシー `AmazonECSInstanceRolePolicyForManagedInstances` を `ecsInstanceRole` ロールにアタッチします。

   ```
   aws iam attach-role-policy \
         --role-name ecsInstanceRole \
         --policy-arn arn:aws:iam::aws:policy/AmazonECSInstanceRolePolicyForManagedInstances
   ```
**注記**  
その代わりにアクセスの最小特権を適用し、独自のアクセス許可を指定する場合は、次のアクセス権限を追加して、Amazon ECS マネージドインスタンスのタスク関連の問題のトラブルシューティングに役立てることができます。  
`ecs:StartTelemetrySession`
`ecs:PutSystemLogEvents`

IAM コンソールの**[カスタム信頼ポリシー]**ワークフローを使用してロールを作成することもできます。詳細については、「*IAM ユーザーガイド*」の「[カスタム信頼ポリシーを使用してロールを作成する (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html)」を参照してください。

ファイルを作成したら、Amazon ECS にロールを渡すためのアクセス許可をユーザーに付与する必要があります。

## AWS CLI を使用してインスタンスプロファイルを作成する
<a name="create-instance-profile"></a>

ロールを作成したら、AWS CLI を使用してインスタンスプロファイルを作成します。

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

次のように、インスタンスプロファイルにロールを追加します。

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

プロファイルが正常に作成されたことを確認します。

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

## CloudFormation を使用してインスタンスプロファイルを作成する
<a name="create-instance-profile-cfn"></a>

AWS CloudFormation を使用すると、インスタンスロールとインスタンスプロファイルを作成できます。AWS マネージドインフラストラクチャポリシーとカスタムポリシーのどちらを使用するかに基づいて、次のいずれかのオプションを選択します。

### オプション 1: ecsInstanceRole 命名規則を使用する (推奨)
<a name="create-instance-profile-cfn-managed"></a>

AWS マネージドインフラストラクチャポリシーを使用する場合は、`RoleName` を `ecsInstanceRole` で始まる値に明示的に設定する必要があります。`RoleName` を省略すると、CloudFormation はマネージドポリシーの `iam:PassRole` 条件に一致しない名前を自動生成し、タスクは起動に失敗します。

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

### オプション 2: カスタムロール名を使用する
<a name="create-instance-profile-cfn-custom"></a>

CloudFormation でロール名を生成する場合、または `ecsInstanceRole` で始まらないカスタム名を使用する場合は、`iam:PassRole` をインスタンスロールに付与するインフラストラクチャロールにインラインポリシーを追加する必要があります。

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

## トラブルシューティング
<a name="managed-instances-instance-profile-troubleshooting"></a>

### タスクが iam:PassRole 認証エラーで失敗する
<a name="managed-instances-instance-profile-ts-passrole"></a>

タスクが `iam:PassRole` に言及している `ResourceInitializationError` で失敗する場合は、インスタンスロール名が `ecsInstanceRole` で始まることを確認します。自動生成された名前は、スタックの [**リソース**] タブの CloudFormation コンソールで確認できます。名前が一致しない場合は、次のいずれかを実行します:
+ `AWS::IAM::Role` リソースに `RoleName: ecsInstanceRole` を追加します。
+ インフラストラクチャロールに明示的な `iam:PassRole` インラインポリシーを追加します。詳細については、「[オプション 2: カスタムロール名を使用する](#create-instance-profile-cfn-custom)」を参照してください。