とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

TerraformでAWS IAMのスイッチロール環境を構築

スイッチロールの設定ってプロジェクトの開始時やJoinした時にやるくらいで、いつもどうやるんだっけ?となります。最近たまたまスイッチロールを使う機会があったんですが、今回も案の定忘れてしまっていたので、この機会にIaC化します。

スイッチロール

スイッチロールは、複数のAWSアカウントで作業している際に、既存のサインインを維持したまま、別のAWSアカウントに切り替える機能です。

docs.aws.amazon.com

しくみ

スイッチ元の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化

gist.github.com

このコードを実行するには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アカウントを一度に処理できるので、今後は行ったり来たりしながら設定することもなくて、少しは便利になったと思います。