HCL(Hashicorp Configuration Language) Configuration syntax

안상운·2024년 7월 16일
0

Terraform

목록 보기
2/8
post-thumbnail

1. Block

Blocks: 다른 content를 위한 컨테이너

block 타입의 종류로는 provider block, resource block, data block, variable block output block 등이 있음.

예시

블럭타입 {
  attribute: value1
  arrribure: value2
}

 

2. Attributes

key = value

예시

resource "awas_instance" "example" {
  ami = "ami-0c1111111"
  instance_type = "t2.micro"
  count = 3
  enabled = true
}

여기서 ami, instance_type, count, enabled가 바로 attribute 타입!

3. Datatypes

string : "hello"
number : 1
bloolean : true
List : ["item1", "item2"]
Maps : {key1 = "value", key2 = "value2", key3 = "value3" }

 

4. Conditions

conditions는 결정을 만들거나 특정한 코드의 블럭을 실행시키는데에 매우 중요함. conditions 를 이용하는데 다양한 시나리오 가 있다.

  • 다양한 환경에 따라서

    • 개발 및 운영에 사용할 서버를 어떻게 배치 해야할지는 중요하다. 일반적인 서버 개발환경은 local,dev,integration,qa,staging 그리고
      production 환경으로 나누어 진다. 각자의 개발 과정에 따라, 각자의 역할과 목적이 다르고, 그에 따라서 시스템의 크기도 다르기 때문에 적절하게 배치를 하는 것이 중요한데 이때 사용할 수 있다.
  • 특정한 기준에 따라서

    • 만약 feature이 enabled 라면 이것을 실행한다. 예를들어 데이터베이스가 public으로 되어있다면 ec2에 연결 하지 못하도록 하고, private라면 ec2에 연결 하는 것을 condition에서 정의 할 수 있다. 내 인스턴스의 cpu가 어느 정도 사용을 하고 있으면 다른 서버를 또 실행 시키는 것도 할 수 있다.

     

예시로 이해해보자.

resource "aws_instance" "server" {
  instance_type = var.environment == "development" ? "t2.micro" : "t2.small"
}

위에서 말한 condition 중 전자경우의 condition의 예이다. 위 코드는 development 에서는 t2.micro를 사용하고, 그외의 local,integration,qa,staging, production 등의 환경에서는 t2.small를 사용하게 하게 한다.

 

5. Function

HCL의 Function은 코드의 명령, 계산, 변환을 수행한는데 매우 도움이 된다.
HCL은 데이터를 조작하거나 input값을 평가하는 등의 엄청게 많은 function들을 제공하고 있다.

함수들은 hashicorp 사이트에서 확인하고 공부할수 있다.

간단한 코드를 보면서 함수가 어떻게 쓰인다는건지 감만 잡아본다.

locals {
    name = "luckyPirce"
    fruits = ["chicken", "pizza", "ramen"]
    message = "Hello ${upper(local.name)}! I know you like ${join(",", local.fruits)}"
}

위 코드를 실행하면 밑에 값이 나온다.

Hello lUCKYPRICE! I know you like chicken, pizza, ramen

 

5. resource dependency

HCL에서 resource dependency 는 거의 매번 쓰일 정도로 중요하다. resource dependency는 주로 두개의 다른 자원에 대한 관계를 형성할때, 그리고 어떻게 형성되는지에 대해 정의할때 쓰인다. dependecy는 2개로 type으로 분류된다.

  • implicit dependency(암시적)
    implicit dependency는 terraform에 의해서 자동으로 실행된다.

  • explicit dependency(명시적)
    따로 실행 시켜야 한다.

이번에도 예시를 통해 이해해보자.

aws instance와 보안그룹을 붙이는 코드

 resource "aws_instance" "name" {
  vpc_security_group_ids = aws_securiey_group.new_sg.id
}

resource "aws_securiey_group" "new_sg" {
 #inbound rules 
}

간단한 실습을 진행

새 파일을 만들어서 코드를 다음과 같은 코드를 적는다.

challenge.tf

resource "resource" "file" {
    provisioner "local-exec" {
        command = "echo 'Message: ${upper("hello world")}' > challenge.txt"
    }
}

이제 해당 terminal로 해당 경로에 들어가서 terraform init-> terraform plan-> terraform apply 를 차례로 실행해보자.

결과

정상적으로 txt 파일이 생겼다.

0개의 댓글