AWS SSOで直接AWSアカウントのManagement Consoleを開く

AWS SSOで各AWSアカウントのManage Consoleを開く場合、AWSアクセスポータルURL(d-xxxxxxxxxx.awsapps.com/start)から遷移するが、赤枠のリンクは固定値のようなので、そのリンクから個別のアカウントのManage Console開くことができる。

リンクのURLは下のようになっていて

https://d-12345abcde.awsapps.com/start/#/saml/custom/123456789012%20%28my-account%29/MTIzNDU2Nzg5MDEyX2lucy0xMjM0NTY3ODkwYWJjZWRmX3AtMTIzNDU2Nzg5MGFi%3D%3D

/custom/の下は123456789012 (my-account)アカウントID (アカウント名)をURLエンコードしたもの。

その下のMTIzNDU2Nzg5MDEyX2lucy0xMjM0NTY3ODkwYWJjZWRmX3AtMTIzNDU2Nzg5MGFi%3D%3Dから末尾の%3D%3D*1をとってBase64デコードすると

~% echo 'MTIzNDU2Nzg5MDEyX2lucy0xMjM0NTY3ODkwYWJjZWRmX3AtMTIzNDU2Nzg5MGFi' | base64 -D
123456789012_ins-1234567890abcedf_p-1234567890ab

という値が出てくる。

先頭の値がAWS Organizationsの親アカウント。ins-xxxAWSアカウントごとに振られたID(Instance ID?)。p-xxxはアカウントのロールごとに振られたID(Permission ID?)。

ins-xxxp-xxxを公開されているAWSAPIから引っ張ってくることはできなかったが*2、アクセスポータルのリンクから取得できるので、それらを組み合わせて動的に直接AWSアカウントのManagement Consoleを開くリンクを作成できる。


例)

  • アカウントID: 999456789012
  • アカウント名: my-alt-account-xxx
  • 親アカウントID: 123456789012
  • ins: ins-abcedf7890abcedf
  • p: p-abcdef7890ab (ロール DBOperator に紐付く値とする)
~% echo -n '123456789012_abcedf7890abcedf_p-abcdef7890ab' | base64
MTIzNDU2Nzg5MDEyX2FiY2VkZjc4OTBhYmNlZGZfcC1hYmNkZWY3ODkwYWI=

Base64部分は別に変更しなくてもフォールバックするみたいで、/999456789012%20%28my-alt-account-xxx%29/の部分だけ修正しても一応、対象のAWSアカウントに遷移できた


Goで実装したリダイレクター

https://example.com/my-alt-account-xxx/DBOperator のようなURLでManagement Consoleを開くWebアプリの例。

gistfc640578525ac9f4619082be61b9b880

別にins-xxx p-xxx から動的にBase64の文字列を生成せず、Base64の文字列ままで保持しておいてもいいのだけれど、実はins-xxx p-xxxを引っ張ってこれるAPIが見つかるのではないか、、、と考えてこうしている。

*1:Base64のパディングをURLエンコードしたもの

*2:AWS SSOまわりだと思うが見つけられなかった