URLをクリックするだけ!CloudFormationでスイッチロール用IAM ロールを安全に自動作成する仕組みを解説してみた!
はじめに
こんにちは!コンサルティング部のヒスです。
お客様の AWS 環境を調査・支援する際、私たちは お客様アカウントに専用の IAM ロールを作成していただき、そのロールにスイッチロールしてアクセスする という方式をとることがあります。ログイン情報(アクセスキーやパスワード)をお預かりせずに済むため、セキュアに作業を進められる方式です。
とはいえ、お客様に「IAM ロールを作ってください」とお願いすると、信頼ポリシーや権限ポリシーの設定など、それなりに手間がかかります。そこで弊社では、専用の URL をクリックするだけで、必要な IAM ロールが CloudFormation で自動作成される仕組み を用意しています。
本記事では、
- お客様側でどのような操作をすれば良いのか(手順)
- 裏側でどのような仕組みが動いているのか(構成の解説)
を、2つのモード(ReadOnly モード と レベルアッパーモード)に分けて解説します。
想定読者
- クラスメソッドから IAM ロール作成用の URL を受け取ったお客様
- スイッチロール方式でのアカウントアクセス構成に興味がある方
全体像:CloudFormation クイック作成 URL とは
お渡しする URL は、CloudFormation の クイックスタック作成(Quick Create Stack) 機能を使ったものです。URL のクエリパラメータにテンプレートの場所と各種パラメータが埋め込まれており、クリックすると値が入力済みの状態でスタック作成画面が開きます。
実際の URL はこのような形をしています(値はサンプルです)。
https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate
?templateUrl=https://cm-example-templates.s3-ap-northeast-1.amazonaws.com/cfn.yml
&stackName=cm-taro-yamada-iamRole-RO
¶m_IAMUserName=cm-taro.yamada
¶m_TrustedAWSAccountId=123456789012
¶m_DeploymentMode=readonly
¶m_CreateLogGroup=no
主なパラメータの意味は以下の通りです。
| パラメータ | サンプル値 | 意味 |
|---|---|---|
templateUrl |
.../cfn.yml |
使用する CloudFormation テンプレートの場所 |
stackName |
cm-taro-yamada-iamRole-RO |
作成されるスタックの名前 |
IAMUserName |
cm-taro.yamada |
担当するクラスメソッド側の IAM ユーザー名 |
TrustedAWSAccountId |
123456789012 |
信頼するアカウント(クラスメソッドのジャンプアカウント)の ID |
DeploymentMode |
readonly |
作成する構成のモード(後述) |
CreateLogGroup |
no |
ログ用リソースを作成するか |
このうち DeploymentMode によって作成される構成が変わります。本記事ではこのモードごとに解説していきます。
モード①:ReadOnly モード(参照専用)
DeploymentMode=readonly の場合、参照専用(ReadOnlyAccess)の IAM ロール が1つ作成されます。もっともシンプルな構成です。
構成の概要図

流れはとてもシンプルです。
- お客様が、受け取った URL をクリックして CloudFormation スタックを作成する
- CloudFormation が、ReadOnly 権限の IAM ロールをお客様アカウントに自動作成する
- クラスメソッド(ジャンプアカウントの IAM ユーザー)が、その IAM ロールにスイッチロールして参照のみ行う
作成される IAM ロール
作成される IAM ロールには、以下が設定されます。
- 信頼ポリシー:
TrustedAWSAccountId(クラスメソッドのジャンプアカウント)に属する、MFA 認証済みの IAM ユーザーからのスイッチロール(AssumeRole)のみを許可 - 権限ポリシー:AWS 管理ポリシー
ReadOnlyAccess(参照専用) - 最大セッション時間:1 時間。これを超えると、再度スイッチロールを行う必要があります
つまり、クラスメソッドはこのロールを通じて 「見る」ことしかできません。リソースの作成・変更・削除は一切できない、安全な構成です。まずはこのモードで環境を調査し、必要に応じて追加のご相談をする、という使い方が基本になります。
なお、スイッチロールできるのは 弊社アカウントに属する MFA 認証済みの IAM ユーザーに限られ、さらにセッションの有効期限も最大 1 時間に制限されているため、アクセス経路・アクセス時間の両面で絞り込まれた安全な構成になっています。
モード②:レベルアッパーモード(必要な時だけ Admin 権限へ昇格)
調査だけでなく、実際の作業(設定変更やリソース作成)まで代行する場合には、Admin 権限が必要になります。しかし 「常に Admin 権限でスイッチロールできる状態」は、セキュリティ上できるだけ避けたい ものです。
そこで用意されているのが レベルアッパーモード です。これは、
普段は Admin ロールにスイッチしても何もできず、必要な時に自分で一時的に Admin 権限を有効化(レベルアップ)する
という仕組みです。
構成の概要図

作成されるリソース
このモードでは、お客様アカウントに以下が作成されます。
- Read 権限の IAM ロール
- Read 権限に加えて、後述の「レベルアッパー Lambda」を実行する権限を持つ
- Admin 権限の IAM ロール
AdministratorAccess相当の権限- ただし 「全操作 Deny」ポリシー も同時にアタッチされている
- レベルアッパー Lambda
- 「全操作 Deny」ポリシーを一時的に無効化するための Lambda 関数
仕組みのポイント:なぜ Admin ロールにスイッチしても操作できないのか
ここがこの仕組みの肝です。
IAM では、明示的な Deny は、どんな Allow よりも優先される というルールがあります。Admin ロールには AdministratorAccess(=すべて Allow)と一緒に、次のような 「全操作 Deny」ポリシー がアタッチされています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*"
}
]
}
すべてを Deny しているため、Admin ロールにスイッチロールしても、何も操作できません(これが概要図の「①」です)。
レベルアップの流れ:一定時間だけ Deny を無効化する
では、どうやって Admin 操作を行うのか。ここで レベルアッパー Lambda の出番です。
- まず Read 権限の IAM ロール にスイッチロールする
- Read ロールの権限で レベルアッパー Lambda を実行 する
- Lambda が「全操作 Deny」ポリシーに
Condition(条件)を追記/更新 し、Deny を一定時間だけ無効化する
追記される Condition は、次のように「指定時刻を過ぎたら Deny を有効にする(=それまでは Deny を効かせない)」というものです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"DateGreaterThan": {
"aws:CurrentTime": "202X-0X-XXTXX:XX:XXZ"
}
}
}
]
}
DateGreaterThan + aws:CurrentTime は「現在時刻が、指定した時刻より後の場合にこのステートメントを適用する」という条件です。
- 指定時刻を過ぎる前(=レベルアップ中):Deny が適用されない → Admin 権限で操作できる
- 指定時刻を過ぎた後:Deny が復活 → 再び何もできなくなる
つまり、自分で Lambda を実行したときから一定時間だけ Admin 権限が有効になり、時間が経つと自動的に権限が閉じる という仕組みです(これが概要図の「②」です)。
この仕組みのメリット
- 常時 Admin 権限が有効なロールが存在しないため、万一の踏み台リスクを抑えられる
- Admin 操作には「Read ロールにスイッチ → Lambda 実行」という明示的なアクションが必要なので、意図しない操作を防げる
- 一定時間で自動的に権限が閉じるため、権限の切り忘れが起きにくい
お客様にお願いする作業手順(共通)
どちらのモードでも、お客様の操作は「URL をクリックしてスタックを作成する」だけ です。以下、手順を説明します。
STEP 1. 対象の AWS アカウントにログインする
IAM ロールを作成したい AWS アカウントに、マネジメントコンソールからログインします。
⚠️ 複数アカウントをお持ちの場合はご注意ください。
今ログインしているアカウントにリソースが作成されます。画面右上のアカウント ID が意図したものか、必ずご確認ください。
STEP 2. 受け取った URL にアクセスする
クラスメソッドからお渡しした URL をクリック(またはブラウザに貼り付け)します。CloudFormation の 「クイックスタックの作成」 画面が、パラメータ入力済みの状態で開きます。
💡 IAM はグローバルサービスのため、どのリージョンで作成しても IAM ロールは全リージョンで有効です。URL は東京リージョン(
ap-northeast-1)で開くように設定されています。
STEP 3. パラメータを確認する
自動入力されたパラメータの内容を確認します。基本的に変更は不要です。特に TrustedAWSAccountId と DeploymentMode は、変更すると正しく動作しなくなるため、そのままにしてください。
STEP 4. IAM リソース作成の承認にチェックを入れる
画面下部の以下のチェックボックスにチェックを入れます。
☑ AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。
このテンプレートは IAM ロールを作成するため、このチェックが必要です。
STEP 5. スタックを作成する
「スタックの作成」 ボタンをクリックします。
STEP 6. 完了を確認する
スタックのステータスが以下のように進みます。
CREATE_IN_PROGRESS → CREATE_COMPLETE
CREATE_COMPLETE(緑色) になれば作成完了です。お客様の作業はここまでです。
よくあるご質問
Q. クラスメソッドに何ができてしまうのですか?
A. ReadOnly モードでは参照のみです。レベルアッパーモードでも、通常は参照のみで、Admin 操作を行うには担当者が明示的にレベルアップ操作を行う必要があります。加えて、このロールにスイッチロールできるのは 弊社アカウント(TrustedAWSAccountId)に属する MFA 認証済みの IAM ユーザーのみ に限定されており、セッションの有効期限も最大 1 時間 です。
Q. 誰でもこのロールにスイッチロールできてしまうのですか?
A. いいえ。信頼ポリシーにより、弊社アカウントに属し、かつ MFA 認証を済ませた IAM ユーザーからのスイッチロールのみが許可されます。それ以外のアカウントやユーザーからはスイッチロールできません。また、一度スイッチロールしても最大 1 時間でセッションが切れ、継続するには再度スイッチロールが必要になります。
Q. 不要になったら削除できますか?
A. はい。CloudFormation のスタック一覧から対象スタックを選択し 「削除」 するだけで、作成されたリソース(IAM ロール・Lambda など)がまとめて削除されます。
Q. パラメータの値を変更しても大丈夫ですか?
A. stackName 程度であれば問題ありませんが、TrustedAWSAccountId や DeploymentMode を変更すると正しく動作しません。基本はそのままでお願いします。
Q. レベルアッパーモードで、Admin 権限は何分間有効になりますか?
A. Lambda 実行時に設定される有効時間に依存します。詳細は担当者にご確認ください。
まとめ
- クラスメソッドからお渡しする URL をクリックし、「スタックの作成」を押すだけで、調査用の IAM ロールが自動作成されます。
- ReadOnly モード:参照専用の IAM ロールを作成するシンプルな構成。
- レベルアッパーモード:普段は Admin 操作できず、必要な時だけ Lambda で一定時間 Admin 権限を有効化する、より安全な構成。「明示的な Deny が Allow より優先される」IAM の仕組みと、
DateGreaterThanのConditionを組み合わせて実現しています。







