Terraform 원리
How Terraform works
테라폼 기본 개념
다음은 테라폼 활용에 필요한 개념입니다.
resource : 실제로 생성할 인프라 자원을 의미합니다. ex) aws_security_group, aws_lb, aws_instance
provider : Terraform으로 정의할 Infrastructure Provider를 의미합니다.
output : 인프라를 프로비저닝 한 후에 생성된 자원을 output 부분으로 뽑을 수 있습니다. Output으로 추출한 부분은 이후에 remote state에서 활용할 수 있습니다.
backend : terraform의 상태를 저장할 공간을 지정하는 부분입니다. beNX에서는 기본적으로 s3를 사용하고 있습니다.
module : 공통적으로 활용할 수 있는 인프라 코드를 한 곳으로 모아서 정의하는 부분입니다. Module을 사용하면 변수만 바꿔서 동일한 리소스를 손쉽게 생성할 수 있다는 장점이 있습니다.
remote state : remote state를 사용하면 VPC, IAM 등과 같이 여러 서비스가 공통으로 사용하는 것을 사용할 수 있습니다. tfstate파일이 저장되어 있는 backend 정보를 명시하면, terraform이 해당 backend에서 output 정보들을 가져옵니다.
테라폼 작동 원리
테라폼을 잘 활용하기 위해서는 테라폼이 작동하는 원리를 이해하는 것이 중요합니다. 테라폼을 처음 접해보신 분은 아래 영상을 통해 기본적인 소개에 대해서 듣는 것을 추천드립니다.
테라폼에는 3가지의 형상이 존재합니다.
Local 코드 : 현재 개발자가 작성/수정하고 있는 코드
AWS 실제 인프라 : 실제로 AWS에 배포되어 있는 인프라
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
로 옮겨야 합니다. 번거로운 경우에는 처음부터 다시 작업해서 리소스를 올릴 수 있지만, 실제 서비스가 되는 인프라를 내리는 건 위험할 수 있기 때문에 신중하게 결정하시기 바랍니다.
Last updated