【新機能】IAMユーザーをManagement Consoleからクロスアカウントで色々なRoleにスイッチする事ができるようになりました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はIAMにできたなかなか面白い機能をご紹介します。IAMで役割(Role)を予め作っておき、AWS Management ConsoleからIAMユーザーをそのRoleにスイッチさせることにより一つのユーザーで様々な役割でのアクセスが可能になる、というものです。

どういう時に使うの

普段IAMユーザーに役割を割り振る時にはその業務別で権限を分けているかと思います。例えばDeveloper(開発者)であれば開発環境には触れるけれども本番環境には触れない、運用担当であれば状態を見ることはできるけども変更することは出来ない、みたいな感じです。
でも一時的に権限を与えたい場合などがあるかと思います。本番環境にシステムをデプロイする時だけはDeveloperにも権限を与えたい、運用担当が軽微な修正点を発見した時はその場で修正できるようにしたい、というような時です。今までであれば本番環境に触れるような一時的なIAMユーザーを作るか、直接権限を変更するか、権限のあるグループに一時的に所属させるか、というような処理を行いました。今回の機能では本番環境に触れるRoleを作っておき、必要な時にそのRoleにスイッチすることで本番環境に触れるようになります。

今回の機能の目玉は、それがクロスアカウントでも実現する、というところにあります。ステージング環境と本番環境でアカウントを分けている方も多いと思いますが、今回の機能を使うことでアカウントをまたいでステージング、本番環境の操作がシームレスに行えます。これは画期的!!またこの機能はIAMユーザーだけではなくシングルサインオンに使用するSAMLを用いたFederatedユーザーにも適用されます。(※1)

概念の理解

一体これはどういう仕組みにもとづいているのでしょう。ポイントは「Assume Role」、プログラムでいうところの「Delegate(移譲)」という概念です。
Assume Roleについてはこちらのブログをご覧になっていただければ理解が深まるかと思います。Delegateとは簡単に言うとオブジェクトに振る舞いを登録することでその振る舞いを他のクラスからすぐに使えるようにする、というような感覚のものです。
つまりまとめると「役割」をIAM Roleに登録しておき、それをIAMユーザーからすぐに使えるようにアクセス許可をしておく、ということです。
ひとつ注意点としては、IAM Roleにスイッチするとスイッチしている間は元々あったIAMユーザーの権限は放棄することになります。IAM Roleとしてのアクションをし終わったら再び元のIAMユーザーの権限に戻ります。

やってみた

準備

では早速やってみましょう。IAMユーザーを一つ作ります。[test_developer]という名前をつけます。この人はdeveloper(開発者)の役割です。

iam_switch1

EC2インスタンスを2つ立て[test_develop][test_production]という名前をつけます。IAMポリシーをつけて[test_develop]のみ操作できるように制限をかけます。

iam_switch2

{
  "Version": "2012-10-17",
  "Statement": [
     {
      "Action": [
        "ec2:describe*"
      ],
      "Sid": "Stmt1373379895000",
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    },
    {
      "Sid": "Stmt1420608596000",
      "Effect": "Allow",
      "Action": [
        "ec2:*"
      ],
      "Resource": [
        "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-9fffc66d"
      ]
    }
  ]
}

確認します。[test_developer]でログインしてEC2から[test_production]をSTOPしてみます。

iam_switch3

権限がないと怒られました。開発者は本番環境には触れません。

Roleの設定

では新機能を試してみましょう。本番環境も触れるIAM Roleを作成します。

iam_switch4

Role Typeに「Role for Cross-Account Access」を選択します。

iam_switch5

許可するIAMユーザーの所属するアカウントIDを入力しとMFAをつけるかどうかをチェックします。ここで他のアカウントIDを選択するとクロスアカウントが実現します。

iam_switch6

許可する権限を選びます。今回はEC2のフルアクセスを与えてみます。

iam_switch7

権限内容が表示されます。

iam_switch8

最後に確認画面です。このARNは後で使うのでメモっておきましょう。また下のURLはコンソールを使用してスイッチする時に使うものです。

iam_switch9

[test_developer]のIAMユーザーを選択し、先程作ったIAM Roleを追加します。これによってIAM Roleを使う事ができます。
Resourceの部分に先程メモったARNをペーストします。

iam_switch10

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/switchproduction"
  }
}

Actionは「AssumeRole」になるんですね。これで準備はOKです。

iam_switch11

使ってみる

では使ってみましょう。[test_developer]でAWS Management Consoleにログインして右上のユーザー名部分をクリックすると新たにSwitch Roleというリンクができています。

iam_switch12

最初に機能の紹介画面が出ます。2回目からはこちらは表示されません。新機能っぽくてワクワクしますね。

iam_switch13

ロールの切替画面が表示されます。アカウント名、ロール名、表示名、表示色をそれぞれ入力、選択します。

iam_switch14

画面右上のユーザー名のところが先程入力した表示名と表示色に変わっています。

iam_switch15

では動かしてみます。[test_production]をstopしてみると、、、先程はエラーが出ていましたが今回は見事に動いてくれました!

iam_switch16

ちなみに元に戻す時は右上の表示名のところをクリックすると[Back to test_developer]というリンクがありますので、こちらを選択することで元の権限にもどります。

iam_switch17

まとめ

いかがでしたでしょうか。これは業務等で複数のAWSアカウントを使う人には欠かせない機能になりそうです。
ちなみに[Role History]の所には使ったRoleが残りますので2回目以降はより簡単に役割を変更することができます。是非お試しください!

参考サイト

脚注

※1 - SAMLを用いないFederatedユーザーは現在IAMロールの切り替えが実行できないようです(2015/05/14)