dshimizu/blog/alpha

とりとめのないITブログ

Organization で複数の AWS アカウント利用時に他のAWS アカウントの IAM ロールに切り替えれるような IAM 設定を Terraform でやるときのサンプル tf ファイル

他の AWS アカウントの IAM ロールを使って操作できるよう IAM 設定を Terraform で行いたい。

スイッチロールのイメージ

以下のような感じにする。

f:id:dshimizu:20220406204128p:plain

踏み台 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