Допустим, вы создаете политику IAM с террафом, используя отдельный файл JSON, который включает в себя заявление для политики.
В типичном заявлении у нас есть 4 значения для удовлетворения. Это сид, эффект, действие и ресурс.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Policy Name", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::mytestbucket" ] } ] }
Как мы должны динамически изменять значения ресурса и SID в этом утверждении?
Ну, террафом имеет ресурс данных под названием template_file. С этим мы можем легко пройти параметры динамически на наш файл оператора.
Демо время!
Во-первых, нам нужно создать пользователь, политику и ведро. Затем мы будем использовать ведро, арну в нашем заявлении. Я использую переменные для большинства вещей, чтобы иметь чистый код.
resource "aws_iam_user" "iam-user" { name = var.iam_user_name } resource "aws_s3_bucket" "s3-bucket" { bucket = "mytestbucket" } resource "aws_iam_user_policy" "iam-policy" { name = var.iam_policy_name user = aws_iam_user.iam-user.name }
Обычно мы можем приложить политику JSON следующим;
(«/path/to/policy.json»)
Поскольку мы хотим пройти параметры в файл JSON, мы будем использовать ресурс данных, называемый «Template_file».
Для того, чтобы использовать его, мы должны переименовать наше расширение JSON на тплс . С этим мы отмечаем, что мы хотим использовать этот файл в качестве шаблона.
Теперь мы изменим наш файл шаблона с помощью синтаксиса интерполяции. Мы пройдем параметры как для SID, так и для ресурса.
"Statement": [ { "Sid": "${sid-name}", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "${resource-name}" ] } ]
Вернуться к нашему основным файлам, мы добавим ресурс Template_File.
data "template_file" "iam-policy-template" { template = file("/path/to/policy.tpl") vars = { sid-name = "Policy for S3 Access" resource-name = aws_s3_bucket.sample_bucket.arn } }
Здесь мы указали Варс Блок и внутри мы используем переменные из файла шаблона. Теперь мы можем использовать эти данные в нашем ресурсе политики IAM.
Обратите внимание, что мы получаем доступ к представленной версии нашего шаблона.
resource "aws_iam_user_policy" "iam-policy" { name = var.iam_policy_name user = aws_iam_user.iam-policy.name policy = data.template_file.iam-policy-template.rendered }
Оригинал: «https://dev.to/ustundagsemih/how-to-pass-variables-to-a-json-file-in-terraform-57k1»