
Я не понимаю, почему Terraform хочет удалить политику json. В других случаях, когда данные будут считываться во время применения, план показывает удаление политики json и добавление ее в тот же план, но этого не происходит, Terraform просто удаляет ее.
Вот политика:
data "aws_iam_policy_document" "my_policy" {
statement {
sid = "S3"
effect = "Allow"
actions = ["s3:*"]
resources = [
aws_s3_bucket.some-bucket.arn,
"arn:aws:s3:::another-bucket/*",
"arn:aws:s3:::another-bucket/"
]
}
statement {
sid = "CloudWatch"
effect = "Allow"
actions = ["logs:*"]
resources = [
aws_cloudwatch_log_group.some_lambda.arn,
"arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group:*",
"arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group"
]
}
}
А вот и план:
# data.aws_iam_policy_document.my_policy will be read during apply
# (config refers to values not yet known)
<= data "aws_iam_policy_document" "my_policy" {
~ id = "123456789" -> (known after apply)
~ json = jsonencode(
{
- Statement = [
- {
- Action = "s3:*"
- Effect = "Allow"
- Resource = [
- "arn:aws:s3:::another-bucket/*",
- "arn:aws:s3:::another-bucket/",
]
- Sid = "S3"
},
- {
- Action = "logs:*"
- Effect = "Allow"
- Resource = [
- "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group:*",
- "arn:aws:logs:us-east-1:123456789123:log-group:/some/log/group",
]
- Sid = "CloudWatch"
},
]
- Version = "2012-10-17"
}
) -> (known after apply)
- version = "2012-10-17" -> null
~ statement {
- not_actions = [] -> null
- not_resources = [] -> null
~ resources = [
+ "arn:aws:s3:::some-bucket/",
# (2 unchanged elements hidden)
]
# (3 unchanged attributes hidden)
}
~ statement {
- not_actions = [] -> null
- not_resources = [] -> null
# (4 unchanged attributes hidden)
}
}
1 — Почему Terraform хочет отменить эту политику JSON?
2 - not_actions
И not_resources
необязательны. Я думал, что они не появятся в плане. Это нормально?
решение1
То, что описал здесь Terraform, не являетсяудалитьJSON политики, но для ее обновления на месте:
~ json = jsonencode(...) -> (known after apply)
Обратите внимание, что аннотация ко всему атрибуту — ~
, а не -
, что означает, что он обновляется на месте.
Часть (known after apply)
этого интересна: она сообщает вам, что Terraform пока не знает, каким будет JSON окончательного документа политики. Это обычно происходит, если какие-либо значения, которые вносят вклад в документ, являются значениями, которые не будут известны до шага применения, что и пытается сказать примечание в верхней части плана:
# (config refers to values not yet known)
На этапе применения Terraform снова попытается оценить этот ресурс данных, и в этот момент все значения должны быть известны, и он сможет их прочитать. Затем он должен создать действительный документ политики для использования, который, вероятно, будет похож на старый, но сам Terraform пока этого не знает.
Если вы хотите увидеть новую политику полностьюдоЕсли вы примените его к любым другим ресурсам, то вы можете использовать опцию, -target
чтобы попросить Terraform сосредоточиться только на внесении изменений, которые позволят принять решение о документе JSON, например:
terraform apply -target=aws_s3_bucket.some-bucket.arn -target=aws_cloudwatch_log_group.some_lambda.arn
С этими -target
опциями Terraform пропустит планирование ресурса данных и всего остального, что от него зависит, и поэтому вы не увидите никаких упоминаний data "aws_iam_policy_document" "my_policy"
в плане. После того, как вы примените это частичное изменение, вы можете запустить его terraform apply
без каких-либо аргументов, как обычно, и тогда Terraform сможет оценить документ политики JSON на этапе планирования, поскольку все входные значения уже будут известны.
Изменения [] -> null
для этих not_actions
и not_resources
аргументов, похоже, являются просто незначительными ошибками в поставщике: поставщик, похоже, непоследователен в отношении того, представлен ли unset как пустой список или как null
, и поэтому Terraform CLI отображает эту разницу на экране. Поставщик должен быть последовательным в отношении того, как он представляет это, чтобы избежать отображения этого сбивающего с толку дополнительного шума.