Terraform이 aws_iam_policy_document를 완전히 삭제하려는 이유는 무엇입니까?

Terraform이 aws_iam_policy_document를 완전히 삭제하려는 이유는 무엇입니까?

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는 해당 차이를 화면에 렌더링합니다. 공급자는 이러한 혼란스러운 추가 노이즈를 표시하지 않으려면 이를 나타내는 방법에 대해 일관성을 유지해야 합니다.

관련 정보