<1> local 지역값 = 코드 내에서만 가동 되어 동작 코드 내에서 사용자가 지정한 값 또는 속성 값을 가공해 참조 가능한 local (지역 값)은 외부에서 입력되지 않고, 코드 내에서만 가공되어 동작. local에 선언한 로컬 변수 이름은 전체 루트 모듈 내에서 유일해야 한다. 선언하고 참조한다!! 1 cd mkdir 37 cd 37 2 vi main.tf variable "prefix" { default = "hello" } locals { name = "terraform" content = "${var.prefix} ${local.name}" my_info = { age = 20 region = "KR" } my_nums = [1, 2, 3, 4, 5] } locals { content = "content2" # 중복 선언되었으므로 오류가 발생한다. } // 선언은 locals 로 한다. // 로컬 변수는 유일해야 한다. // content 가 중복 선언이다. 3 # terraform init │ Error: Duplicate local value definition │ │ on main.tf line 31, in locals: │ 31: content = "content2" # 중복 선언되었으므로 오류가 발생한다. │ │ A local value named "content" was already defined at main.tf:13,3-42. Local value names must be unique within a module. ╵ 4 variable "prefix" { default = "hello" } locals { name = "terraform" content = "${var.prefix} ${local.name}" my_info = { age = 20 region = "KR" } my_nums = [1, 2, 3, 4, 5] } // locals 하나로 변경하였다. // ${var.prefix} = hello // ${local.name = terraform // hello terraform 5 terraform init terraform apply -auto-approve terraform state list // state list는 나오는 내용은 없다. 선언만 한것이다. 참조하는건 현재 없다. 6 선언 하고 참조하는 방식이다. local. 이름으로 참조 해서 참조 한다. vi main.tf variable "prefix" { default = "hello" } locals { name = "terraform" } resource "local_file" "abc" { content = local.content filename = "${path.module}/abc.txt" } 7 sub.tf 파일을 하나 만든다. sub.tf 파일을 참조한다. 같은 디렉토리를 참조 한다. vi sub.tf locals { content = "${var.prefix} ${local.name}" } // 같은 디렉토리 안에 내용을 참조한다. # ls *.tf terraform init -upgrade terraform apply -auto-approve terraform state list local_file.abc terraform state show local_file.abc # graph 확인 > graph.dot 파일 선택 후 오른쪽 상단 DOT 클릭 terraform graph > graph.dot # cat abc.txt ; echo hello terraform // 서로 다른 테라폼 구성 파일에서도 로컬 값을 참조할 수 있다 8 우선 순위 확인 예제 ? # echo 'prefix="t101-study"' > terraform.tfvars cat terraform.tfvars prefix="t101-study" # terraform apply -auto-approve cat abc.txt ; echo t101-study terraform <2> iamuser.tf 로 iam 계정 만들어보자 1 cd mkdir local cd local vi iamuser.tf provider "aws" { region = "ap-northeast-2" } locals { name = "mytest" team = { group = "dev" } } resource "aws_iam_user" "myiamuser1" { name = "${local.name}1" tags = local.team } resource "aws_iam_user" "myiamuser2" { name = "${local.name}2" tags = local.team } 설명? // 선언과 참조 !!! // 아래 처럼 로컬로 선언했다. locals { name = "mytest" team = { group = "dev" } } // 위에서 선언했으니 이제 참조 하자. resource "aws_iam_user" "myiamuser1" { name = "${local.name}1" local.name 은 mytest 가 들어간다. mytest1 이 된다. mytest2 가 된다. 2 terraform init && terraform apply -auto-approve // 콘솔가서 계정 생성확인한다. mytest1 , mytest1 테그도 확인한다. 3 terraform state list aws_iam_user.myiamuser1 aws_iam_user.myiamuser2 terraform state show aws_iam_user.myiamuser1 # graph 확인 > graph.dot 파일 선택 후 오른쪽 상단 DOT 클릭 terraform graph > graph.dot # iam 사용자 리스트 확인 , aws cli로 확인 가능하다. aws iam list-users | jq "UserName": "mytest1", "UserName": "mytest2", 4 공통된 값을 사용하면 사용하자. mytest 가 공통! 5 # 삭제 terraform destroy -auto-approve <3> 출력 = output 을 참조하여 사용하자. 1 선언과 참조!! 선언 ? output output "instance_ip_addr" { value = "http://${aws_instance.server.private_ip}" } // 웹서버 ip가 나오면 , 클릭하면 사이트 접속 된다. 2 cd mkdir 38 cd 38 3 vi main.tf resource "local_file" "abc" { content = "abc123" filename = "${path.module}/abc.txt" } output "file_id" { value = local_file.abc.id } output "file_abspath" { value = abspath(local_file.abc.filename) } // 리소스 abc 라는 파일을 사용한다. // 출력은 파일의 id를 출력하라. // 출력은 파일이름의 절대 경로를 출력하라. abspath(local_file.abc.filename) Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now. 함수는 찾아서 하면 된다. https://developer.hashicorp.com/terraform/language/functions/abspath 4 # plan 실행 시, 이미 정해진 속성은 출력을 예측하지만 terraform init && terraform plan ... Changes to Outputs: + file_abspath = "/Users/gasida/Downloads/workspaces/3.8/abc.txt" + file_id = (known after apply) // plan은 생성되어야 나오는 값은 안나온다. // apply 해야 나온다. # terraform apply -auto-approve ... Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: file_abspath = "/root/38/abc.txt" file_id = "6367c48dd125b19455e529f5ee" # graph 확인 > graph.dot 파일 선택 후 오른쪽 상단 DOT 클릭 terraform graph > graph.dot # terraform state list local_file.abc terraform output file_abspath = "/root/38/abc.txt" file_id = "6367c48dd193aad25b19455e529f5ee"