話題の記事

IAM ロールで 100 連鎖してみた

俺達はいつまでも立ち尽くし見つめていた━━━ 数多の IAM ロールが移ろうように連鎖していく、そのさまを。

コンバンハ、「 IAM ロールはお面」おじさんです。

この世で最も大切なもの、それは繋がりであり、そして連なりですよね。

ということで、早速 IAM ロールで 10 連鎖してみました。

いや、せっかくなので 100 連鎖くらい行ってみましょうか。そうしましょう。興奮してきたな。

まとめ

IAM ロールはそんな連鎖させるようなもんじゃない。

手始めに IAM ロールを 101 個作ろう

早速、 100 連鎖のために IAM ロールを 101 個作ります

「 100 連鎖なのに 101 個なの?」と思うかもしれませんが、ヤマタノオロチの「股(首と首の間)」は 7 個しかありませんよね。(「岐」は 8 個あるんですけどね。)それと同じです。

101 個くらいの数なら「温かみのある手作業」でポチポチ作ってもいいかなと思いましたが、人の温かみにも限度があることを思い出しました。自動でロールを作成するために、以下のスクリプトを作りました。

CreateRole.sh

#! /bin/bash
for ((i=1; i<=101; i++))
do
    arn=`aws iam create-role --role-name chibayuki-$i  --path /chibayuki/ --assume-role-policy-document file://trustpolicy.json | jq -r .Role.Arn`
    aws iam put-role-policy --role-name chibayuki-$i --policy-name inline-policy --policy-document file://rolepolicy.json
    echo  `date +"%H:%M:%S"` : $arn を作成し、ポリシーをアタッチしました。

done

作成スクリプトの中身を確認しよう

大きくは以下を行っています。

  • IAM ロールの作成
  • 作成した IAM ロールへインラインポリシーをアタッチ

アイデンティティベースポリシーをアタッチした状態で IAM ロールを作成、ということはできないのが残念です。

ロールの作成

ロール作成時には信頼ポリシーの指定が必須なので、予め以下ファイルを用意し、指定しています。

trustpolicy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::012345678910:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

同一アカウントからの AssumeRole を許可しています。

インラインポリシーのアタッチ

取り立てて理由はないのですが、管理ポリシーではなくインラインポリシーのアタッチにしました。(管理ポリシーをアタッチする際には以下のコマンドを使用します。)

ポリシーの内訳は以下です。

rolepolicy.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::012345678910:role/chibayuki/*"
        }
    ]
}

同一アカウントの、パス/chibayuki/配下のロールへの AssumeRole を許可しています。

作成スクリプトを流そう

流しましょう!

% sh CreateRole.sh
20:40:21 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-1 を作成し、ポリシーをアタッチしました。
20:40:25 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-2 を作成し、ポリシーをアタッチしました。
20:40:28 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-3 を作成し、ポリシーをアタッチしました。
20:40:31 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-4 を作成し、ポリシーをアタッチしました。
20:40:35 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-5 を作成し、ポリシーをアタッチしました。
20:40:38 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-6 を作成し、ポリシーをアタッチしました。
20:40:42 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-7 を作成し、ポリシーをアタッチしました。

-------中略-------

20:49:23 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-95 を作成し、ポリシーをアタッチしました。
20:49:27 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-96 を作成し、ポリシーをアタッチしました。
20:49:30 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-97 を作成し、ポリシーをアタッチしました。
20:49:35 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-98 を作成し、ポリシーをアタッチしました。
20:49:38 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-99 を作成し、ポリシーをアタッチしました。
20:49:42 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-100 を作成し、ポリシーをアタッチしました。
20:49:45 : arn:aws:iam::012345678910:role/chibayuki/chibayuki-101 を作成し、ポリシーをアタッチしました。

流しました!

ロールが 101 個できました。早速 100 連鎖していきましょう!

そろそろ意味と意図を説明してほしい

ここまで読まれた方は上記の想いを抱いたかも知れません。実際に 100 連鎖をする前に説明しておきます。

今回やりたいのはこういったことです。

IAMRole_Chaining

ちょっとまだよくわからない

今回やりたいのはこういったことです。

IAMRole_Chaining_omen

つまりどういうことですか?

IAM ロールで 100 連鎖したいです。

つまりどういうことですか?

IAM ロールには連鎖という概念があります。

まず、IAM ユーザーなどのいくつかのエンティティは IAM ロールを引き受けることができます。 STS というサービスを通じて AssumeRole を行うことで、一時的に使用可能な認証情報セッショントークンを受け取ります。トークンが有効なセッションにおいて、エンティティは IAM ロールと同等の権限を有することになります。

上記の仕組みを、以下のエントリでは下図のように表現しました。

IAMRole8

そして、ロールを引き受けたセッションの状態でも、さらに他のロールを引き受けることができます。これをロールの連鎖と呼びます。権限が重複するわけではなく、つど最後に引き受けたロールの権限のみを有することになります。

この連鎖を繰り返して、100 連鎖まで繋げてみようというのが今回の趣旨です。

なぜそんなことをするのですか?

連鎖数に制限があるのかを確認したかったからです。

平たく言えば、 IAM ロールの向こう側の景色があるのなら、それを見たかったということです。人の探究心、それは決して止めることのできないものです。

IAM ロールで 100 連鎖してみた

早速 100 連鎖していきます。

100 連鎖くらいなら「まごころを込めた手作業」でポチポチやってもいいかな、と思いましたが、まごころの在庫にも限りがあることを思い出しました。自動で連鎖するために以下のスクリプトを作成しました。

SwitchRole.sh

#! /bin/bash
for ((i=1; i<=101; i++))
do

    before=`aws sts get-caller-identity | jq -r .Arn`
    output=`aws sts assume-role --role-arn arn:aws:iam::012345678910:role/chibayuki/chibayuki-$i --role-session-name chiba-session$i`

    export AWS_ACCESS_KEY_ID=`echo $output | jq -r .Credentials.AccessKeyId`
    export AWS_SECRET_ACCESS_KEY=`echo $output | jq -r .Credentials.SecretAccessKey`
    export AWS_SESSION_TOKEN=`echo $output | jq -r .Credentials.SessionToken`

    after=`aws sts get-caller-identity | jq -r .Arn`

    echo `date +"%H:%M:%S"` : $((i-1)) 連鎖目、 $before から $after になりました。
    
done

連鎖スクリプトの中身を確認しよう

大きくは以下を行なっています。

  • aws sts assume-role で一時認証情報、トークンを取得
    • 取得した値を環境変数に設定
  • 前後で aws sts get-caller-identity を実行

aws sts assume-role

aws sts assume-role を行うと、以下のようなアウトプットが返ってきます。

{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA3XFRBF535PLBIFPI4:s3-access-example",
        "Arn": "arn:aws:sts::123456789012:assumed-role/xaccounts3access/s3-access-example"
    },
    "Credentials": {
        "SecretAccessKey": "9drTJvcXLB89EXAMPLELB8923FB892xMFI",
        "SessionToken": "AQoXdzELDDY//////////wEaoAK1wvxJY12r2IrDFT2IvAzTCn3zHoZ7YNtpiQLF0MqZye/qwjzP2iEXAMPLEbw/m3hsj8VBTkPORGvr9jM5sgP+w9IZWZnU+LWhmg+a5fDi2oTGUYcdg9uexQ4mtCHIHfi4citgqZTgco40Yqr4lIlo4V2b2Dyauk0eYFNebHtYlFVgAUj+7Indz3LU0aTWk1WKIjHmmMCIoTkyYp/k7kUG7moeEYKSitwQIi6Gjn+nyzM+PtoA3685ixzv0R7i5rjQi0YE0lf1oeie3bDiNHncmzosRM6SFiPzSvp6h/32xQuZsjcypmwsPSDtTPYcs0+YN/8BRi2/IcrxSpnWEXAMPLEXSDFTAQAM6Dl9zR0tXoybnlrZIwMLlMi1Kcgo5OytwU=",
        "Expiration": "2016-03-15T00:05:07Z",
        "AccessKeyId": "ASIAJEXAMPLEXEG2JICEA"
    }
}

ここから以下の値を取得し、環境変数にセットすることで AssumeRole を実現しています。

  • AccessKeyId
  • SecretAccessKey
  • SessionToken

aws sts get-caller-identity

このコマンドにより、API コールを行なっている IAM エンティティを確認できます。

{
    "UserId": "AIDASAMPLEUSERID",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/DevAdmin"
}

今回は初回のみ IAM ユーザーの ARN が返ってきて、以降は AssumeRole した セッションの ARN が返ってくることになります。

完全に余談ですが、このコマンドを実行するために IAM の許可は必要ありません。明示的に Deny されていても、変わらず aws sts get-caller-identity は実行できます。面白いですね。

連鎖スクリプトを流そう

流しましょう!

% sh SwitchRole.sh
21:42:29 : 0 連鎖目、 arn:aws:iam::012345678910:user/chiba-cli から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1 になりました。
21:42:32 : 1 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session2 になりました。
21:42:35 : 2 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session2 から arn:aws:sts::012345678910:assumed-role/chibayuki-3/chiba-session3 になりました。
21:42:39 : 3 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-3/chiba-session3 から arn:aws:sts::012345678910:assumed-role/chibayuki-4/chiba-session4 になりました。
21:42:42 : 4 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-4/chiba-session4 から arn:aws:sts::012345678910:assumed-role/chibayuki-5/chiba-session5 になりました。
21:42:45 : 5 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-5/chiba-session5 から arn:aws:sts::012345678910:assumed-role/chibayuki-6/chiba-session6 になりました。
21:42:48 : 6 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-6/chiba-session6 から arn:aws:sts::012345678910:assumed-role/chibayuki-7/chiba-session7 になりました。
21:42:51 : 7 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-7/chiba-session7 から arn:aws:sts::012345678910:assumed-role/chibayuki-8/chiba-session8 になりました。
21:42:54 : 8 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-8/chiba-session8 から arn:aws:sts::012345678910:assumed-role/chibayuki-9/chiba-session9 になりました。
21:42:57 : 9 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-9/chiba-session9 から arn:aws:sts::012345678910:assumed-role/chibayuki-10/chiba-session10 になりました。
21:43:00 : 10 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-10/chiba-session10 から arn:aws:sts::012345678910:assumed-role/chibayuki-11/chiba-session11 になりました。

-------中略-------

21:47:04 : 90 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-90/chiba-session90 から arn:aws:sts::012345678910:assumed-role/chibayuki-91/chiba-session91 になりました。
21:47:07 : 91 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-91/chiba-session91 から arn:aws:sts::012345678910:assumed-role/chibayuki-92/chiba-session92 になりました。
21:47:10 : 92 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-92/chiba-session92 から arn:aws:sts::012345678910:assumed-role/chibayuki-93/chiba-session93 になりました。
21:47:13 : 93 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-93/chiba-session93 から arn:aws:sts::012345678910:assumed-role/chibayuki-94/chiba-session94 になりました。
21:47:16 : 94 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-94/chiba-session94 から arn:aws:sts::012345678910:assumed-role/chibayuki-95/chiba-session95 になりました。
21:47:19 : 95 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-95/chiba-session95 から arn:aws:sts::012345678910:assumed-role/chibayuki-96/chiba-session96 になりました。
21:47:22 : 96 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-96/chiba-session96 から arn:aws:sts::012345678910:assumed-role/chibayuki-97/chiba-session97 になりました。
21:47:25 : 97 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-97/chiba-session97 から arn:aws:sts::012345678910:assumed-role/chibayuki-98/chiba-session98 になりました。
21:47:28 : 98 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-98/chiba-session98 から arn:aws:sts::012345678910:assumed-role/chibayuki-99/chiba-session99 になりました。
21:47:31 : 99 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-99/chiba-session99 から arn:aws:sts::012345678910:assumed-role/chibayuki-100/chiba-session100 になりました。
21:47:34 : 100 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-100/chiba-session100 から arn:aws:sts::012345678910:assumed-role/chibayuki-101/chiba-session101 になりました。


流しました!

あっけなく 5 分程度で終わりました。


━━━私は昔から国語がそんなに得意ではなく、「登場人物の気持ちを答えよ」という問題を苦手としていました。人類は一つとして同一の個体が存在せず、それゆえに互いの気持ちを推し量ることなどできません。ましてや架空の登場人物の気持ちを類推するなどどうしてできるでしょうか。

でも、今もし「 IAM ロールで 100 連鎖した時の気持ちを答えよ(50字程度)」と問われたら、 100 点満点の回答をできる気がします。

そうか…… これが……

これが、 IAM ロールで 100 連鎖した時の気持ちか━━━


IAM ロールで 900 連鎖してみた

100 連鎖があっという間に完了したので、もう少しスケールさせてみることにします。

同様の仕組みで行けるところまで行ってみようと思い、デフォルトの上限 1000 個まで IAM ロールを増やすことにしました。

IAM_and_STS_quotas_-_AWS_Identity_and_Access_Management

今回の試みとは関係ないロールがすでに 100 個弱あったので、残りの枠を使って 900 連鎖を目指します。

IAM ロールを追加で 800 個作ろう

先述のスクリプトを流用し、追加の 800 個のロールを作りました。

そんなこんなでロールのトータルが 1000 個になりました。なかなか見る機会がない表示が出て、得した気分です。(皆さんは IAM ロールを何個持っていますか?私はね、1000 個持っているんですよ。)

IAM_Management_Console

(こんなことをして遊んでたらそれだけで AWS 利用費が 50 ドルを超えていたのですが……それはまた別の話。)

900 連鎖してみよう

はい、してみました。普通に連鎖できましたよ。

はい。

薄々感づいていましたよ、これ、終わりがないやつだなって。

終わりのない連鎖の旅に出かけてみた

終わりがないことをなんとなく感じながらも、せめて 1000 連鎖は超えてみたいと思いました。

これまでと同様の仕組みを用いるのであれば IAM ロールが 1002 個以上必要です。上限緩和については以下文言があります。

1 つの AWS アカウントで作成できる IAM ロール数の上限は 1,000 です。これ以上のロールが必要な場合は、ユースケースを添えて、IAM の上限緩和申請フォームを送信してください。AWS で検討いたします。

ユースケースに「1000 連鎖したいから(IAM ロールの向こう側を見たいから)」と書くのは少し恥ずかしいし、そんなことで時間を取らせるのも申し訳なく感じます。

別のアプローチをとる事にします。

これが新たな連鎖用のスクリプトだ

既存のものを少しカスタマイズして、以下のスクリプトを作成しました。

SwitchRole2.sh

#! /bin/bash
for ((i=1; i<=99999; i++))
do

    before=`aws sts get-caller-identity | jq -r .Arn`

    if [ `expr $i % 2` == 0 ]; then
        output=`aws sts assume-role --role-arn arn:aws:iam::012345678910:role/chibayuki/chibayuki-2 --role-session-name chiba-session$i`
    else
        output=`aws sts assume-role --role-arn arn:aws:iam::012345678910:role/chibayuki/chibayuki-1 --role-session-name chiba-session$i`
    fi

    export AWS_ACCESS_KEY_ID=`echo $output | jq -r .Credentials.AccessKeyId`
    export AWS_SECRET_ACCESS_KEY=`echo $output | jq -r .Credentials.SecretAccessKey`
    export AWS_SESSION_TOKEN=`echo $output | jq -r .Credentials.SessionToken`

    after=`aws sts get-caller-identity | jq -r .Arn`

    echo `date +"%H:%M:%S"` : $((i-1)) 連鎖目、 $before から $after になりました。
    
done

2 つの IAM ロール間でひたすら連鎖するという仕様です。

IAMRole_Chaining_Forever

完全に実用性がない手法ですが、連鎖数を稼ぎたいだけなら初めからこうしておけばよかったですね。

新たな連鎖スクリプトを流してみた

早速流してみます。

順調にスタートを切りました。

% sh SwitchRole2.sh
21:27:59 : 0 連鎖目、 arn:aws:iam::012345678910:user/chiba-cli から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1 になりました。
21:28:03 : 1 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session2 になりました。
21:28:06 : 2 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session2 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3 になりました。
21:28:09 : 3 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session4 になりました。
21:28:12 : 4 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session4 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5 になりました。
21:28:15 : 5 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session6 になりました。
21:28:18 : 6 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session6 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session7 になりました。
21:28:21 : 7 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session7 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session8 になりました。
21:28:25 : 8 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session8 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session9 になりました。
21:28:28 : 9 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session9 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session10 になりました。
21:28:31 : 10 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session10 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session11 になりました。
------

10 分程度で 200 連鎖に差し掛かろうとしています。ペースを落とさずに頑張って欲しいですね。

------
21:37:42 : 189 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session189 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session190 になりました。
21:37:45 : 190 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session190 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session191 になりました。
21:37:48 : 191 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session191 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session192 になりました。
21:37:50 : 192 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session192 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session193 になりました。
21:37:53 : 193 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session193 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session194 になりました。
21:37:56 : 194 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session194 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session195 になりました。
21:37:59 : 195 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session195 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session196 になりました。
21:38:02 : 196 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session196 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session197 になりました。
21:38:05 : 197 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session197 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session198 になりました。
21:38:08 : 198 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session198 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session199 になりました。
21:38:11 : 199 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session199 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session200 になりました。
------

25 分経過して 500 連鎖を超えました。疲れ知らずです。「こんな意味もなく連鎖させられてどんな気持ちなんでしょうね」と書こうと思いましたが、主語が分からなくなったのでやめました。

------
21:53:00 : 507 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session507 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session508 になりました。
21:53:04 : 508 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session508 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session509 になりました。
21:53:06 : 509 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session509 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session510 になりました。
21:53:08 : 510 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session510 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session511 になりました。
21:53:11 : 511 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session511 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session512 になりました。
21:53:13 : 512 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session512 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session513 になりました。
21:53:16 : 513 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session513 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session514 になりました。
21:53:18 : 514 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session514 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session515 になりました。
21:53:21 : 515 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session515 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session516 になりました。
21:53:23 : 516 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session516 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session517 になりました。
21:53:26 : 517 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session517 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session518 になりました。
------

開始からおよそ 50 分後に 1000 連鎖を達成しました。もう行くとこまで行っちゃいましょう。

------
22:17:07 : 993 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session993 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session994 になりました。
22:17:11 : 994 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session994 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session995 になりました。
22:17:14 : 995 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session995 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session996 になりました。
22:17:17 : 996 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session996 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session997 になりました。
22:17:20 : 997 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session997 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session998 になりました。
22:17:23 : 998 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session998 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session999 になりました。
22:17:26 : 999 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session999 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session1000 になりました。
22:17:29 : 1000 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session1000 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1001 になりました。
22:17:32 : 1001 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1001 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session1002 になりました。
22:17:35 : 1002 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session1002 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1003 になりました。
22:17:38 : 1003 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session1003 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session1004 になりました。
------

流しながら IAM ロールの連鎖のユースケースを考えよう

流しているのをただ見ているのも芸が無いので、IAM ロールの連鎖がどういったケースで使用されるのか確認しておきます。

最も機会が多いものとして考えられるのは、最終的に引き受ける IAM ロールの信頼ポリシーを簡素化したいというものです。

例えば以下図ではいくつかのパターンで IAM ロールの連鎖を行なっているケースを表しています。

IAMRole_Chaining_usecase

それぞれのパターンで一番右側に位置する IAM ロールが、最終的に引き受けられるロールです。これらは、ベストプラクティスに則れば必要最小権限のみが与えられている必要があります。(主にアイデンティティベースポリシーでの制御)

こういったロールを管理する主体が、それらを引き受けたいエンティティ( IAM ユーザーなど)の管理主体と異なる場合に、ロールを連鎖させることで管理の簡素化が期待できます。

例えば一番上のパターンを例にとると、アカウント A 上の IAM ユーザーがアカウント B 上の IAM ロール B を引き受けたい状況です。IAM ロール B の信頼ポリシーでアカウント A 全体を信頼することもできますが、よりセキュアな制御をしたいため、信頼するエンティティを個別に指定する方針であるとします。

アカウント A 上の IAM ユーザーは不定期に増減するため、都度アカウント B の管理者と連携をとってロール B の信頼ポリシーを修正する、というのは運用負荷が高くなります。

そこで、IAM ロール B を「アカウント A 上の IAM ロール A を信頼する」という設定にしておけば、その課題を解消できます。 IAM ユーザーが増減したとしても、アカウント A の管理者がロール A の信頼ポリシーを修正するのみで済むからです。

このような「管理主体が異なる」というケースだけでなく、権限をチューニングした IAM ロールを一元管理したい、というケースも考えられます。エンティティが複数グループ( IAM グループとは限りません)存在する際に、各グループが引き受けるロールそれぞれに権限を付与するのでなく、共通したロールとして切り出して用意しておくイメージです。

例えば十分に設計され必要最小限の権限を有した IAM ロールが切り出されて用意されており、必要時にそのロールを連鎖のうえ引き受けることができるのがグループ A とグループ C ……といった具合です。(グループ A , グループ C が直接引き受けられるそれぞれのロールに付与すると、管理が二度手間になる。)

こういったユースケースを考えると、連鎖する数として適切なのは多くても 2,3 連鎖程度でしょう。それ以上になると管理が複雑になるので、そもそもの構成を見直した方が良さそうです。

(そんなこんなしているうちに連鎖数は 3000 を超えました。)

------
00:14:50 : 3064 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3064 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3065 になりました。
00:14:53 : 3065 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3065 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3066 になりました。
00:14:56 : 3066 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3066 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3067 になりました。
00:14:59 : 3067 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3067 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3068 になりました。
00:15:01 : 3068 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3068 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3069 になりました。
00:15:04 : 3069 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3069 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3070 になりました。
00:15:07 : 3070 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3070 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3071 になりました。
00:15:10 : 3071 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3071 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3072 になりました。
00:15:13 : 3072 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3072 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3073 になりました。
00:15:16 : 3073 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3073 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3074 になりました。
00:15:20 : 3074 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session3074 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session3075 になりました。
------

人が使う場合だけでなく、 AWS サービスが引き受けるロールが連鎖することもあります。例えば Amazon Redshift では、 Redshift クラスターに関連づけられた IAM ロールがさらに他のロールを引き受けることができます。多くはクロスアカウントでの使用が想定され、ロールの連鎖を通じて S3 バケットや Lambda 関数へのアクセスが可能となります。

IAMRole_Chaining_usecase_Redshift

IAM ロールの連鎖を使用してクロスアカウントの S3 アクセスを実現している例は以下をご参照ください。

Redshift による IAM ロールの連鎖は 10 連鎖までと明確に定義されていますが、現実的な連鎖数としては多くても 2,3 連鎖程度でしょう。

(一方、裏側で頑張っている連鎖数は 5000 を超えています。深夜に何やってるんですかね。)

------
02:11:18 : 5357 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5357 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5358 になりました。
02:11:20 : 5358 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5358 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5359 になりました。
02:11:23 : 5359 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5359 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5360 になりました。
02:11:26 : 5360 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5360 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5361 になりました。
02:11:29 : 5361 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5361 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5362 になりました。
02:11:32 : 5362 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5362 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5363 になりました。
02:11:35 : 5363 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5363 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5364 になりました。
02:11:38 : 5364 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5364 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5365 になりました。
02:11:41 : 5365 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5365 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5366 になりました。
02:11:44 : 5366 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5366 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5367 になりました。
02:11:47 : 5367 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session5367 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session5368 になりました。
------

「 IAM ロールの連鎖のユースケース」と観点は異なりますが、セッションタグの推移について触れておきます。 AssumeRole 時にセッションタグを指定すると、そのタグは連鎖時にも推移します。

IAMRole_Chaining_SessionTag

ロールを引き受けたセッションは、以下タグを有することになります。

  • 引き受けたロールに付与されていたタグ
  • セッションタグ

連鎖が続いても、指定したセッションタグは遷移します。(連鎖後のセッションにも同一のセッションタグが引き継がれる。)

ABAC(属性ベースアクセスコントロール)と呼ばれる、「自身と同じタグが付与された AWS リソースのみ操作可能」という制御の仕方があります。ロールに元々付与されていたタグの他にも、セッション間で遷移するタグも ABAC のベースとして使用できます。その仕組みを利用して、「どのセッションにどのようなアクションを許可するか」を柔軟に制御できます。

とは言え連鎖数が増えるとタグの管理も複雑になるため、多くても 2,3 連鎖程度に留めておくのが現実的でしょう。

(そしていつの間にか連鎖数は 16000 を超えました。一晩中連鎖していたんですね。おはようございます。)

------
09:22:58 : 16018 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16018 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16019 になりました。
09:23:00 : 16019 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16019 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16020 になりました。
09:23:02 : 16020 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16020 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16021 になりました。
09:23:05 : 16021 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16021 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16022 になりました。
09:23:07 : 16022 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16022 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16023 になりました。
09:23:09 : 16023 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16023 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16024 になりました。
09:23:11 : 16024 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16024 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16025 になりました。
09:23:14 : 16025 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16025 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16026 になりました。
09:23:16 : 16026 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16026 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16027 になりました。
09:23:18 : 16027 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16027 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16028 になりました。
09:23:21 : 16028 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session16028 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session16029 になりました。
------

来たる突然の別れ

ここまで存分に連鎖させてきましたが、流石に、なんと言うか、その……飽きてきました。スクリプトをずっと動かし続けるために端末の自動スリープ設定を無効化したり、不要な記録を避けるために CloudTrail を無効化したりしているので、あまり長引かせるのは避けたい気持ちです。

もうここまで来たら 1 万も 10 万も変わらないかな……という気がしたので、スクリプトを停止させます。

------
21:16:33 : 33323 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33323 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33324 になりました。
21:16:35 : 33324 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33324 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33325 になりました。
21:16:37 : 33325 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33325 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33326 になりました。
21:16:40 : 33326 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33326 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33327 になりました。
21:16:42 : 33327 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33327 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33328 になりました。
21:16:44 : 33328 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33328 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33329 になりました。
21:16:47 : 33329 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33329 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33330 になりました。
21:16:49 : 33330 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33330 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33331 になりました。
21:16:51 : 33331 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33331 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33332 になりました。
21:16:53 : 33332 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33332 から arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33333 になりました。
21:16:55 : 33333 連鎖目、 arn:aws:sts::012345678910:assumed-role/chibayuki-1/chiba-session33333 から arn:aws:sts::012345678910:assumed-role/chibayuki-2/chiba-session33334 になりました。
^C

止めました。

結果、およそ24時間で 33333 連鎖でフィニッシュとなりました。後にも先にもこんな酔狂な行為に手を染める人間はいないと思うので、これを勝手にワールドレコードにしたいと思います。

これから先、私の行く末にどんなに険しく困難な道が待ち受けていたとしても、「でも自分は世界で一番 IAM ロールを連鎖させた男だからな……」ということを糧にし、乗り越えて行こうと思います。いついかなる時でも記録更新の挑戦は受け付けていますが、トライしようと思われる方はきちんと正気と相談してくださいね。楽しいのは初めの 5 分間くらいです。(あと環境によっては AWS 利用費が無駄にかかります。)

IAM ロールで 100 連鎖してみた(アナザーバージョン)

ワールドレコードを樹立したので、ウイニングランとして別パターンでの連鎖も試しておきます。

ここまでは環境変数に認証情報をセットし AssumeRole していましたが、AWS CLI 設定ファイル を使用するパターンでも連鎖できます。

(余談ですが、環境変数にセットした方が優先度が高く解釈されます。)

例えば以下のように設定ファイルを書いていたとします。

~/.aws/config

[default]
region = ap-northeast-1

[profile chibapro-1]
role_arn = arn:aws:iam::012345678910:role/chibayuki/chibayuki-1
source_profile = default

[profile chibapro-2]
role_arn = arn:aws:iam::012345678910:role/chibayuki/chibayuki-2
source_profile = chibapro-1

~/.aws/credentials

[default]
aws_access_key_id = AKIAQ3BIIHXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXX0gHnBTNsj5b

この状態でプロファイルとしてchibapro-2を指定して AWS CLI コマンドを実行すると、裏側では自動的に AssumeRole が行われます。

% aws sts get-caller-identity --profile chibapro-2
{
    "UserId": "AROAQ3BIIH73RI4XXXXXX:botocore-session-1618829290",
    "Account": "012345678910",
    "Arn": "arn:aws:sts::012345678910:assumed-role/chibayuki-2/botocore-session-1618829290"
}

IAMRole_Chaining_Profile

ちなみに、以下のようにループするような書き方をして実行するときちんと怒られます。

~/.aws/config

[default]
region = ap-northeast-1

[profile chibapro-1]
role_arn = arn:aws:iam::012345678910:role/chibayuki/chibayuki-1
source_profile = chibapro-2

[profile chibapro-2]
role_arn = arn:aws:iam::012345678910:role/chibayuki/chibayuki-2
source_profile = chibapro-1
% aws sts get-caller-identity --profile chibapro-2

Infinite loop in credential configuration detected. Attempting to load from profile chibapro-2 which has already been visited. Visited profiles: ['chibapro-2', 'chibapro-1']

IAMRole_Chaining_Profile_Loop

というわけで、以下のスクリプトを利用して 3 から 101 までのプロファイルを作成し、.aws/configに設定します。しました。

CreateProfile.sh

#! /bin/bash
for ((i=3; i<=101; i++))
do

cat << EOS 
[profile chibapro-$i]
role_arn = arn:aws:iam::012345678910:role/chibayuki/chibayuki-$i
source_profile = chibapro-$((i-1))

EOS
    
done > config.txt

プロファイル 101 を指定し、デバッグオプションを付与した上で AWS CLI コマンドを実行します。コマンド実行してから 5 分程度経過後に結果が表示されました。

% aws sts get-caller-identity --profile chibapro-101 --debug 2> debug.txt
{
    "UserId": "AROAQ3BIIH7XXXXXXXXXX:botocore-session-1618830209",
    "Account": "012345678910",
    "Arn": "arn:aws:sts::012345678910:assumed-role/chibayuki-101/botocore-session-1618830209"
}

ログは大量に出力されているのですが、 AssumeRole に関わりが深そうなところのみ grep して確認します。

% cat debug.txt | grep name=AssumeRole
2021-04-16 20:36:26,954 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-1', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ea06df0>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:36:29,881 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-2', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ec6b880>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:36:32,202 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-3', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ea06c40>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:36:35,103 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-4', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ec6b880>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:36:37,541 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-5', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ecb8640>, 'has_streaming_input': False, 'auth_type': None}}

-------中略-------

2021-04-16 20:40:50,594 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-97', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ee43460>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:40:52,975 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-98', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ec59f10>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:40:55,770 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-99', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ee24070>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:40:58,325 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-100', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ee534f0>, 'has_streaming_input': False, 'auth_type': None}}
2021-04-16 20:41:01,115 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=AssumeRole) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/2.1.33 Python/3.8.8 Darwin/19.6.0 exe/x86_64 prompt/off command/sts.get-caller-identity'}, 'body': {'Action': 'AssumeRole', 'Version': '2011-06-15', 'RoleArn': 'arn:aws:iam::012345678910:role/chibayuki/chibayuki-101', 'RoleSessionName': 'botocore-session-1618572984'}, 'url': 'https://sts.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7ff86ee60940>, 'has_streaming_input': False, 'auth_type': None}}

IAM ロールを 1 から順番に assume していることが分かります。裏側で 100 連鎖していたために、コマンドの実行結果が得られるまで時間を要したというわけでした。

100 連鎖程度であれば環境変数パターンでも AWS CLI 設定ファイルパターンでもそこまで手間は変わりません。お好みの手法で 100 連鎖させてみてください。(しないでください。)

IAM ロールはそんな連鎖させるようなもんじゃない

というわけで IAM ロールを無駄にたくさん連鎖させてみました。IAM ロールを連鎖したセッションの有効期間は最長で 1 時間、という制限はすぐに確認できたのですが、連鎖数に関する記述が見つからなかったためにやってしまいました。

再三確認したとおり現実的なラインでは 2,3 連鎖が関の山ですが、連鎖数の上限は恐らく設けられておらず、その気になればいくらでも連鎖させることができそうです。興味がある方は試してみてください。(思いがけず利用料が膨らんでも責任は取れません。)

ちなみに「 IAM ロールで 100 連鎖した時の気持ち」について答え合わせをしておくと、以下のようになります。

思っていたほどは面白くないし、終わりが無いことを予感してどこか不安だが、なぜか少し満ち足りた気持ち。(50字)

何ごともほどほどが一番。良識の範囲内で連鎖させてください。

以上、千葉(幸)がお送りしました。

参考