Присоединение политики Terraform к имени роли в модуле - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать роли данных в трех средах в AWS, используя Terraform. Одним из них является роль в учетной записи root. Эта роль может использоваться для входа в AWS и может принимать роли данных в процессе производства и подготовки. Это отлично работает. Это использует отдельный модуль.

У меня проблемы при попытке создать роли в Prod и постановке из модуля. Мой модуль выглядит так: main.tf:

resource "aws_iam_role" "this" {

  name               = "${var.name}"
  description        = "${format("%s (managed by Terraform)", var.policy_description)}"
  assume_role_policy = "${length(var.custom_principals) == 0 ? data.aws_iam_policy_document.assume_role.json : data.aws_iam_policy_document.assume_role_custom_principals.json}"
}

resource "aws_iam_policy" "this" {
  name        = "${var.name}"
  description = "${format("%s (managed by Terraform)", var.policy_description)}"
  policy      = "${var.policy}"
}

data "aws_iam_policy_document" "assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "AWS"
      identifiers = ["arn:aws:iam::${var.account_id}:root"]
    }
  }
}

data "aws_iam_policy_document" "assume_role_custom_principals" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type = "AWS"

      identifiers = [
        "${var.custom_principals}",
      ]
    }
  }
}

resource "aws_iam_role_policy_attachment" "this" {
  role       = "${aws_iam_role.this.name}"
  policy_arn = "${aws_iam_policy.this.arn}"
}

У меня также есть следующее в output.tf:

output "role_name" {
   value = "${aws_iam_role.this.name}"
}

Далее я пытаюсь использовать модуль для создания двух ролей в prod и staging. main.tf:

module "data_role" {
  source = "../tf_data_role"

  account_id         = "${var.account_id}"
  name               = "data"
  policy_description = "Role for data engineers"

  custom_principals = [
    "arn:aws:iam::${var.master_account_id}:root",
  ]

  policy = "${data.aws_iam_policy_document.data_access.json}"
}

Затем я пытаюсь прикрепить политики AWS следующим образом:

resource "aws_iam_role_policy_attachment" "data_readonly_access" {
  role       = "${module.data_role.role_name}"
  policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
}

resource "aws_iam_role_policy_attachment" "data_redshift_full_access" {
  role       = "${module.data_role.role_name}"
  policy_arn = "arn:aws:iam::aws:policy/AmazonRedshiftFullAccess"
}

Проблема, с которой я здесь сталкиваюсь, заключается в том, что, когда я пытаюсь запустить этот модуль, две вышеуказанные политики не присоединяются в промежуточной, а в учетной записи root. Как я могу это исправить, чтобы привязать политики при подготовке?

1 Ответ

0 голосов
/ 30 октября 2018

Из вашего вопроса я буду исходить из того, что постановка - это собственная учетная запись AWS, отдельная от вашей корневой учетной записи. Из документов Terraform

Вы можете определить несколько конфигураций для одного и того же провайдера для поддержки нескольких регионов, нескольких хостов и т. Д.

Это также относится к созданию ресурсов в нескольких учетных записях AWS. Чтобы создать ресурсы Terraform в двух учетных записях AWS, выполните следующие действия.

В вашей точке входа main.tf определите AWS-провайдеров для учетных записей, на которые вы будете ориентироваться:

# your normal provider targeting your root account
provider "aws" {
  version = "1.40"
  region = "us-east-1"
}

provider "aws" {
  version = "1.40"
  region = "us-east-1"

  alias = "staging" # define custom alias

  # either use an assumed role or allowed_account_ids to target another account
  assume_role {
    role_arn = "arn:aws:iam:STAGINGACCOUNTNUMBER:role/Staging"
  }
}

(Примечание: роль arn уже должна существовать, и ваши текущие учетные данные AWS должны иметь разрешение на ее принятие)

Чтобы использовать их в своем модуле , назовите свой модуль следующим образом

module "data_role" {
  source = "../tf_data_role"

  providers = {
    aws.staging = "aws.staging"
    aws = "aws"
  }

  account_id         = "${var.account_id}"
  name               = "data"

  ... remainder of module
}

и определите провайдеров в вашем модуле следующим образом:

provider "aws" {
  alias = "staging"
}

provider "aws" {}

Теперь, когда вы объявляете ресурсы в своем модуле, вы можете указать, в каком поставщике AWS (и, следовательно, какой учетной записи) создавать ресурсы, например,

resource "aws_iam_role" "this" {
  provider = "aws.staging"  # this aws_iam_role will be created in your staging account

  name               = "${var.name}"
  description        = "${format("%s (managed by Terraform)", var.policy_description)}"
  assume_role_policy = "${length(var.custom_principals) == 0 ? data.aws_iam_policy_document.assume_role.json : data.aws_iam_policy_document.assume_role_custom_principals.json}"
}

resource "aws_iam_policy" "this" {
  # no explicit provider is set here so it will use the "default" (un-aliased) aws provider and create this aws_iam_policy in your root account
  name        = "${var.name}"
  description = "${format("%s (managed by Terraform)", var.policy_description)}"
  policy      = "${var.policy}"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...