🍽️ レストランの代理店長で理解する2つの権限
IAMロールは「役職」のようなもの
PassRoleとAssumeRoleは、よく混同されがちですが、実は全く違う概念です。
PassRole
:「この役職を使っていいよ」と許可を与える権限
AssumeRole
:実際にその役職になりきって仕事をする行為
レストランの「代理店長制度」にたとえると一瞬で理解できます✨
📖 「Assume」ってどういう意味?
「AssumeRole」という名前の意味を理解すると、
概念がさらにクリアになります!
引き受ける・担う・就く
📝 assume responsibility
(責任を引き受ける)
📝 assume the role
(役割を担う)
📝 assume office
(職務に就く)
仮定する・推測する
(〜と仮定する)
📝 Let's assume it's true
(それが真実だと仮定しよう)
⚠️ この意味ではありません
装う・ふりをする
(偽の身分を装う)
📝 assume an air of innocence
(無邪気なふりをする)
⚠️ この意味でもありません
田中さん: 「わかりました!代理店長の役割を 引き受けます 」
田中さんが:
• 代理店長という 役割を引き受ける = assume the role
• 代理店長として 職務に就く = assume the position
• 店長の 責任を担う = assume the responsibility
| 英語 | 直訳 | 意訳 |
|---|---|---|
| AssumeRole | 役割を引き受ける | ロールになる |
| Assume a role | ある役割を担う | その立場に就く |
↓ assume the role of Hamlet
ハムレット(役柄=ロール)として演技
この間、俳優は「ハムレット」として行動し、
自分自身の普段の性格は表に出さない
↓ AssumeRole
ロールの権限で行動
この間、元のユーザー権限は使えず、
ロールの権限のみが有効
役割を引き受ける
役割に入り込む
役割を採用する
✅ ビジネス・法律用語として正式
✅ 「責任を伴う引き受け」のニュアンス
そのロールの立場に就いて、
その権限と責任を引き受ける
「田中さん、今日は店長が休みだから、代理店長として働いていいよ」
→ これが PassRole (許可を出す行為)
• EC2インスタンスにIAMロールを割り当てる
• CodePipelineにデプロイ用のロールを渡す
• ECSタスクにロールを指定する
例:開発者、管理者、デプロイツール
「わかりました!それでは代理店長として店を運営します」
(実際に店長の権限で売上管理、スタッフ指示などを実行)
→ これが AssumeRole (役割を引き受ける行為)
• Lambda関数が実行時にロールを引き受ける
• クロスアカウントアクセスでロール切替
• CI/CDツールがデプロイ用ロールを使用
例:IAMユーザー、AWSサービス(Lambda、EC2など)
🍽️ レストラン代理店長制度の完全シナリオ
PassRole
「許可を出す側」
マネージャー(管理者)は「誰が代理店長になれるか」を決める権限を持っています。
• 田中さんを代理店長に任命できる
• 鈴木さんも代理店長に任命できる
• でも山田さんは任命できない(スキル不足)
マネージャー自身は代理店長ではないので、代理店長の仕事(売上管理、スタッフ評価など)は できません 。
許可を出すことと、実際にやることは別物!
マネージャーは「誰に強力な権限を渡すか」を慎重に判断する必要があります。間違った人に渡すと大変なことに!
AssumeRole
「役割を引き受ける側」
田中さんは許可をもらったので、実際に代理店長として働きます。
• 売上レポートの確認
• スタッフへの指示
• 仕入れの承認
• クレーム対応の最終判断
代理店長として働いている間、田中さんは 普通のスタッフとしての仕事はできません 。
接客や料理など、通常の業務は一時的にできない状態に。
代理店長の権限は「今日の営業時間中だけ」など、期限付き。翌日はまた許可が必要。
→ AWSでは通常1〜12時間の一時的な認証情報
🔄 実際の動作フロー
「iam:PassRole」
をLambdaに渡す
ロール付きで作成される
ロールを引き受ける
アクセスキー取得
S3やDynamoDBにアクセス
💻 実際のIAMポリシー例
// 開発者に付与するポリシー { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/LambdaExecutionRole", "Condition": { "StringEquals": { "iam:PassedToService": "lambda.amazonaws.com" } } } ] } // 解説: // この開発者は「LambdaExecutionRole」を // Lambda関数に渡すことができる // でも、そのロール自体は使えない!
// ロールの信頼ポリシー(Trust Policy) { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } // 解説: // このロールは「Lambda関数」が // AssumeRole(引き受ける)ことができる // Lambda起動時に自動的に実行される // ロールに付与する権限ポリシー { "Effect": "Allow", "Action": [ "s3:GetObject", "dynamodb:PutItem" ], "Resource": "*" }
📊 詳細比較表
| 項目 | iam:PassRole | sts:AssumeRole |
|---|---|---|
| 基本的な意味 | 「ロールを渡す許可」 | 「ロールになる行為」 |
| 実行するのは? | リソースを作成する人・サービス | 実際に作業する人・サービス |
| どこに書く? | ユーザー/サービスのポリシー | ロールの信頼ポリシー |
| いつ使う? | リソース作成・更新時 | リソース実行時 |
| 権限の使用 | ロールの権限は使えない | ロールの権限を使える |
| 一時的? | 永続的な許可 | 一時的(1-12時間) |
| 認証情報 | 発行されない | 一時認証情報が発行される |
| 典型的な用途 | Lambda/EC2作成時にロール割当 | Lambda実行時、クロスアカウントアクセス |
⚠️ よくある誤解トップ5
PassRoleは「他の人・サービスに渡す許可」であって、自分がそのロールを使えるわけではありません。
例: マネージャーが「田中さんを代理店長にしていいよ」と言えても、マネージャー自身が代理店長になれるわけではない。
AssumeRoleは、Lambda、EC2、ECSなどのAWSサービスが自動的に実行します。人間だけでなく、サービスも常に使っています。
例: Lambda関数は起動のたびに自動的にAssumeRoleを実行して、権限を取得しています。
PassRoleが必要なのは「Lambda関数を作成・更新する時」だけ。既にロールが割り当てられているLambdaの実行には不要。
例: 既に代理店長が決まっていれば、毎日許可を出し直す必要はない。
PassRoleはロールごとに許可が必要。すべてのロールを渡せるわけではありません。
例: マネージャーは「代理店長」に任命する権限はあっても、「会社の社長」に任命する権限はない。
AssumeRoleすると、元の権限は一時的に使えなくなります。ロールの権限だけが有効になります。
例: 田中さんが代理店長になったら、普通のスタッフとしての接客業務はできない。店長としての権限のみ。
💼 実際のユースケース別ガイド
Lambda関数の作成
開発者がS3からデータを読み込むLambda関数を作成したい。
1️⃣ 開発者に
• lambda:CreateFunction(Lambda作成権限)
• iam:PassRole(ロールを渡す権限)
2️⃣ Lambdaロールの信頼ポリシーに
• sts:AssumeRole(Lambda用)
3️⃣ Lambdaロールの権限ポリシーに
• s3:GetObject(実際にS3にアクセス)
1. 開発者がPassRoleでロールを指定してLambda作成
2. Lambda起動時にAssumeRoleでロール引き受け
3. S3にアクセス
クロスアカウントアクセス
開発アカウントから本番アカウントのリソースにアクセスしたい。
1️⃣ 開発者(開発アカウント)に
• sts:AssumeRole(本番ロールを引き受ける)
2️⃣ 本番ロール(本番アカウント)の信頼ポリシーに
• 開発アカウントからのAssumeRoleを許可
3️⃣ 本番ロールの権限ポリシーに
• 必要なリソースへのアクセス権限
1. 開発者がAssumeRoleで本番ロールに切替
2. 一時認証情報取得
3. 本番環境のリソースにアクセス
EC2インスタンスプロファイル
EC2インスタンスからS3バケットにアクセスさせたい。
1️⃣ 管理者に
• ec2:RunInstances(EC2起動権限)
• iam:PassRole(ロールを渡す権限)
2️⃣ EC2ロールの信頼ポリシーに
• sts:AssumeRole(EC2用)
3️⃣ EC2ロールの権限ポリシーに
• s3:PutObject(S3への書き込み)
1. 管理者がPassRoleでロールを指定してEC2起動
2. EC2が自動的にAssumeRoleでロール引き受け
3. アプリケーションがS3にアクセス
CodePipelineでのデプロイ
CI/CDパイプラインで自動デプロイを実行したい。
1️⃣ 開発者に
• codepipeline:CreatePipeline
• iam:PassRole(パイプラインにロール渡す)
2️⃣ パイプラインロールの信頼ポリシーに
• sts:AssumeRole(CodePipeline用)
3️⃣ パイプラインロールの権限ポリシーに
• codebuild:StartBuild
• cloudformation:CreateStack
1. 開発者がPassRoleでパイプライン作成
2. パイプライン実行時にAssumeRole
3. デプロイ処理を実行
「iam:PassedToService」条件を使って、特定のサービスにのみロールを渡せるように制限しましょう。
例:Lambda専用ロールはLambdaにしか渡せないようにする。
2. 最小権限の原則を守る:
• PassRoleは必要なロールだけに限定
• ロールの権限も必要最小限に
• ワイルドカード(*)の使用は避ける
3. 信頼ポリシーを適切に設定:
AssumeRoleを許可する対象を明確に指定。誰でも引き受けられるロールは作らない。
4. ロールの命名規則を統一:
• サービス名-環境-用途の形式がおすすめ
• 例:Lambda-Prod-S3Access、EC2-Dev-DynamoDBWrite
5. CloudTrailでログを監視:
PassRoleとAssumeRoleは両方ともCloudTrailに記録されます。定期的に監査して、不正な使用がないか確認。
6. 外部IDを使用する(サードパーティアクセス時):
クロスアカウントでサードパーティサービスを使う場合は、外部ID(ExternalId)を必ず設定して、混乱した代理人問題を防ぐ。
7. ロールのセッション時間を適切に設定:
長時間のセッションは避け、必要最小限の時間(デフォルト1時間)で設定。
8. タグ付けで管理を簡単に:
ロールにタグを付けて、用途や所有者を明確に。コスト配分や監査にも役立ちます。
🎓 まとめ
🍽️ レストランの代理店長制度 = IAMロール
PassRoleとAssumeRoleは全く違う概念!
許可を出すこと
と
実際にやること
は別物です
「この役職を使っていいよ」
と許可を出す権限
作成・設定時に必要
実際にその役職になりきって
仕事をする行為
実行時に必要
🎯 覚えておくべき4つのポイント:
1️⃣
PassRoleは「許可」、AssumeRoleは「実行」
マネージャーが許可を出して、スタッフが実際に働く
2️⃣
PassRoleを持っていても、そのロールは使えない
許可を出せるだけで、自分が代理店長になれるわけじゃない
3️⃣
AssumeRoleは一時的
代理店長の権限は期限付き。元の権限は一時的に使えない
4️⃣
「Assume」=「引き受ける」という意味
AssumeRoleは「役割を引き受ける」行為。責任と権限を正式に担うこと
「assume」=「引き受ける」
という英語の意味を知れば、
AssumeRoleの概念がより深く理解できます!
この2つの違いを理解することで、
IAMロールのセキュリティ設計が劇的に向上
します!
レストランのたとえを思い出して、適切に使い分けましょう🎉