티스토리 뷰
지난 포스트에 이어 이번 포스트부터는 본격적으로 Terraform HCL 을 활용하여 코드를 작성하고, 인프라에 반영하는 작업을 진행하겠다. 우선 테라폼 워크스페이스를 생성하고, 이후 테라폼의 핵심 워크플로우의 Write, Plan, Apply 를 진행하겠다. 또한, 테라폼 워크스페이스의 리소스를 변경 및 제거하는 방식도 알아보겠다.
테라폼 워크스페이스 (Terraform Workspace)
시작에 앞서, 테라폼 워크스페이스가 무엇인지 간단히 알아보자. 간단히 말해, 인프라를 관리하기 위한 하나의 프로젝트 단위라고 할 수 있다. 기본적으로 조직의 규모에 따라 차이가 있는데, 처음에는 소규모 서비스이다 보니 관리하는 인프라의 규모도 굉장히 작다. 이럴 때는 하나의 워크스페이스에서 모든 인프라를 관리할 수 있지만, 규모가 커지면서 인프라가 복잡해지게 되면 인프라를 나눠서 관리해야 하는 연습을 할 필요가 있다. 기업의 규모가 커짐에 따라 인프라라는 전체 워크스페이스가 있었다가, Network, Accounts, Domain, ServiceA, ServiceB 와 같이 용도에 따라 인프라를 분리하게 된다.
또한, 테라폼은 인프라를 코드로 관리할 때 변경 사항을 추적할 수 있게 된다. 변경 사항에 대한 이력을 가지고 있어야 무엇이 추가, 삭제, 변경되었는지를 알 수 있기 때문이다. 이것을 상태 (State) 라고 하는데, 이는 테라폼에서 apply를 해보면 .terraform.tfstate 라는 파일이 생성되는 것을 볼 수 있다. 이 파일에서 해당 워크스페이스 상태를 관리하는 파일이다.
워크스페이스 생성하기
실제로 이번 포스트에서 사용할 워크스페이스를 만들어 보자. 우선 테라폼 프로젝트를 진행할 디렉토리를 생성한다.
mkdir terraform-workspace
이후, 해당 디렉토리로 이동한다.
cd terraform-workspace
테라폼 파일은 .tf 라는 확장자를 이용하여 테라폼 코드를 작성할 수 있다.
파일 편집은 우선 vim 에디터로 진행하는데, IntelliJ, VSCode 등 에디터를 사용할 수 있다.
nvim main.tf
프로바이더 (Provider)
테라폼 코드를 작성하기에 앞서, 어떤 프로바이더 (Provider) 를 사용할지 결정해야 하는데, 이는 Provider 페이지에서 볼 수 있다.
이번 포스팅에서는 Local Provider 를 사용해볼 것이다. 해당 페이지에 접속하여 우측 상단 USE PROVIDER를 클릭하면 해당 Provider를 사용하기 위한 설정을 볼 수 있다.
모든 Provider 는 terraform 블록 안의 설정과 provider 블록을 정의하는 설정을 통해 사용하게 되는데, terraform 블록 안에는 required_providers 를 통해 해당 프로바이더의 버전을 명시할 수 있으며, 버전을 명시하지 않으면 최신 버전을 사용할 수 있다.
그렇다면, 다음과 같이 provider 를 선언하여 Local Provider 를 사용하는 것을 명시해 주자.
provider "local" {
}
Local Provider 를 사용하도록 설정했고, 옆의 사이드바를 보면 Resources 와 Data Sources 로 나누어지는데, Resource 는 Local Provider 를 사용하여 관리할 수 있는 리소스를 의미하며, Data Sources 는 인프라 리소스를 관리할 때 데이터를 참조하여 관리할 때 사용하는 데이터 소스를 의미한다. Data Sources 는 데이터를 읽는 용도이며, Resources 는 데이터를 쓰기 위한 용도 (새로운 리소스를 만들기 위한 용도) 라고 이해하면 된다.
이제 Resources > local_file 에 접속해 보자. local_file 은 주어진 컨텐츠를 기반으로 로컬 파일 시스템에 파일을 생성하는 리소스이다. Example Usage 에 local_file 을 활용하는 방법이 나와 있다.
resource 지시어를 사용하여 foo 라는 local_file 을 생성하는 것을 확인할 수 있다. 이 코드를 tf 파일에 복사하고, 다음과 같이 작성해 보자.
provider "local" {
}
resource "local_file" "foo" {
filename = "${path.module}/foo.txt"
content = "Hello World!"
}
여기에서 생소한 문법이 나오는데, resource 블록 내의 filename 의 String 안에 ${} 형태의 변수가 있는 것을 확인할 수 있다. 이를 HCL 에서 String Interpolation 문법이라고 하는데, 문자열 내에서 HCL 에서 제공하는 변수나 Context 의 값을 가져올 수 있는 목적으로 활용될 수 있다.
path.module 은 해당 파일이 위치한 디렉토리 경로를 의미한다. 그래서 main.tf 파일이 위치한 디렉토리에 foo.txt 파일에 "Hello World!" 라는 텍스트를 가지고 생성을 한다는 의미이다.
이제 이 코드를 실행하기 위해 추가적인 작업을 진행해 보자.
init
terraform init 을 진행하고 나면, tf 파일에 정의된 프로바이더를 설치하게 된다.
terraform init
이후 디렉토리 목록을 조회해 보면 다음과 같이 .terraform 이라는 디렉토리가 생성된다.
ls -al
.terraform 디렉토리를 조회해 보면, 다음과 같이 main.tf 파일에 명시된 캐시와 데이터를 다운로드 받아서 보관하게 된다.
tree .terraform
또한 .terraform.lock.hcl 파일은 팀에서 협업을 하거나 CI/CD 파이프라인을 구성하기 위해 필요한 파일이다. 해당 프로바이더의 해시섬을 체크하고 버전을 락킹시켜 각 작업자들이 동일한 환경에서 동일한 코드를 apply 하기 위해 사용한다.
cat .terraform.lock.hcl
terraform plan
Plan 을 진행하면 main.tf 파일이 어떤 변경 사항을 발생시키는지 확인할 수 있다. 마지막 줄을 통해 핵심적으로 어떤 리소스가 추가, 변경, 제거되는지 확인할 수 있다.
terraform apply
이후 실제로 terraform apply 를 진행하면 plan 에서 조회되었던 변경 사항이 최종 반영될지 묻고, yes 로 답할 시 실제로 반영되는 것을 볼 수 있다.
terraform apply
yes
이 상태에서 다시 디렉토리 리스팅을 하게 되면, foo.txt 파일이 생성된 것을 확인할 수 있다.
ls -al
또한, 해당 foo.txt 파일을 열어 보면 다음과 같이 텍스트가 저장되어 있는 것을 확인할 수 있다.
cat foo.txt
또한 해당 디렉토리에 terraform.tfstate 파일이 생성된 것을 확인할 수 있는데, 해당 리소스의 상태를 기록하고 있는 것을 확인할 수 있다. 이 파일을 통해 추후 main.tf 파일을 변경할 때 변경 사항을 확인할 수 있다.
cat terraform.tfstate
Data Sources
지금까지는 로컬 파일 리소스를 활용해 보았는데, Data Sources 도 활용할 수 있다. local_file Data Source 는 로컬 파일 시스템으로부터 파일의 내용을 읽어오는 데이터 소스인 것을 확인할 수 있다.
데이터 소스의 경우 리소스와는 다르게 data 라는 지시어를 사용하여 정의한다. 다음과 같이 HCL 을 작성하고, apply 를 해 보자.
provider "local" {
}
resource "local_file" "foo" {
filename = "${path.module}/foo.txt"
content = "Hello World!"
}
data "local_file" "bar" {
filename = "${path.module}/bar.txt"
}
terraform apply 를 해 보면, 다음과 같이 bar.txt 파일이 없어 오류가 발생하는 것을 확인할 수 있다.
terraform apply
해당 오류를 없애기 위해 직접 bar.txt 파일을 만들고 임의의 텍스트를 넣어 보자.
cat > bar.txt
Hello DevOps!
cat bar.txt
다시 apply를 해 보면, 다음과 같이 정상적으로 수행되는 것을 확인할 수 있다.
terraform apply
Data Sources 의 경우 단순히 데이터를 읽는 것이기 때문에 인프라상 변화가 없다.
output
읽어들인 데이터를 확인하고 싶을 경우 output 지시어를 사용하여 결과값을 출력할 수 있다.
output "file_bar" {
value = data.local_file.bar
}
다시 terraform apply 를 수행하면 다음과 같이 output 을 확인할 수 있다.
이렇게 해서 기본적인 Resources 와 Data Sources 를 다루어 보았다.
다음 포스트에서는 AWS 에서 제공하는 Provider 를 다루어 보겠다.
'인프라 > Terraform' 카테고리의 다른 글
Terraform 다루어보기 (AWS Provider) (0) | 2022.08.19 |
---|---|
Intellij HCL 설정하기 (0) | 2022.08.16 |
Terraform 소개 (0) | 2022.08.12 |
Terraform 설치 및 기본 설정 (0) | 2022.08.11 |
Terraform 이 무엇인가? (0) | 2022.08.10 |
- Total
- Today
- Yesterday
- main
- 스타트업
- dockerhub
- 디자인
- Material
- 자료형
- 자바
- 메터리얼
- cmd
- 도커
- uiux
- Android
- 테라폼
- 안드로이드
- AWS
- entrypoint
- dockerfile
- Container
- 컨테이너
- Operator
- HCL
- 머티리얼
- Terraform
- ecr
- EC2
- docker
- Java
- 자격증명
- DESIGN
- env
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |