brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 10. 2023

32탄-5. 2주차-테라폼-local=코드내 사용


<1> local  지역값 = 코드 내에서만 가동 되어 동작

<2> iamuser.tf 로  iam   계정 만들어보자

<3> 출력 =  output 을 참조하여 사용하자.




<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"






10분 휴식

https://vclock.kr/timer/#countdown=00:10:00&enabled=0&seconds=0&sound=xylophone&loop=1




다음 자료


https://brunch.co.kr/@topasvga/3362




몰아보기

https://brunch.co.kr/@topasvga/3347


다음은 주말 CloudNet 테라폼 스터디 내용 참고하여  정리한 부분입니다.

https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  



감사합니다.

매거진의 이전글 32탄-4. 2주차-테라폼-데이터소스,VPC배포
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari