Public Cloud/Terraform

Terraform이란

공기반 코딩반 2023. 1. 13. 18:08
반응형

Terraform이란

: HCL 언어로 클라우드 리소스를 정의하고 이 내용을 테라폼 CLI 애플리케이션(terraform)으로 자신의 클라우드 계정에 실제로 반영할 수 있는 도구

 

 

HCL 언어란

- Hashicorp Configuration Language

- 테라폼 코드를 작성하기 위한 언어

- Block: 테라폼 코드의 최소 단위

- Prefix: HCL 언어 블록을 나타냄

 

 

Provider "aws" {
	region = "ap-northeast-2"
}

--> 어떤 Provisioning을 할지를 나타냄

  

 

 

- Block 내용(Body)는 Argument로 구성됨- Argument는 Identifier(Argument이름), Expression(Argument 값)으로 나타냄

<BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>"{
	# block body
	<IDENTIFIER> = <EXPRESSION> # argument
}

- meta-argument: Terraform이 제공하는 특수 Argument

 

 

 

Expression 타입

- body 설정 값

- 프로그래밍 언어의 변수타입과 같은 의미

- 6개 타입 제공

    - string, number, bool, list, map, null

- 타입에 따라 지원되는 기능 차이가 있음.

 

 

 

Terraform 명령어

터미널 창에 입력

- terraform init: 테라폼 설정

- terraform apply: 테라폼 코드 실행

- terraform destroy: 테라폼 코드 삭제

- terraform console: 터미널에서 값 출력 가능

 

 

 

반복문

- 반복문이 여러 개 존재해 상황에 맞게 선택해야함.

 

 

 

 

 

- Count

count가 설정된 갯수만큼 block을 반복

resource "aws_instance" "server"{
	count = 2
    
        ami = data.aws_ami.last_ami.id
        instance_type = "t2.nano"
}

--> EC2 instance를 2개 생성

 

 

 

 

- 반복문에서 태그 설정 방법

resource "aws_instance" "server"{
    count = 2
    ...
    tags = {
        Name = "Server ${count.index}"
    }
    
}

 

 

 

※ 주의사항: 사용하려는 block, block argument에 대한 이해가 필요함

- 버킷을 생성할 때 반복문 사용이 어려움 ( S3는 bucket 이름이 고유하기 때문)

 

 

 


 

 

count variable 연동

- block 참조로 variable 연동이 쉬움

variable "user_names"{
    description = "Create IAM users with these names"
    type = list(string)
    default = ["aaa", "bbb", "ccc"]
}

resource "aws_iam_users" "examples"{
    count = length(var.user_names)
    name = var.user_names[count.index]
}

 

 

※ 주의사항: count를 사용할 때 list 타입 사용을 주의

- 리소스 타입을 접근할 때 index에 의존적임

- 리스트 개수가 증감 or 리스트 값의 순서가 변경되면 --> error

ex) 위의 코드 실행 후 "aaa"와 "bbb" 순서를 바꿔서 IAM user를 생성하려하면 --> 이미 존재한다는 error 발생

 

 

 

 

- 해결방법: 인덱스로 접근하지 않는 방법

==> 리스트 타입 -> map, set으로 접근하기(값으로 접근하게 됨)

==> count 대신 for_each 사용

 

반응형