흰 스타렉스에서 내가 내리지

테라폼 작동원리 그리고 CLI 간단실습 본문

DevOps

테라폼 작동원리 그리고 CLI 간단실습

주씨. 2024. 8. 1. 21:51
728x90

Terraform 기본 개념 

resource 실제로 생성할 인프라 자원을 의미한다. 
ex) aws_security_group, aws_lb, aws_instance
provider Terraform 으로 정의할 Infrastructure Provider 를 의미한다. 
ex) aws, azure, github, naver cloud, ...
output 안프라를 테라폼을 통해 프로비저닝 한 후에 결과물들을 variable 로 state 파일에 저장한다. 
output 으로 추출한 부분은 이후에 remote state 에서 활용할 수 있다. 
backend terraform 의 상태 (state 파일) 을 저장하는 공간을 의미한다. 
backend 를 사용하면 현재 배포된 최신 상태를 외부에 저장하기 때문에 다른 사람과의 협업이 가능하다. 
가장 대표적으로는 AWS S3 가 있다. 
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 로 옮겨야 한다. 

 


CLI 간단 실습

terraform init

 

 

현재 폴더 내에 아무것도 없는 상태에서 init 명려엉를 실행할 시 아무것도 이루어지지 않는다. 

 

이제 provider 를 생성해 보자.

vim provider.tf
provider "aws" {
  region = "ap-northeast-2"
}

 

terraform init

 

init 명령어를 사용하면 aws provider 를 다운로드 받은 것이다. 

 

폴더 내에 .terraform 폴더가 생성이 되었다. 

 

 

terraform 은 내부적으로 aws 에 API 를 호출하는 것이기 때문에 aws 라이브러리가 필요한데, 그 라이브러리를 다운로드 받는 것도 init 명령어의 역할이다. 

 

이제 간단하게 리소스를 만들어 보자. 

vim s3.tf
resource "aws_s3_bucket" "test" {
  bucket = "terraform-cli-test-0123"
}

참고로 버킷명에 _(언더바) 문자는 사용할 수 없다. -(하이픈) 을 써야한다.

사실 당연한거다. s3 버킷이 서브도메인으로 들어가니까.

그리고 리전당 고유한 버킷명을 가져야 하기 때문에 버킷 명도 잘 정해야 한다.  

 

terraform plan

 

다른 인자들을 옵셔널하기 때문에 정의해도 되고 안해도 되고, 혹은 디폴트값이 들어가는 인자들이 있다. 

그러나 bucket 이름은 필수 인자이기 때문에 꼭 넣어줘야 한다. 

plan 명령어는 인프라에 어떠한 변화도 주지 않기 때문에 계속 실행해도 괜찮다. 

 

그럼 이제 실제로 인프라를 배포하기 위해 terraform apply 를 해보자.

terraform apply

 

 

yes 를 실제로 쳐줘야 실행된다. 

 

 

ls 명령어를 치면 state 파일이 생성되어 있다. 

 

backend 를 따로 지정하지 않았기 때문에 local 이 backend 가 된 것이다. 

 

cli 명령어를 통해서 s3 버킷이 잘 생성되었는지 확인해 보자.

aws s3 ls

잘 생성이 되었다.

 

 

terraform import 명령어를 사용하는 예시

위 상황에서 s3.tf 파일을 지우게 된다면?

rm -f s3.tf

 

그리고 plan 명령어를 쳐서 확인해본다. 

terraform plan

 

plan 명령어를 쳐보면, 버킷이 삭제가 될것이라고 나온다. 

왜냐하면 s3.tf 가 실제로 삭제가 되었기 때문이다. 

 

코드가 삭제되었으니까, 실제 state 파일에도 남아있고, 실제 인프라도 남아있으니까 삭제를 할 것이라고 테라폼이 인지하는 것이다. 

 

그런데 여기서 terraform.tfstate 파일을 삭제해보겠다. 

rm -f terraform.tfstate

 

rm -rf .terraform

.terraform 폴더를 지웠으니 plan 명령어가 먹히지 않는다. 

 

 

 

다시 terraform init 을 한다. 

terraform init

re:  init 명령어를 통해 상태 저장을 위한 .tfstate 파일을 생성한다.

re:  init 작업을 완료하면, local 에는 .tfstate 에 정의된 내용을 담은 .terraform 폴더가 생성된다.

 

 

여기서 plan 명령어를 쳐본다. 

terraform plan

 

 

그러면, 실제 방금 우리가 만든 인프라 (s3 버킷) 은 아직 있지만, 코드를 분실했기 때문에, 즉 삭제했기 때문에 테라폼 입장에서는 아무것도 안 만들어진 상태가 맞는 것이다. 

 

여기서 import 명령어를 통해 기존 리소스를 import 해보자. 

s3 를 import 해오는 방법을 구글에 검색

공식 문서에 import 명령어 사용법이 적혀 있다.

 

# terraform import aws_s3_bucket.bucket bucket-name

terraform import aws_s3_bucket.test terraform-cli-test-0123

실제 코드가 없기 때문에 import 를 할 수 가 없다. 

 

그럼 위에서 우리가 내가 만든 s3.tf 를 다시 생성해 보자. 

vim s3.tf
resource "aws_s3_bucket" "test" {
  bucket = "terraform-cli-test-0123"
}

 

terraform plan

 

여기서 plan 명령어를 치면 이렇게 결과가 나온다. 여기서 알 수 있는 것이 무엇인가?

plan 명령어는 실제 리소스가 있는지 없는지는 검사를 하지 않는다

하지만 실제로 apply 를 통해 실행을 하면, 생성이 되지 않을 것이다. 이미 만들어져 있으니까

terraform apply 명령어를 실행했을 때, 리소스는 생성에 실패한다.

 

이럴 때 import 명령어를 사용한다. 

terraform import aws_s3_bucket.test terraform-cli-test-0123

import 가 성공적으로 되었다고 나온다. 

폴더에 terraform.tfstate 파일이 생성되었을 것이다. 

 

이제 plan 명령어를 치면

terraform plan

 

변경될 사항이 없다고 나온다. 

 

s3.tf 파일을 생성한 후, import 명령어를 치기 전에는 plan 명령어를 실행했을 때 리소스가 생성될 것이라고 나왔다. 

import 명령어를 실행한 후에 plan 명령어를 실행하면, 변경될 리소스가 없다고 뜬다. 

이는 로컬과 실제 인프라의 sync 를 맞춘 것이다. 

 

 

terraform state list

state 라는 명령어도 있는데, 실행하면 실제로 생성된 인프라를 볼 수 있다. 

'DevOps' 카테고리의 다른 글

AWS VPC 와 관련 개념, 콘솔을 통한 생성 실습  (0) 2024.08.06
테라폼에서 *.tf 파일 설명  (0) 2024.08.01
AWS Configure 설정  (0) 2024.07.30
terraform 설치하기  (0) 2024.07.30
AWS EC2 그리고 SSH  (0) 2024.07.29