
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
이러한 옵션을 사용하면 Terraform은 데이터 리소스 및 이에 의존하는 다른 모든 항목의 계획을 건너뛰므로 계획에서 -target
언급이 표시되지 않습니다 . data "aws_iam_policy_document" "my_policy"
부분 변경 사항을 적용한 후에는 terraform apply
정상적으로 인수 없이 실행할 수 있으며 모든 입력 값이 이미 알려져 있으므로 Terraform은 계획 단계에서 JSON 정책 문서를 평가할 수 있어야 합니다.
[] -> null
이들 not_actions
및 인수에 대한 변경 사항은 not_resources
공급자의 사소한 버그인 것 같습니다. 공급자는 unset이 빈 목록으로 표시되는지 또는 로 표시되는지에 대해 일관성이 없는 것으로 보이 null
므로 Terraform CLI는 해당 차이를 화면에 렌더링합니다. 공급자는 이러한 혼란스러운 추가 노이즈를 표시하지 않으려면 이를 나타내는 방법에 대해 일관성을 유지해야 합니다.