여러 Terraform 작업 공간에 대한 입력 변수 파일

8580 단어 terraformdevopsaws
우리는 모두 거기에 있었습니다. 매우 멋진 Terraform 구성을 작성했습니다. 여러 번 적용해야 합니다... 또는 최소한 dev , testprod . 구성이 아무리 훌륭하더라도 모든 환경에서 모든 세부 정보가 정확히 동일한 경우는 매우 드뭅니다. 일반적으로 다음과 같이 끝납니다. 완벽하게 괜찮습니다(가독성을 위해 코드를 약간 압축했습니다. 더 완전한 예는 this gist 참조).

resource "aws_instance" "this" {
  count = var.instance_count

  ami           = var.ami_id
  instance_type = var.instance_type

  tags = {
    Name = "project-xyz-${terraform.workspace}-${count.index}"
  }
}


이것이 아프기 시작하는 곳은 적용 시간 동안입니다. 예를 들면 다음과 같습니다.

terraform workspace select prod
terraform apply -var='instance_count=5' -var='ami_id=ami-1a2b3c' -var='instance_type=t2.large'


이 변수 라인은 매우 빠르게 불분명해집니다. 또한 이러한 모든 변수를 기억하거나 명령줄에서 명령문을 기억하도록 만드는 것은(환경별로) 다소 번거롭습니다. 또한 자동화에서 이 작업을 수행하려면(다시 말하지만 환경별로...) 일부env 변수 마법이 필요할 가능성이 큽니다. 이는 인프라 정의를 표준 호출 방식과 분리하는데, 이는 좋지 않습니다. (그런데 connascence에 대해 들어본 적이 없다면 이 기사를 읽지 말고 대신 this one을 읽으십시오.)

Terraform Cloud는 이에 대한 몇 가지 해결 방법을 제공하지만 여기에서도 템플릿과 변수 세트env를 분리합니다. 구성 옆에 있는 버전 제어에서 기본 변수 세트를 유지할 수 있다면 훨씬 더 좋을 것입니다. 약간의 땜질 끝에 다음 해결책을 찾았습니다.

variable "workspace_variables" {
  type = map(object({
    instance_count = number
    ami_id         = string
    instance_type  = string
  }))
  default = {}
}

locals {
  default_vars = lookup(var.workspace_variables, terraform.workspace, {
    instance_count = 2
    ami_id         = "ami-abc123"
    instance_type  = "t2.micro"
  })
  instance_count = var.instance_count != null ? var.instance_count : local.default_vars["instance_count"]
  ami_id         = var.ami_id != null ? var.ami_id : local.default_vars["ami_id"]
  instance_type  = var.instance_type != null ? var.instance_type : local.default_vars["instance_type"]
}


이 코드 스니펫은 workspace_variables 와 같이 하나의 선택적 변수를 읽어 모두 지배합니다. 아무것도 제공되지 않으면 기본 하위 변수 세트를 사용합니다. 또한 여전히 Terraform cli를 사용하여 모든 변수 집합을 재정의할 수 있습니다. 이 스니펫 다음에는 모든 변수null에 대한 기본값을 설정해야 하며 변수를 사용할 때 var.local.로 바꿔야 합니다. 그런 다음 다음과 같이 Terraform vars 파일을 만들 수 있습니다.

workspace_variables = {
  dev = {
    instance_count = 2
    ami_id         = "ami-abc123"
    instance_type  = "t2.micro"
  }
  test = {
    instance_count = 3
    ami_id         = "ami-a1b2c3"
    instance_type  = "t2.medium"
  }
  prod = {
    instance_count = 5
    ami_id         = "ami-1a2b3c"
    instance_type  = "t2.large"
  }
}


버전 제어에 넣을 수 있는 찾기 쉬운 한 곳에 모두 보관되어 훨씬 더 명확해졌습니다! 작업 공간을 선택하고 적용을 누르는 간단한 Terraform 흐름으로 원하는 구성을 얻을 수 있습니다. 또한 핫픽스, 테스트 등을 위해 명령줄로 변수를 재정의할 수 있습니다.

terraform workspace select prod
terraform apply -var='ami_id=ami-x1337x'


단순한 매개변수 입력에는 너무 많은 상용구처럼 보일 수 있지만 변수가 많을 경우 '정상적인' 방식으로 변수를 설정하는 데 무게가 있음을 발견했습니다. 그것이 당신에게 효과가 있는지 확인하십시오!

마지막 설명: 적절한 Terraform 변수 유효성 검사 및 vars 파일의 호환성을 구현하려면 약간의 수정과 상용구가 필요하지만 optional variable attributes이 공개 베타에서 나올 때 수정될 수 있습니다.

(위의 코드는 가독성을 위해 축약되었습니다. 더 완전한 예는 this gist 을 참조하십시오.)

좋은 웹페이지 즐겨찾기