Terraform 기초 실습 스터디를 진행하고 있으며, 커리큘럼 4주차에 해당하는 내용입니다.
* [테라폼으로 시작하는 IaC] 도서 참조
이전 포스팅에서 테라폼의 프로바이더에 대해 살펴보았다.
이번 포스팅에서는 책 내용의 CHAPTER 5. State 에 대해 알아보도록 하겠다.
테라폼은 Stateful (상태가 있는) 애플리케이션이다.
프로비저닝 결과에 따른 State (상태) 를 저장하고 프로비저닝한 모든 내용을 저장된 상태로 추적한다.
로컬 실행 환경에서는 terraform.tfstate 파일에 JSON 형태로 저장되고, 팀이나 조직에서는 공동 관리를 위해서 원격 저장소(ex. AWS S3..) 에 저장해 공유하는 방식을 활용한다.
State 에는 코드의 실제 반영된 프로비저닝 결과를 저장하고, 이 정보를 토대로 이후의 리소스 작업에 대한 동작을 수행한다.
State 의 목적과 의미
테라폼은 State 를 사용해 대상 환경에서 어떤 리소스가 테라폼으로 관리되는 리소스인지 판별하고 결과를 기록한다.
State 의 역할은 다음과 같다.
- State 에는 테라폼 구성과 실제를 동기화하고 각 리소스에 고유한 아이디로 매핑
- 리소스 종속성과 같은 메타데이터를 저장하고 추적
- 테라폼 구성으로 프로비저닝된 결과를 캐싱하는 역할
위의 테라폼 코드를 apply 하여 생성되는 terraform.tfstate 를 확인해보자.
{
"version": 4,
"terraform_version": "1.9.5",
"serial": 3,
"lineage": "64aedf01-9085-ddfe-825b-e02fd08135f7",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "random_password",
"name": "password",
"provider": "provider[\"registry.terraform.io/hashicorp/random\"]",
"instances": [
{
"schema_version": 3,
"attributes": {
"bcrypt_hash": "$2a$10$JK92WdCvP7Ey8Hr4klpAO.wklhOPbmsKe5pBypW6Sv3b1Yd.Uw3I6",
"id": "none",
"keepers": null,
"length": 16,
"lower": true,
"min_lower": 0,
"min_numeric": 0,
"min_special": 0,
"min_upper": 0,
"number": true,
"numeric": true,
"override_special": "!#$%",
"result": "BZi0ZviKp0NoGd7W",
"special": true,
"upper": true
},
"sensitive_attributes": [
[
{
"type": "get_attr",
"value": "result"
}
],
[
{
"type": "get_attr",
"value": "bcrypt_hash"
}
]
]
}
]
}
],
"check_results": null
}
테라폼은 이와 같이 JSON 형태로 작성된 State 를 통해 type 과 name 으로 고유한 리소스를 분류하며, 해당 리소스의 속성과 인수를 실제 리소스와 비교해 생성, 수정, 삭제한다.
State 동기화
테라폼 구성 파일은 기존 State 와 구성을 비교해 실행 계획(plan) 에서 생성, 수정, 삭제 여부를 결정한다.
다음은 plan 과 apply 동작 중 각 리소스에 발생할 수 있는 다섯가지 유형이다.(replace 동작은 기본값을 삭제 -> 생성하지만, lifecycle 의 create_before_destroy 옵션을 통해 생성 -> 삭제 순으로 동작하도록 설정 가능)
유형 | 구성 리소스 정의 | State 의 구성 데이터 | 실제 리소스 | 기본 예상 동작 |
1 | 있음 | 리소스 생성 | ||
2 | 있음 | 있음 | 리소스 생성 | |
3 | 있음 | 있음 | 있음 | 동작 없음 |
4 | 있음 | 있음 | 리소스 삭제 | |
5 | 있음 | 동작 없음 |
워크스페이스
State 를 관리하는 논리적인 가상 공간을 워크스페이스 라고 한다.
테라폼 구성 파일은 동일하지만 작업자는 서로 다른 State 를 갖는 실제 대상을 프로비저닝 할 수 있다.
워크스페이스는 기본 default 로 정의된다.
동일한 테라폼 구성 파일로 다중 워크스페이스를 구성하여 실제 대상 인프라에 적용할 수 있다.
예를 들어 실제 업무 환경에서 DEV/STG/PRD 환경으로 업무 환경을 분리하여 프로비저닝할 때 사용할 수 있다.
아래 명령어로 새로운 워크스페이스를 생성하여 관리한다.
$ terraform workspace new <워크스페이스이름>
워크스페이스 이름을 조건으로 하여 동일한 코드 구성으로 다른 조건의 리소스를 생성하는 예시이다.
resource "aws_instance" "web" {
count = "${terraform.workspace == "default" ? 5:1}"
ami = "ami-8dfha8er23y78yha"
instance_type = "t3.micro"
tags = {
Name = "HelloWorld - ${terraform.workspace}"
}
}
이와 같이 다수의 워크스페이스를 사용하면 장단점이 존재하기 마련이다.
단점에 관한 부분을 실제 운영 업무를 수행중인 프로젝트에서 어떤 식으로 보완하여 구축되어있는지, 따로 정리하여 포스팅하려고 한다.
다음 포스팅에서는 모듈에 관해 알아보도록 하자.