*유데미에서 진행하는 Terraform for the Absolute Beginners with Labs강의를 바탕으로 제작되었습니다.
테라폼에서 다른 리소스의 값을 참조할 때 기본적으로 다음과 같은 형식을 사용합니다.
<리소스 유형>.<리소스 이름>.<속성 이름>
참조하는 방법 2가지 방법을 알아보겠습니다
1. 다른 리소스의 값을 참조하는 법(암묵적 참조)
*참조 특성을 이용해 리소스끼리 연결하는 법
첫 번째 테라폼 리소스를 보겠습니다.
variable "filename" {
default = "/root/pet-name.txt"
}
variable "prefix" {
default = "Mrs"
}
variable "separator" {
default = "."
}
variable "length" {
default = 1
}
resource "random_pet" "my-pet" {
prefix = var.prefix
separator = var.separator
length = var.length
}
random_pet 리소스는 terraform에서 기본으로 제공하는 리소스이며 random 프로바이더에 의해 제공됩니다(이외에도 random_id, random_integer, random_string 등이 있습니다.)
주로 테스트, 데모, 또는 유니크한 이름이 필요한 리소스에 친근한 이름을 붙이는데 사용됩니다.
리소스 안에 있는 매개변수 중 prefix는 접두사로 위에 variable을 보면 "Mrs"로 지정되어 있고, separator는 "."으로 구분되어 있습니다. 그러면 random_pet 리소스는 separator를 기준으로 랜덤한 이름을 생성하는데, prefix는 접두사이므로 제일 앞에 오고 그 다음 length가 1이므로 1개의 랜덤한 이름을 생성합니다. 그러면 접두사와 랜덤하게 생성된 이름 사이에 separator가 오게 되며 "Mrs.<랜덤한이름>" 이 생성됩니다.
두 번째 테라폼 리소스입니다.
resource "local_file" "pet" {
filename = var.filename
content = "My favorite pet is ${random_pet.my-pet.id}"
}
local_file 리소스는 pet이라는 이름을 가지는데 매개변수인 filename은 파일이 생성될 경로와 이름을 나타냅니다. variable에서 "/root/pet-name.txt"로 지정했으니 이 경로에 파일이 생성됩니다. 그리고 content는 파일에 들어가는 내용인데 "My favorite pet is ${random_pet.my-pet.id}"가 작성됩니다. ${random_pet.my-pet.id}는 random_pet 리소스 유형에서 my-pet 이름을 가진 리소스의 id 속성을 참조한다는 뜻이 됩니다.
* random_pet: 리소스 유형
* my-pet: 리소스 이름
* id: 리소스의 속성
여기서 id 속성이란 random_pet유형이 반환한 값을 의미하는데, "Mrs.<랜덤한이름>"가 됩니다.
(random_pet은 반환값을 id 속성에 저장합니다)
그래서 "My favorite pet is ${random_pet.my-pet.id}"는 "My favorite pet is Mrs.<랜덤한이름>"가 됩니다.
그러면 /root/pet-name.txt 위치에 pet-name.txt 파일이 생성되는데 이 파일의 내용은 "My favorite pet is Mrs.<랜덤한이름>"가 됩니다.
2. 명시적 참조(explicit-reference)
1번과 같은 경우엔 두 리소스간 종속성이 존재하지만 암묵적으로 존재하는 종속성으로 테라폼이 자동으로 알아서 찾는 경우입니다.
이런 경우를 암묵적 참조라고 부르는데, 다음과 같은 예시가 있습니다.
# 암묵적 참조
resource "local_file" "pet" {
filename = var.filename
content = "My favorite pet is Mr.Cat"
}
resource "random_pet" "my-pet" {
prefix = var.prefix
separator = var.separator
length = var.length
}
이 경우, local_file.pet 리소스가 random_pet.my-pet 리소스보다 먼저 생성될 수 있으며, 이로 인해 올바르게 동작하지 않을 수 있습니다.
# 명시적 참조
resource "local_file" "pet" {
filename = var.filename
content = "My favorite pet is Mr.Cat"
depends_on = [ random_pet.my-pet ]
}
resource "random_pet" "my-pet" {
prefix = var.prefix
separator = var.separator
length = var.length
}
또는
resource "local_file" "whale" {
filename = "/root/whale"
content = "whale"
depends_on = [ local_file.krill ]
}
resource "local_file" "krill" {
filename = "/root/krill"
content = "krill"
}
이 경우, random_pet.my-pet 리소스가 먼저 생성된 후 local_file.pet 리소스가 생성되므로, local_file.pet 리소스가 의존하는 random_pet.my-pet 리소스가 이미 준비된 상태임을 보장합니다.
'[Cloud] > [Terraform]' 카테고리의 다른 글
[Terraform] 프로비저너와 사용자 데이터 (0) | 2024.08.09 |
---|---|
[Terraform] S3에서 상태 파일 업로드, 상태 파일 관리 명령어 (0) | 2024.08.09 |
[Terraform] 테라폼으로 AWS DynamoDB 생성, 업로드(GSI) (0) | 2024.08.08 |
[Terraform] 테라폼 라이프 사이클(create_before_destroy, prevent_destroy) (1) | 2024.08.06 |
[Terraform] 테라폼 변수 타입 종류 (0) | 2024.08.05 |