自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

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

他の 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