他の AWS アカウントの IAM ロールを使って操作できるよう IAM 設定を Terraform で行いたい。
スイッチロールのイメージ
以下のような感じにする。
踏み台 AWS アカウントの IAM 設定用 tf ファイル
// アカウントID を取得する data "aws_caller_identity" "custodian" {} // 管理者向けの IAM ポリシードキュメントを設定する data "aws_iam_policy_document" "admin" { statement { effect = "Allow" actions = [ "sts:DecodeAuthorizationMessage", "sts:GetCallerIdentity", "sts:GetSessionToken", ] resources = ["*"] } // アクセスする先の AWS アカウントにある IAM ロールへの AssumeRole を許可する statement { effect = "Allow" actions = ["sts:AssumeRole"] resources = [ "arn:aws:iam::987654321098:role/switch-role-admin", ] } // IAM のリソースの参照権限を許可する statement { effect = "Allow" actions = [ "iam:Get*", "iam:List*", ] resources = ["*"] } // 自分自身へのパスワード変更やログイン情報、アクセスキーに関する操作を許可する statement { effect = "Allow" actions = [ "iam:ChangePassword", "iam:*LoginProfile", "iam:*AccessKey*", ] resources = [ "arn:aws:iam::${data.aws_caller_identity.custodian.account_id}:user/&{aws:username}", ] } } // IAM ポリシーを作成して管理者用のポリシーを設定する resource "aws_iam_policy" "admin" { name = "${aws_iam_group.admin.name}" policy = "${data.aws_iam_policy_document.admin.json}" } // IAM グループを作成する resource "aws_iam_group" "admin" { name = "passione" } // IAM グループにポリシーをアタッチする resource "aws_iam_group_policy_attachment" "admin" { group = "${aws_iam_group.admin.name}" policy_arn = "${aws_iam_policy.admin.arn}" } // IAM ユーザを作成する resource "aws_iam_user" "hogehoge" { name = "hogehoge" } // IAM ユーザーを IAM グループに追加する resource "aws_iam_group_membership" "admin" { name = "${aws_iam_group.hogehoge.name}" group = "${aws_iam_group.admin.name}" users = [ "${aws_iam_user.hogehoge.name}", ] }
切り替え先 AWS アカウントの IAM 設定用 tf ファイル
// IAM ポリシードキュメント作成 data "aws_iam_policy_document" "assume_role_policy" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "AWS" identifiers = ["arn:aws:iam::123456789012:root"] } } } // IAM ロール作成 resource "aws_iam_role" "admin" { name = "switch-role-admin" assume_role_policy = "${data.aws_iam_policy_document.assume_role_policy.json}" } // IAM ポリシードキュメント作成 data "aws_iam_policy_document" "admin" { statement { effect = "Allow" actions = ["*"] resources = ["*"] } } // IAM ポリシー作成 resource "aws_iam_policy" "admin" { name = "admin_policy" policy = "${data.aws_iam_policy_document.admin.json}" } // IAM ポリシーを IAM ポリシーへアタッチ resource "aws_iam_role_policy_attachment" "admin" { role = "${aws_iam_role.admin.name}" policy_arn = "${aws_iam_policy.admin.arn}" }
参考
AWS Organizationsによるマルチアカウント戦略とその実装 - クラウドワークス エンジニアブログ ロールの切り替え (コンソール) - AWS Identity and Access Management