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-xxx
はAWSアカウントごとに振られたID(Instance ID?)。p-xxx
はアカウントのロールごとに振られたID(Permission ID?)。
ins-xxx
、p-xxx
を公開されているAWSのAPIから引っ張ってくることはできなかったが*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=
- アカウント:
my-alt-account-xxx
、ロール:DBOperator
のManagement Consoleを開くリンク
※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が見つかるのではないか、、、と考えてこうしている。