Terraform 설명2 (함수)
2024. 4. 9. 14:17ㆍIT
일련의 선언적으로 구성파일을 정의하고 읽을 수 있는 이런 구성파일로 토폴로지를 구성 → 테라폼 config
- 장점
- Multi-cloud
- stateful
- version controlled
- declarative
- manual click-ops
- save money
- 개발자들이 일하는 특정시간에만 서버를 올리고 퇴근시 서버를 내려 돈을 아낄 수 있다.
- disaster recovery
- 특정 availablity-zone이 안되는 경우 다른 availability zone으로 옮길 시 엄청난 시간 단축이 있다.
- minimize error
테라폼 설정 동작 방식
Refresh
- 테라폼은 Refresh를 통해 테라폼으로 만들어질 세상이 어떻게 생겼는지 조정한다.
- 테라폼 View가 나오고 실제와 어떻게 다른지 비교한다.
- VMware, AWS, Azure 같은 인프라에 실제 무엇이 실행중인지 API로 물어보고 각 상태를 확인한다.
- view ↔ Real
Plan
- 현재의 상태를 원하는 상태로 구성하는 단계
- 현재와 다른것이 무엇이고 어떤 변화가 있을지
- Real → Desired
Apply
- 원하는 상태를 만들기 위해 실행하는 단계
- Plan → Real
- yes 치기 귀찮으면 terraform apply —auto-approve
Destroy
- 코드베이스로 설정한 것들은 코드로 제로의 상태로, 삭제를 할 수 있는 단계
- Plan → Real
HCL
HashiCorp Configuration Language
Function
- min(): 프로비저닝 구성에서는 “넘을 수 없는 최대 값”을 지정하는데 사용되기도 한다.
- max(): 프로비저닝 구서엥서는 “최소한 유지되어야 하는 값”을 지정하는데 사용되기도 한다.
- max(3, 54, 12) = 54
- max([3, 54, 12]) = error
- max([3, 54, 12] …) = 54
- signum()
- 숫자의 부호를 결정하여 -1에서 1사이의 숫자와 부호를 반환한다.
- 프로비저닝 응용으로 어떤 개수 이상의 리소스에 대한 종속성이 있는 요소가 하나만 있어도 되는 경우에 활용할 수 있다.
- ex) 인스턴스에 할당할 subnet의 개수와 같이 설정할 수 있다. 인스턴스가 5개여도 signum(var.instance_number)로 지정하면 0또는 1만이 지정될 수 있다.
- signum(-13) = -1
- signum(0) = 0
- signum(334) = 1
- upper()
- 대소문자로 구분되는 문자열을 모두 대문자로 변환한다.
- lower()
- 대소문자로 구분되는 문자열을 모두 소문자로 변환한다.
→ 특정 문자로 적합성을 판단해야하는 경우 대,소문자로 변환해서 문자열이 같음을 판단
- title()
- 대소문자로 구분되는 문자열에 있는 각 단어의 첫 글자를 대문자로 변환한다.
- 가독성을 위해 사용
- title(”hello world”) → Hello world
- can()
- 주어진 표현식을 평가하여 표현식이 오류없이 결과를 생성했는지 여부를 true/false로 반환한다.
- 조건에 대한 확인을 해야하기에 3항 연산자로 구분되어 처리해야한다. ex) can(local.instance_data.web) ? local.instance_data.web.subnet_id : null
local.foo { "bar" = "baz" } can(local.foo.bar) # true can(local.foo.boop) # false
- try()
- 선언된 표현식을 차례로 평가하고 오류를 생성하지 않는 첫 번째 표현식의 결과를 반환한다.
- ex) try(local.instance_data.web.subnet_id, null)
local.foo { "bar" = "baz" } try(local.foo.bar, "def") # baz try(local.foo.boop, "def") # def
- cidrhost()
- CIDR
- Classless Inter-Domain Routing, 사이더
- IP 주소 할당 방법으로 IP 주소의 영역을 여러 네트워크 영역으로 나눌 때 기존 방식에 비해 유연성을 더해준다.
- 지정된 IP 네트워크 주소 접두사 내에서 지정된 호스트 번호에 대한 전체 호스트 IP 주소를 계산한다.
- cidrhost(”접두사”, ~로부터 번호)
- cidrhost(”10.12.112.0/20”, 16) = 10.12.112.16
- cidrhost("10.12.112.0/20", 268) = 10.12.113.12
- cidrhost(”10.12.112.0/20”, 256) = 10.12.113.0
- cidrhost("10.12.113.0/20", 12) = 10.12.113.12
- CIDR
- cidrsubnet()
- 주어진 CIDR 내에서 서브넷 주소를 계산한다.
- cidrsubnet(prefix, newbits, netnum)
- prefix: CIDR
- newbits: 추가되는 고정 비트
- netnum: 고정 비트에 더해줄 비트
- cidrsubnet("10.0.0.0/16", 0, 0) = 10.0.0.0/16
- cidrsubnet("10.0.0.0/16", 8, 0) = 10.0.0.0/24
- cidrsubnet("10.0.0.0/16", 8, 1) = 10.0.1.0/24
- cidrsubnet(”10.0.0.0/16”, 8, 2) = 10.0.2.0/24
- csvdecode()
- CSV 형식의 데이터가 포함된 문장열을 디코딩하고 해당 데이터를 나타내는 맵 리스트를 생성한다.
> csvdecode("a,b,c\\n1,2,3\\n4,5,6") tolist([ { "a" = "1" "b" = "2" "c" = "3" }, { "a" = "4" "b" = "5" "c" = "6" }, ])
- check{}
- 프로비저닝한 결과에 대해 상태를 체크할 수 있는 함수로 검증을 위한 워크플로를 작성하는데 사용한다.
- 체크 assert내에서 출력, 변수, 리소스 및 데이터 소스를 참조할 수 있다. check "id" {}
check "health_check" { data "http" "terraform_io" { url = "<https://www.terraform.io>" } assert { condition = data.http.terraform_io.status_codde == 200 error_message = "${data.http.terraform_io.url} returned an unhealthy status code" } }
'IT' 카테고리의 다른 글
Terraform 설명4 (mini project) (0) | 2024.04.09 |
---|---|
Terraform 설명3 (ec2생성) (0) | 2024.04.09 |
Terraform 설명 1 (0) | 2024.04.09 |
Helm 스터디 (0) | 2024.04.09 |
Static, Dynamic Page, JSP, Servlet (0) | 2024.04.09 |