- resource : 실제로 생성할 인프라 자원을 의미
- provider : Terraform으로 정의할 Infrastructure Provider를 의미한다.
- output : 인프라를 프로비저닝한 후에 생성된 자원을 output 부분으로 뽑을 수 있다. output으로 추출한 부분은 이후에 remote state에서 활용할 수 있다.
- backend : terraform의 상태를 저장할 공간을 지정하는 부분이다. backend를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능하다. 가장 대표적으로는 AWS S3가 있다.
- module : 공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의하는 부분이다. Module을 사용하면 변수만 바꿔서 동일한 리소스를 손쉽게 생성할 수 있다는 장점이 있다.
- remote state : remote state를 사용하면 VPC, IAM 등과 같은 공용 서비스를 다른 서비스에서 참조할 수 있다. tfstate 파일(최신 테라폼 상태정보)이 저장되어 있는 backend 정보를 명시하면, terraform이 해당 backend에서 output 정보들을 가져온다.
Terraform 작동 원리
테라폼을 잘 활용하기 위해서는 테라폼이 작동하는 원리를 이해하는 것이 중요하다. 테라폼은 3가지의 형상이 존재한다.
1. Local 코드 : 현재 개발자가 작성/수정하고 있는 코드
2. AWS 실제 인프라 : 실제로 AWS에 배포되어 있는 인프라
3. Backend에 저장된 상태 : 가장 최근에 배포한 테라폼 코드 형상
이 세 가지 형상의 흐름을 이해하면 각 테라폼 명령이 어떤 작업을 위한 일인지 쉽게 파악할 수 있다.
여기서 가장 중요한 것은 AWS 실제 인프라와 Backend에 저장된 상태가 100% 일치하도록 만드는 것이다. 테라폼을 운영하면서 최대한 이 두가지가 100% 동일하도록 유지하는 것이 중요한데, 테라폼에서는 이를 위해 import, state 등 여러 명령어를 제공한다.
먼저, 인프라 정의는 Local 코드에서 시작한다. 개발자는 로컬에서 테라폼 코드를 정의한 후에 해당 코드를 실제 인프라로 프로비전한다. 이 때 backend를 구성하여 최신 코드를 저장하는데, 흐름은 아래와 같다.
Terraform init
- 지정한 backend에 상태 저장을 위한 .tfstate 파일을 생성한다. 여기에는 가장 마지막에 적용한 테라폼 내역이 저장된다.
- init 작업을 완료하면, local에는 .tfstate에 정의된 내용을 담은 .terraform 파일이 생성된다.
- 기존에 다른 개발자가 이미 .tfstate에 인프라를 정의해 놓은 것이 있다면, 다른 개발자는 init 작업을 통해서 local에 sync를 맞출 수 있다.
Terraform plan
- 정의한 코드가 어떤 인프라를 만들게 되는지 미리 예측 결과를 보여준다. 단, plan을 한 내용에 에러가 없다고 하더라도, 실제 적용되었을 떄는 에러가 발생할 수 있다.
- Plan 명려엉는 어떠한 형상에도 변화를 주지 않는다.
Terraform apply
- 실제로 인프라를 배포하기 위한 명령어이다. apply를 완료하면, AWS 상에 실제로 해당 인프라가 생성되고 작업 결과가 backend의 .tfstate 파일에 저장된다.
- 해당 결과는 local의 .terraform 파일에도 저장된다.
Terraform import
- AWS 인프라에 배포된 리소스를 terraform state로 옮겨주는 작업이다.
- 이는 local의 terraform에 해당 리소스의 상태 정보를 저장해주는 역할을 한다.
- apply 전까지는 backend에 저장되지 않는다.
- import 이후에 plan을 하면 로컬에 해당 코드가 없이 때문에 리소스가 삭제 또는 변경된다는 결과를 보여준다. 이 결과를 바탕으로 코드를 작성할 수 있다.
만약 기존에 인프라를 AWS에 배포한 상태에서 테라폼을 적용하고 싶으면 모든 리소스를 terraform import로 옮겨야 한다. 번거로운 경우에는 처음부터 다시 작업해서 리소스를 올릴 수 있지만, 실제 서비스가 되는 인프라를 내리는건 위험할 수 있다.
'Cloud > IaC' 카테고리의 다른 글
[Terraform] AWS Configure 세팅 (0) | 2022.03.10 |
---|---|
[Terraform] Terraform 사용을 위한 사전준비 (0) | 2022.03.07 |