Допустим, вы создаете политику 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»