Terraform에서 순환 참조 오류가 발생하면

이것은 리소스를 변수로 참조 무결성? 를 유지하려고 할 때 좋아진다.
variable "env" {
  type = "string"
  default = "dev"
}
variable "service" {
  type = "string"
  default = "foo"
}

resource "aws_cloudfront_origin_access_identity" "origin_access" {
  comment = "access-identity-${var.env}-${var.service}.s3.amazonaws.com"
}

data "template_file" "s3_policy" {
  template = "${file("s3-bucket-policy.json")}"

  vars {
    bucket_name            = "${var.env}-${var.service}"
    origin_access_identity = "${aws_cloudfront_origin_access_identity.origin_access.id}"
  }
}

resource "aws_s3_bucket" "foo" {
  bucket = "${var.env}-${var.service}"
  acl    = "private"
  policy = "${data.template_file.s3_policy.rendered}"

  tags {
    Name        = "${var.env}-${var.service}"
    Environment = "${var.env}"
    ServiceName = "${var.service}"
  }
}


그렇다면 순환 참조가 발생합니다.
❯ terraform plan
Error configuring: 1 error(s) occurred:

* Cycle: data.template_file.s3_policy, aws_s3_bucket.foo, aws_cloudfront_origin_access_identity.origin_access

이제, 모르고 괴로운 기분이 되지만, Terraform에는 편리한 기능이 있다.

종속 그래프의 출력입니다.
terraform graph -draw-cycles | dot -Tpng > graph.png


-draw-cycles 를 붙이면 빨갛게 되므로, 알기 쉽다.
후에는 그 의존관계를 해결해 나가면 된다.

이 경우는 aws_cloudfront_origin_access_identity에서 버킷 이름을 참조하지만 버킷 이름은 "${var.env}-${var.service}"로 바꿀 수 있으므로,
resource "aws_cloudfront_origin_access_identity" "origin_access" {
  comment = "access-identity-${var.env}-${var.service}.s3.amazonaws.com"
}

그렇다면 치유한다.



References


  • Command: graph - Terraform by HashiCorp
  • 좋은 웹페이지 즐겨찾기