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 사용
'Public Cloud > Terraform' 카테고리의 다른 글
terraform slack-notifiaction [Detect Console Login] (0) | 2023.03.26 |
---|---|
.gitlab-ci.yml (0) | 2023.02.01 |
Terraform - 중앙 집중식 비밀 저장소 (0) | 2023.01.13 |
Terraform - 민감정보 보안 / Provider Block / OIDC (0) | 2023.01.13 |
Terraform - for expression (0) | 2023.01.13 |