✏️ 변수와 아웃풋의 목적과 원리를 이해한다!
✏️ 테라폼에서 변수를 생성하고 활용해보자!
✏️ 테라폼에서 아웃풋을 생성하고 활용해보자!
resource "google_compute_instance" "VM" {
name = "VM"
location = "us-central1-a"
}
resource "google_storage_bucket" "bucket" {
name = "bucket"
location = "us-central1-a"
storage_class = "standard"
}
지금까지 리소스에 대한 arguments 의 값들을 전부 하드 코딩하여 직접 코드 상에 적어주었다. 만약 해당 값들을 파라미터로 변경하여 런타임 상에서 그 값을 적용하고 싶다면 어떻게 해야할까?
코드 상에 있는 VM, bucket, us-central1-a, standard 값 모두 변수로 변경하여 런타임 상에서 값을 지정해 줄 수 있다! 변수에 대해서 알아보자!
//syntax
variable "variable_name" {
type = <variable_type>
description = "<variable description>"
default = "<default value for variables>"
sensitive = true
}
//example
variable "variable_name" {
type = string
description = "Region for the bucket"
default = "US"
sensitive = true
}
"variable_name" 은 모듈 내에서 unique 한 값을 가져야한다. type, description 등 여러 arguments 가 존재하나 모두 선택값이므로 {} 안에 아무런 값이 없어도 생성이 가능하다. 이 경우 테라폼이 자동으로 type과 default 값을 지정한다. bool, number, string// dir tree
-- server /
-- main.tf
-- outputs.tf
-- variables.tf
// main.tf
resource "google_storage_bucket" "mybucket1" {
name = "<unique_nucket_name>"
location = "US"
storage_class = var.bucket_storage_class // [1]
}
// variables.tf
variable "bucket_storage_class" {
type = string
default = "REGIONAL"
}
sensitive 값을 설정할 수 있다. 오직 true 값만 설정할 수 있으며 설정할 경우 terraform plan 또는 terraform apply 사용 시 해당 변수의 값이 보이지 않게 된다.
variable 리소스를 생성하여 테라폼 내 변수를 생성하는 방법 및 관련 작동 방식에 대하여 공부했다. 변수를 설정했다면 런타임 내에서 변수값을 전달해주어야 한다. 이 방법에는 크게 네 가지 종류가 있다.
.tfvars 파일
.tfvars 파일을 생성하여 여러 변수값을 저장하고 버전을 관리한다.tf apply -var-file my-vars.tfvarsCLI 옵션
tf apply -var project_id="my-project환경 변수
TF_VAR_project_id="my-project"
tf applyterraform.tfvars 파일
설명
변수값이 너무 많은 경우 terraform.tfvars 파일 을 생성하여 변수값을 설정할 수 있다.
.tfvars , .tfvars.json, .auto.tfvars, auto.tfvars.json 으로 끝나는 확장자 파일에 variables.tf 파일에서 정의해둔 변수의 값을 지정할 수 있다.
예시)
// dir tree
-- server /
-- main.tf
-- outputs.tf
-- terraform.tfvars
-- variables.tf
// terraform.tfvars
// 변수의 값을 지정한다.
mybucket_storage_class = "REGIONAL"
bucket_region = "US"
// variables.tf
// 변수의 형태를 정의한다.
variable "mybucket_storage_class" {
type = string
}
variable "bucket_region" {
type = string
}
실행방법: tf apply
여러 방식을 통해 변수 값을 지정하는 경우 다음과 같은 우선순위를 통해 값이 지정된다.
.tfvars 파일 .tfvars.json 파일 .auto.tfvars 또는 .auto.tfvars.json 파일 중 사전식 순서대로 -var 옵션 또는 -var-file 옵션 중 명시된 순서대로💡 값이 지정 안된 변수
값이 미지정된 변수의 경우terraform plan과 같은 커맨드 실행 시 CLI 에서 변수값을 지정하도록 프롬포트 창을 띄운다.
1. 자주 사용하는 값만 변수로 지정한다.
2. description 을 작성하자.
기록 및 관리의 목적으로 설명을 추가하는 것이 좋다.
3. 되도록 파일을 통해 변수값을 관리하자
CLI 로 변수값을 설정하는 방식은 임시적인 방편일 뿐이니 파일로 변수값을 작성하여 관리하는 것이 권장된다.
4. 알맞는 변수 이름을 생성하자.
변수의 이름을 통해 변수의 목적을 드러낼 수 있도록 하자
variable "ram_size_gb" {} // 권장
variable "ram_size" {} // 비권장
//// syntax
output <label> {
value = <resource_type>.<resource_name>.<attribute>
}
//// example
// dir tree
-- server /
-- main.tf
-- outputs.tf
-- variables.tf
// main.tf
resource "google_storage_bucket_objects" "picture" {
self_link : // ... etc
}
// outputs.tf
output "picture_URL" {
value = google_storage_bucket_objects.picture.self_link // [1]
// .. etc
}
return 값과 비슷하다고 볼 수 있다.root module 에서 생성된 리소스의 속성값을 child moudle에 전달한다. 💡
output키워드만 있다면 사실 상 어느 파일에 output 리소스를 생성해도 상관 없지만 코드의 관리 목적을 위해 주로outputs.tf파일에 작성한다.
💡 시스템적인 변수의 경우 직접 변수값을 설정하기보다
output값을 사용하는 것을 권장한다.
💡
terraform output커맨드를 사용하여 특정 프로젝트에 사용되는 모든output값을 도출할 수 있다.
1. 실제로 사용하는 값 또는 필요한 값만 output 값으로 사용한다.
예를 들어, 특정 VPC 에 서브넷 생성 시 필요한 것은 vpc id 이다. 따라서 vpc id 만 output 값으로 설정하고 vpc name 등 기타 불필요한 부분들은 output 값으로 설정하지 않도록 한다.
2. 적절한 output 이름을 설정하고 이를 outputs.tf 파일에서 관리한다.
3. 민감한 정보의 경우 sensitive 값을 활성화 한다.
sql 패스워드 등 과 같이 민감한 정보는 직접 암호화 하기 보다 sensitive 옵션값을 설정한다.