Как вставить переменную в политику AWS в terraform - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть политика, определенная в terraform для AWS ресурсов, например, так:


device-status-policy = <<EOF
{"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:us-west-2:foobaraccountid:client/device-status-qa*" }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive", "iot:Subscribe" ] }
   EOF

Я бы хотел, чтобы часть ресурса была переменной, например, так (псевдокод)

device-status-policy = <<EOF
{"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "$SOMEVAR/device-status-qa*" }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive", "iot:Subscribe" ] }
   EOF

Любая помощь приветствуется. Спасибо.

Ответы [ 3 ]

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

Поэтому единственно разумный вариант, для которого я go выбрал бы следующее:

Создайте файл, например, policy.tpl со следующим содержимым:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "${SOMEVAR}/device-status-qa*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive",
        "iot:Subscribe"
      ]
    }
  ]
}

Этот файл политики имеет переменная вам нужна.

Затем вы просто ссылаетесь на него и передаете переменную следующим образом:

device-status-policy = templatefile("file.tpl", { SOMEVAR = var.your_terraform_variable})

Надеюсь, это поможет

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

Измените $SOMEVAR на ${SOMEVAR}.

Пожалуйста, ознакомьтесь с синтаксисом интерполяции строки Terraform .

Кроме того, я настоятельно рекомендую использовать источник данных aws_iam_policy_document для определения политик IAM вместо документов здесь.

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

Строковая интерполяция с использованием синтаксиса ${ ... } является наименьшим изменением по сравнению с литеральной строкой JSON, но она сопряжена с риском создания правильного синтаксиса JSON, если, например, вставляемые строки содержат обратную косую черту и кавычки, что JSON синтаксический анализатор может неверно истолковать.

Функция Terraform jsonencode может быть хорошим компромиссом, поскольку Terraform имеет синтаксис объекта, очень похожий на JSON, и, следовательно, способность быстро понять, что такое структура JSON его создание сохраняется, и в то же время допускается произвольное выражение Terraform, результаты которого будут автоматически кодироваться с использованием правильного синтаксиса JSON:

  device-status-policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "iot:Connect",
        "Resource": "${SOMEVAR}/device-status-qa*"
      },
      {
        "Effect": "Allow",
        "Action": [ "iot:Publish", "iot:Receive", "iot:Subscribe" ]
      }
    ]
  })

Обратите внимание, что выше используется вариантная форма объекта языка Terraform. синтаксис, который использует двоеточия вместо знаков равенства; оба действительны, и использование двоеточий здесь помогает вводу напоминать JSON и, следовательно, облегчает адаптацию JSON, которую вы уже написали (как я сделал здесь), без большого количества переписывания.

Однако, * Последовательность 1010 * понимается Terraform как выражение шаблона в кавычках, а не как буквальная строка, поэтому она будет оценивать SOMEVAR и включать результат в значение Resource до сериализации всей полученной строки с использованием JSON синтаксис. Хотя в данном конкретном случае это кажется маловероятным, если бы результатом SOMEVAR была строка, содержащая ", то кодировка JSON автоматически сменила бы ее как \", чтобы обеспечить правильный синтаксис результата.

Для больших структур данных, в которых улучшается читаемость, чтобы выделить их в отдельный файл, документация templatefile содержит несколько примеров вызова jsonencode из внешнего шаблона тоже с похожими результатами.

...