AWS IAM PassRole 概要

## **概要**

* ユーザーやサービスが別のAWSサービス（例: EC2, ECS, Lambda, CodeBuild, CloudFormationなど）に対して「このIAMロールを使って実行してほしい」と“ロールを渡す”ための権限。

* 各AWSサービスで、サービスが何かしらの操作を行う際に特定のIAMロールを代わりに引き受ける（assumeする）必要がある。

* その際に、ユーザーもしくは呼び出し元が「どのロールをそのサービスに渡せるか」を制御するのが PassRole となる。

* もしユーザーやサービスがAWS上で何らかのリソースを作成・実行し、そのリソースが指定したIAMロールを利用して操作を行う場合（例：ECSタスクを実行して、そのタスクがS3などの別サービスにアクセスする）、呼び出し元には「`iam:PassRole`」の権限が必要となる。


## 用途

1. **AWSサービスがロールを使用できるようにする**
   例えば下記のようなシナリオで、呼び出し元（ユーザー/サービス）が該当のロールを「渡す (pass)」必要がある。

   - EC2インスタンス作成時に、EC2インスタンスプロファイルとしてIAMロールを関連付ける
   - ECSタスク定義でタスクが利用するIAMロールを指定する
   - Lambda関数が実行に使用するロールを設定する
   - CodeBuildやCodePipelineでビルドやデプロイを実行するためのロールを渡す
   - CloudFormationがスタックの作成・更新時に使用するロールを指定する

2. **ロールごとにパスさせる権限を分離する**
    ユーザーやサービスが不適切なロールを渡せないように制御が可能。「`iam:PassRole`」で指定できるロールや、条件付き（IAMのConditionで`iam:PassedToService`を使うなど）でパス可能なサービスを制限することで、セキュリティリスクを低減する

   - 例: 組織内で管理者権限を持つようなロールを間違って渡さないように、パス可能ロールを最小限に絞る

   

## 利用イメージ

### 例: AWSコンソールを介してECSにタスク定義を作成する場合

1. ユーザーがAWSコンソールにログイン

2. コンソール経由でECSにタスク（またはサービス）を作成しようとする

3. タスクで使用するIAMロールを指定する

4. ECSがそのロールをassumeするために**ユーザーがECSサービスへロールを渡す (PassRole)**



```mermaid
sequenceDiagram
    participant U as ユーザー
    participant C as AWSコンソール
    participant S as ECSサービス
    participant I as IAM
    U->>C: ECSタスクを作成(ロールを指定)
    note right of U: コンソール画面でロールを指定

    C->>I: PassRole権限チェック<br/> (iam:PassRole でロールを渡せるか？)
    note right of I: IAMポリシーを参照し許可/拒否を判定

    I-->>C: AllowまたはDenyを返す

    alt Deny (PassRole権限なし)
        C-->>U: 「AccessDenied」エラーを表示
        note right of C: タスク作成失敗
    else Allow (PassRole権限あり)
        C->>S: タスク定義作成リクエスト (ロールを渡す)
        note right of S: ECSは渡されたIAMロールを assume

        S->>I: ECSがロールのSTSトークンを取得
        note right of I: AssumeRole処理(サービス側)

        I-->>S: セッション認証情報を返す
        S-->>C: タスク作成成功
        C-->>U: タスク作成完了を通知
end
```

## **`iam:PassRole`** と **`sts:AssumeRole`** の関係

* AWS IAMには、**`iam:PassRole`** と **`sts:AssumeRole`** という2つの異なるアクションがある。しばしば混同されることがあるが、目的と使用タイミングが異なる
  - **`iam:PassRole`**: ユーザー(またはサービス)が「**他のサービス**にロールを引き受けさせたい」ときに必要
  - **`sts:AssumeRole`**: 「**ロール自身になりたい**」（ロールの権限を直接行使したい）側が使用



| 項目               | **PassRole** (`iam:PassRole`)                                | **AssumeRole** (`sts:AssumeRole`)                            |
| ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **目的**           | 「**他のAWSサービス**にロールを利用させる」ために、「このロールをあなたが使って良い」と渡す（パス）行為 | 「**自分自身またはAWSサービス**がロールを引き受ける（スイッチする）」行為 |
| **主な呼び出し元** | ユーザーや別のAWSサービスが「サービスXにロールを渡す」際に使う | 実際にロールを使って動作したい主体（例: ECS, Lambda, ユーザーなど） |
| **例**             | - AWSコンソールやCLIでECSタスク作成時に「実行ロールをこのロールにしたい」と指定する<br /> - CloudFormationで「この実行ロールを使用させたい」と指定する | - ECSが実行時にロールを引き受ける <br />- ユーザーがCLIで `aws sts assume-role` を実行してロールの権限に切り替える |



* 下記はユーザーがAWSコンソールなどを通じて ECS (あるいは他のAWSサービス) に「このロールを使ってタスクやサービスを実行してほしい」と依頼するシナリオ

```mermaid
sequenceDiagram
    participant U as ユーザー
    participant C as ECSサービス (例)
    participant I as IAM
    participant STS as AWS STS

    U->>C: 「RoleX を使って ECSタスクを作成してほしい」
    note over U,C: (ユーザーはiam:PassRoleを持っている必要がある)

    C->>I: ① PassRole権限チェック (iam:PassRole) <br/>「ユーザーはRoleXをECSに渡せるか？」
    I-->>C: 許可 (Allow) または 拒否 (Deny)
    
    alt Allow (PassRole OK)
        C->>STS: ② RoleX を Assume (sts:AssumeRole)
        STS-->>C: ③ 一時的な認証情報を取得
        C-->>U: ECSタスク作成 成功
    else Deny (PassRole NG)
        C-->>U: 「AccessDeniedエラー」 (タスク作成失敗)
    end
```

1. ユーザー → ECSサービス
   - ユーザーがAWSコンソールやCLI経由で「このロール（RoleX）を使ってECSを実行したい」とリクエストする。
2. ECSサービス → IAM
   - ECSはユーザーが**`iam:PassRole`** 権限を持っているかどうかをチェックする。
   - ここでDenyになると、ECSはロールを引き受けられないため処理は失敗する。
3. ECSサービス → STS
   - PassRoleチェックで許可 (Allow) となった場合、ECSが**`sts:AssumeRole`** を実行してRoleXを引き受ける。
   - これにより一時的な認証情報がSTS (Security Token Service) から返され、ECSはRoleXが持つ権限で操作を行えるようになる。