테라폼 변수, 로컬 값 및 출력에 대한 이해 - AWS 규범적 지침

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

테라폼 변수, 로컬 값 및 출력에 대한 이해

변수는 코드 블록 내에 자리 표시자를 허용하여 코드 유연성을 향상시킵니다. 코드가 재사용될 때마다 변수가 다른 값을 나타낼 수 있습니다. Terraform은 모듈식 범위로 변수 유형을 구분합니다. 입력 변수는 모듈에 삽입할 수 있는 외부 값이고, 출력 값은 외부에서 공유할 수 있는 내부 값이며, 로컬 값은 항상 원래 범위 내에 있습니다.

Variables

AWS CloudFormation 매개 변수를 사용하여 한 스택 배포에서 다음 스택 배포로 설정 및 재설정할 수 있는 사용자 지정 값을 나타냅니다. 마찬가지로 Terraform은 입력 변수 또는 변수를 사용합니다. 변수는 Terraform 구성 파일의 어느 곳에서나 선언할 수 있으며 일반적으로 필수 데이터 유형 또는 기본값으로 선언됩니다. 다음 세 표현식은 모두 유효한 Terraform 변수 선언입니다.

variable "thing_i_made_up" { type = string } variable "random_number" { default = 5 } variable "dogs" { type = list(object({ name = string breed = string })) default = [ { name = "Sparky", breed = "poodle" } ] }

구성 내에서 Sparky의 품종에 액세스하려면 변수를 사용합니다. var.dogs[0].breed 변수에 기본값이 없고 nullable 변수로 분류되지 않은 경우 각 배포마다 변수 값을 설정해야 합니다. 그렇지 않으면 변수에 새 값을 설정하는 것은 선택 사항입니다. 루트 모듈에서는 명령줄, 환경 변수 또는 terraform.tfvars 파일에서 현재 변수 값을 설정할 수 있습니다. 다음 예제는 모듈의 최상위 디렉토리에 저장되어 있는 terraform.tfvars 파일에 변수 값을 입력하는 방법을 보여줍니다.

# terraform.tfvars dogs = [ { name = "Sparky", breed = "poodle" }, { name = "Fluffy", breed = "chihuahua" } ] random_number = 7 thing_i_made_up = "Kabibble"

이 예제에서 terraform.tfvars 파일의 값은 변수 dogs 선언의 기본값을 재정의합니다. 자식 모듈 내에서 변수를 선언하는 경우 다음 예제와 같이 모듈 선언 블록 내에서 직접 변수 값을 설정할 수 있습니다.

module "my_custom_module" { source = "modulesource/custom" version = "0.0.1" random_number = 8 }

변수를 선언할 때 사용할 수 있는 다른 인수에는 다음이 포함됩니다.

  • sensitive— Terraform 프로세스 출력에 변수 값이 노출되지 true 않도록 설정합니다. 

  • nullable— 이 값을 로 true 설정하면 변수에 값이 없을 수 있습니다. 이는 기본값이 설정되지 않은 변수에 편리합니다.

  • description— 스택의 메타데이터에 변수 설명을 추가합니다.

  • validation— 변수에 대한 검증 규칙을 설정합니다.

Terraform 변수의 가장 편리한 기능 중 하나는 변수 선언 내에 하나 이상의 유효성 검사 개체를 추가할 수 있다는 것입니다. 유효성 검사 개체를 사용하여 변수가 통과해야 하는 조건을 추가할 수 있습니다. 그렇지 않으면 배포가 실패합니다. 조건을 위반할 때마다 표시되도록 사용자 지정 오류 메시지를 설정할 수도 있습니다.

예를 들어 팀 구성원이 실행할 Terraform 구성 파일을 설정하는 경우를 예로 들 수 있습니다. 스택을 배포하기 전에 팀 구성원은 terraform.tfvars 파일을 만들어 중요한 구성 값을 설정해야 합니다. 이를 상기시키기 위해 다음과 같이 할 수 있습니다.

variable "important_config_setting" { type = string validation { condition = length(var.important_config_setting) > 0 error_message = "Don't forget to create the terraform.tfvars file!" } validation { condition = substr(var.important_config_setting, 0, 7) == "prefix-" error_message = "Remember that the value always needs to start with 'prefix-'" } }

이 예제에서 볼 수 있듯이 단일 변수 내에 여러 조건을 설정할 수 있습니다. Terraform은 실패한 조건에 대한 오류 메시지만 표시합니다. 이러한 방식으로 변수 값에 모든 종류의 규칙을 적용할 수 있습니다. 변수 값으로 인해 파이프라인 장애가 발생하는 경우 그 이유를 정확히 알 수 있습니다.

로컬 값

모듈 내에 별칭을 지정하려는 값이 있는 경우 절대 업데이트되지 않는 기본 변수를 선언하는 대신 locals 키워드를 사용하십시오. 이름에서 알 수 있듯이 locals 블록에는 내부적으로 해당 특정 모듈로 범위가 지정된 용어가 포함됩니다. 리소스 이름에 사용할 변수 값에 접두사를 추가하는 등 문자열 값을 변환하려는 경우에는 로컬 값을 사용하는 것이 좋습니다. 다음 예제와 같이 단일 locals 블록으로 모듈의 모든 로컬 값을 선언할 수 있습니다.

locals { moduleName = "My Module" localConfigId = concat("prefix-", var.important_config_setting) }

단, 값에 접근할 때 locals 키워드는 다음과 같이 단수형이 된다는 점을 기억하세요. local.LocalConfigId

출력 값

Terraform 입력 변수가 CloudFormation 매개 변수와 같으면 Terraform 출력 값이 출력과 같다고 말할 수 있습니다. CloudFormation 둘 다 배포 스택 내에서 값을 노출하는 데 사용됩니다. 그러나 Terraform 모듈은 도구 구조에 더 깊이 뿌리내리고 있기 때문에 Terraform 출력 값은 모듈 내의 값을 상위 모듈이나 다른 하위 모듈에 노출하는 데에도 사용됩니다. 이는 해당 모듈이 모두 동일한 배포 스택 내에 있더라도 마찬가지입니다. 두 개의 사용자 지정 모듈을 빌드하고 있고 첫 번째 모듈이 두 번째 모듈의 ID 값에 액세스해야 하는 경우 두 번째 모듈에 다음 블록을 추가해야 합니다. output

output "module_id" { value = local.module_id } Then in the first module you could use it like this: module "first_module" { source = "path/to/first/module" } resource "example_resource" "example_resource_name" { module_id = module.first_module.module_id }

Terraform 출력 값은 동일한 스택 내에서 사용할 수 있으므로 output 블록의 sensitive 속성을 사용하여 스택 출력에 값이 표시되지 않도록 할 수도 있습니다. 또한 변수가 precondition 블록을 사용하는 것과 같은 방식으로 블록도 블록을 사용할 수 있습니다. 즉, 변수가 특정 규칙 세트를 따르도록 하기 위해서입니다. output validation 이렇게 하면 배포를 진행하기 전에 모듈 내의 모든 값이 예상대로 존재하는지 확인할 수 있습니다.

output "important_config_setting" { value = var.important_config_setting precondition { condition = length(var.important_config_setting) > 0 error_message = "You forgot to create the terraform.tfvars file again." } }