Как создать новую политику во время выполнения и прикрепить ее к роли без жесткого кодирования policy_document JSON в ресурсе кода? - PullRequest
2 голосов
/ 12 апреля 2020

Я пытаюсь создать некоторых пользователей службы с указанными c ролями. Я не хочу жестко кодировать документы политики для моей роли службы.

Пример:

service-1 требуется доступ на чтение к экземпляру -EC2, журналам Cloudwatch и доступ на запись в корзину s3.

Сервис-2 нуждается в SNS, SQS и DynamoDB.

Поставщик = AWS

Любая помощь будет высоко оценена.

Как мне создать новую политику во время выполнения и присоединить ее к роли без жесткого кодирования policy_document JSON в ресурсе кода?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

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

В противном случае вы будете создавать модули, которые ничего не делают и принимают код в качестве ввода.

Любые достаточно сложные [ Dynami c Модуль Terraform] содержит ad ho c, неофициально определенный, с ошибками, медленная реализация половины [самой Terraform] ..

ремикс десятого Гринспуна rule

data "aws_iam_policy_document" "assume_role_policy" {
  statement {
    sid    = "AllowAssumeRole"
    effect = "Allow"
    actions = [
      "sts:AssumeRole",
    ]
    resources = var.trusted_arns
  }
}

Вы можете предоставить доступ к набору AWS сегментов в виде переменной, подобной этой:

  statement {
    sid    = "AllowS3Access"
    effect = "Allow"
    actions = [
      "s3:GetBucketLocation",
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:GetObject",
      "s3:ListMultipartUploadParts",
      "s3:AbortMultipartUpload",
    ]
    resources = var.allowed_read_only_s3_bucket_arns
  }

Если вы хотите создать динамику c Политики, которые вы можете сделать так:

data "aws_iam_policy_document" "meta_policy" {
  dynamic "statement" {
    for_each = var.statements
    content { 
      sid       = each.key
      effect    = each.value.effect
      actions   = each.value.actions
      resources = each.value.resources
    }
  }
}

Будет использоваться с такой переменной:

variable "statements" {
  description = "I didn't want to use resources, so I made meta-Terraform"
  type        = map(object(
    {
      sid       = string
      effect    = string
      actions   = list(string)
      resources = list(string)
    }
  ))
}

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

Ваши коллеги, в том числе и ваше будущее я, будут вам благодарны, если вы примете на вооружение вещи, которые на самом деле не меняются.

1 голос
/ 12 апреля 2020

Помимо вашего вопроса, есть отличный документ для чтения о языке HCL. https://github.com/hashicorp/hcl

Теперь, насколько я понимаю, ваш вопрос, кажется, что вы хотите создать модуль разрешений и иметь возможность передавать ему имя службы и разрешение. Этот указанный c метод позволит вам повторно использовать код создания роли IAM. Я предлагаю вам прочитать https://www.terraform.io/docs/configuration/modules.html.

. Вы можете создать модуль, например, разрешение IAM, и сделать что-то вроде

   resource "aws_iam_policy" "policy" {
 name        = "${var.service_name}"
 description = "${var.service_name} access policy"
 policy      = templatefile("${path.module}/ddb_role.tpl", {
   role            = var.role
 })
}

resource "aws_iam_role" "role" {
 name               = "role_${var.env}"
 assume_role_policy = "${file("assumerolelambdapolicy.json")}"
}

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

Файл шаблона:

{
    "Version": "2012-10-17",
    "Statement": [

     {
        "Effect": "Allow",
        "Action": ${role},
        "Resource": "*"
      }
  ]
}

var.tf вы можете сохранить список разрешений

variable "role" {
    type = list
    default = [
 "sqs:*",
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents",
          "ec2:Describe*",
          "ec2:DescribeSecurityGroups",
          "ec2:DescribeSubnets",
          "ec2:DescribeVpcs",
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents",
          "ec2:CreateNetworkInterface",
          "ec2:DescribeNetworkInterfaces",
          "ec2:DeleteNetworkInterface"
]
}

Это то, что вы должны иметь возможность переопределить, используя файл tfvar. Попробуйте это и дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...