이번 시간에는 테라폼의 기본 사용법 중 조건문, terraform에서 제공하는 내장함수, 프로비저닝, moved 블록, 시스템 환경 변수에 대해서 알아보겠습니다.
조건문
테라폼에서의 조건식은 3항 연산자 형태를 갖습니다.
조건은 true 또는 false로 확인되는 모든 표현식을 사용할 수 있습니다.
타 언어의 조건식과 사용법은 동일합니다.
# 3항 연산자 사용법
# <조건 정의> ? <옳은 경우> : <틀린 경우>
# Terraform 조건문 예시
var.a != "" ? var.a : "default-a"
함수
Terraform은 프로그래밍 언어적인 특성을 가지고 있습니다.
기본적으로 사용자 지정 함수는 사용할 수 없으나 Terraform에서 제공 해주는 내장 함수는 사용 할 수 있습니다.
Numeric Functions, String Funtions, Collection Funtions, Encoding Funtions,
Filesystem Funtions, Date and Time Funtinos Hash and Crypto Functions,
IP Network Funtions, Type Conversion Functions 함수가 있으며 자세한 내용은 공식 문서 참고 바랍니다.
Functions - Configuration Language | Terraform | HashiCorp Developer
An introduction to the built-in functions that you can use to transform and combine values in expressions.
developer.hashicorp.com
프로비저닝
프로비저너는 프로바이더와 비슷하게 ‘제공자’로 해석되나, 프로바이더로 실행되지 않는 커맨드와 파일 복사 같은 역할을 수행합니다. - 공식문서 참고
Provisioners | Terraform | HashiCorp Developer
Provisioners run scripts on a local or remote machine during resource creation or destruction. Learn how to declare provisioners in a configuration.
developer.hashicorp.com
또한, 실행된 결과는 테라폼의 상태 파일과 동기화되지 않으므로 프로비저닝에 대한 결과가 항상 같다고 볼 수 없기에 멱등성을 보장 할 수 없습니다. 그러므로 프로비지닝은 사용을 최소화 하는 것이 좋습니다. 프로비저닝 대신 userdata, cloud-init, packer, chef, ansible 같은 다른 도구를 사용하는게 좋습니다.
프로비전의 종류에는 file, local-exec, remote-exec등이 있습니다.
terraform_data
테라폼 1.4 버전이 릴리즈되면서 기존 null_resource 리소스를 대체하는 terraform_data 리소스가 추가되었습니다.
1.4버전 이전 사용하시는 분들 null_resouce를 사용하시면 됩니다.
이 리소스 또한 자체적으로 아무것도 수행하지 않지만 null_resource는 별도의 프로바이더 구성이 필요하다는 점과 비교하여 추가 프로바이더 없이 테라폼 자체에 포함된 기본 수명주기 관리자가 제공된다는 것이 장점입니다.
강제 재실행을 위한 trigger_replace와 상태 저장을 위한 input 인수와 input에 저장된 값을 출력하는 output 속성이 제공됩니다. triggers_replace에 정의되는 값이 기존 map 형태에서 tuple로 변경되어 사용법이 더 간단해졌습니다.
#terraform_data 리소스의 trigger_replace 정의와 동작 예제
resource "terraform_data" "foo" {
triggers_replace = [
aws_instance.foo.id,
aws_instance.bar.id
]
input = "world"
}
output "terraform_data_output" {
value = terraform_data.foo.output # 출력 결과는 "world"
}
moved
테라폼의 State에 기록되는 리소스 주소의 이름이 변경되면 기존 리소스는 삭제되고 새로운 리소스가 생성이 됩니다. 하지만 테라폼 리소스를 선언하다 보면 이름을 변경해야 하는 상황이 발생하기도 합니다, 예를 들면
- 리소스 이름을 변경
- count로 처리하던 반복문을 for_each로 변경
- 리소스가 모듈로 이동하여 참조되는 주소가 변경
위와 같이 들수가 있습니다.
리소스의 이름은 변경되지만 이미 테라폼으로 프로비저닝된 환경을 그대로 유지하고자 하는 경우 테라폼 1.1 버전부터 moved 블록을 사용할 수 있다.
moved 블록을 이용하면 State에서 옮겨진 대상의 이전 주소와 새 주소를 알리는 역할을 해주기 때문에 State 접근 권한이 없는 사용자도 변경 되는 주소를 리소스 영향 없이 건드릴 수 있습니다.
# local_file resouce 선언
resource "local_file" "a" {
content = "before moved!"
filename = "${path.module}/foo.bar"
}
output "file_content" {
value = local_file.a.content
}
terraform init && terraform plan && terraform apply -auto-approve
그 후
# 기존 코드에서 변경
resource "local_file" "b" {
content = "after moved!"
filename = "${path.module}/foo.bar"
}
moved {
from = local_file.a
to = local_file.b
}
output "file_content" {
value = local_file.b.content
}
terraform plan && terraform apply -auto-approve
# local_file.a 의 프로비저닝 결과를 유지한 채 이름을 변경되었는지 확인
terraform state list
CLI를 위한 시스템 환경 변수
테라폼은 환경 변수를 통해 실행 방식과 출력 내용에 대한 옵션을 조절할 수 있습니다. 공식 문서 참고
Environment Variables | Terraform | HashiCorp Developer
Learn to use environment variables to change Terraform's default behavior. Configure log content and output, set variables, and more.
developer.hashicorp.com
TF_LOG | 테라폼의 stderr 로그에 대한 레벨을 정의 |
TF_INPUT | 값을 false 또는 0으로 설정하면 테라폼 실행 시 인수에 -input=false 를 추가한 것과 동일한 수행 결과를 확인 |
TF_VAR_name | TF_VAR_<변수 이름>을 사용하면 입력 시 또는 default로 선언된 변수 값을 대체 |
TF_DATA_DIR | State 저장 백엔드 설정과 같은 작업 디렉터리별 데이터를 보관하는 위치를 지정 |
'Terraform' 카테고리의 다른 글
[Terraform] Terraform Workspace (0) | 2023.07.28 |
---|---|
[Terraform] Terraform 상태관리 및 격리방안 (0) | 2023.07.28 |
[Terraform] Terrafrom 사용법 반복문 (0) | 2023.07.16 |
[Terraform] Terrafrom 기본 사용법 Local / Output (0) | 2023.07.15 |
[Terraform] Terrform 사용법 데이터소스 / 변수(Variable) (0) | 2023.07.15 |