
Ich verstehe nicht, warum Terraform die JSON-Richtlinie entfernen möchte. In anderen Fällen, wenn die Daten während der Anwendung gelesen werden, zeigt der Plan an, dass die JSON-Richtlinie entfernt und im selben Plan hinzugefügt wird, aber das passiert nicht, Terraform entfernt sie einfach.
Dies ist die Richtlinie:
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"
]
}
}
Und hier ist der Plan:
# 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 – Warum möchte Terraform diese JSON-Richtlinie löschen?
2 - Die not_actions
und not_resources
sind optional. Ich dachte, sie erscheinen nicht im Plan. Ist das normal?
Antwort1
Was Terraform hier beschrieben hat, ist nichtlöschendas Richtlinien-JSON, aber um es direkt zu aktualisieren:
~ json = jsonencode(...) -> (known after apply)
Beachten Sie, dass die Anmerkung zum gesamten Attribut ~
anstelle von lautet. -
Dies bedeutet, dass es direkt vor Ort aktualisiert wird.
Der (known after apply)
interessante Teil daran ist, dass Terraform noch nicht weiß, wie das endgültige JSON-Dokument des Richtliniendokuments aussehen wird. Das passiert normalerweise, wenn einige der Werte, die zum Dokument beitragen, erst im Schritt „Anwenden“ bekannt werden. Genau das will der Hinweis oben im Plan ausdrücken:
# (config refers to values not yet known)
Während der Anwendungsphase versucht Terraform erneut, diese Datenressource auszuwerten. Zu diesem Zeitpunkt sollten alle Werte bekannt sein, damit Terraform sie lesen kann. Anschließend sollte ein gültiges Richtliniendokument erstellt werden, das wahrscheinlich dem alten ähnelt, aber Terraform selbst weiß das noch nicht.
Wenn Sie die neue Richtlinie vollständig lesen möchtenVorWenn Sie es auf andere Ressourcen anwenden, können Sie die -target
Option verwenden, Terraform anzuweisen, sich nur auf die Änderungen zu konzentrieren, die die Entscheidung über das JSON-Dokument ermöglichen, und zwar wie folgt:
terraform apply -target=aws_s3_bucket.some-bucket.arn -target=aws_cloudwatch_log_group.some_lambda.arn
Mit diesen -target
Optionen überspringt Terraform die Planung der Datenressource und aller anderen davon abhängigen Elemente, sodass Sie data "aws_iam_policy_document" "my_policy"
im Plan keine Erwähnung davon sehen. Nachdem Sie diese Teiländerung angewendet haben, können Sie terraform apply
wie gewohnt ohne Argumente ausführen. Anschließend sollte Terraform in der Lage sein, das JSON-Richtliniendokument während der Planungsphase auszuwerten, da alle Eingabewerte bereits bekannt sind.
Die Änderungen [] -> null
für diese not_actions
und not_resources
Argumente scheinen nur kleinere Fehler im Anbieter zu sein: Der Anbieter scheint inkonsistent zu sein, wenn es darum geht, ob unset als leere Liste oder als dargestellt wird null
, und daher rendert Terraform CLI diesen Unterschied auf dem Bildschirm. Der Anbieter sollte konsistent sein, was die Darstellung angeht, um dieses verwirrende zusätzliche Rauschen zu vermeiden.