Terraform 설명2 (함수)

2024. 4. 9. 14:17IT

일련의 선언적으로 구성파일을 정의하고 읽을 수 있는 이런 구성파일로 토폴로지를 구성 → 테라폼 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
  • 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