スイッチロールの設定ってプロジェクトの開始時やJoinした時にやるくらいで、いつもどうやるんだっけ?となります。最近たまたまスイッチロールを使う機会があったんですが、今回も案の定忘れてしまっていたので、この機会にIaC化します。
スイッチロール
スイッチロールは、複数のAWSアカウントで作業している際に、既存のサインインを維持したまま、別のAWSアカウントに切り替える機能です。
しくみ
スイッチ元のAWSアカウント(サインイン中のAWSアカウント)からスイッチ先のAWSアカウント(切り替えたいAWSアカウント)のロールを指定してスイッチします。
スイッチ先のアカウントID: 000000000000 スイッチ元のアカウントID: 111111111111
スイッチ先でIAM Roleを作成し、信頼関係でスイッチ元からのAssumeRoleを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::000000000000:root"
},
"Action": "sts:AssumeRole"
}
]
}
このロールにアタッチされたポリシーがスイッチ先の権限になるので、全権限を渡したければAdministratorAccessを、もし、権限を絞りたければ、必要の権限を渡すようにしてください。
スイッチ元のIAMユーザーがスイッチロールできるようにするために、ユーザーにスイッチ先のロールにAssumeRoleできる権限を渡します。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "arn:aws:iam::111111111111:role/role-name",
"Sid": ""
}
],
"Version": "2012-10-17"
}
全体像はこんな感じ

あとはこちらの手順でスイッチロールします。
Terraform化
このコードを実行するにはAWS CLIからプロファイルを切り替えることで2つのアカウントを操作できるようにしておく必要があります。以下のコマンドを実行して、プロファイルを作成しておいてください。srcがスイッチ元で、destがスイッチ先です。
aws --profile src configure aws --profile dest configure
コードの内容は概ねしくみで説明した通りなんですが、スイッチ元IAMユーザーにポリシーをアタッチするとしていた部分を、グループを作って、そこに所属したユーザーに権限を付与するようにしています。今回はスイッチロールできるようにするのがゴールなので、権限はAdministratorAccessとします。Data SourceでIAMユーザーの一覧を取得して、全IAMユーザーをグループに追加しています。
適当なディレクトリにファイルをダウンロードして実行しましょう。
curl -fsSO https://gist.githubusercontent.com/vtj-ttanaka/868839e3ea8764f76e1aa7adcd5797ed/raw/1a908a47f12bd524066fc2b85255598688df71d5/main.tf
同じディレクトリでTerraformを初期化&プレビューしてみます。
terraform init terraform plan
どちらもエラーなく完了したら適用します。
terraform apply
こちらもエラーなく完了していれば、2つのアカウントで必要なリソースが作られているはずです。作られるリソースは以下です。
スイッチ元
- IAMポリシー test-switch-role
- IAMユーザーグループ switch-to-<スイッチ先のAWS Account ID>
スイッチ先
- IAMロール test-switch-role
もし、これらのリソースが見当たらなければ、他のアカウントに作られてしまっているかもしれません。
それでは実際にスイッチロールしてみます。
右上のアカウントを開いて「ロールの切り替え」をクリック

- 「アカウント」にはスイッチ先のアカウントIDを入力します。
terraform output -raw account_idで取得できます。 - 「ロール」にはスイッチ先で作ったロール名を入力します。
terraform output -raw roleで取得できます。 - 「表示名」にはわかりやすい名前を入力しておいてください。

ロールの切り替えをぽちると…

別のAWSアカウントにスイッチできました。
まとめ
スイッチロールの設定はなかなか何度もやる機会がないのでずっと手作業していましたが、IaC化することで簡単に環境を用意できるようになりました。Terraformは複数のAWSアカウントを一度に処理できるので、今後は行ったり来たりしながら設定することもなくて、少しは便利になったと思います。
