kakasoo

테라폼 작동 원리와 CLI 실습 본문

프로그래밍/devops

테라폼 작동 원리와 CLI 실습

카카수(kakasoo) 2023. 1. 5. 23:39
반응형

테라폼의 기본 개념 요약

  • resource : 실제로 생성할 인프라 자원으로, 보안그룹이나 EC2 등의 인스턴스를 의미
  • provider : 테라폼으로 정의할 인트라 스트럭쳐 프로바이더를 의미한다.
  • output : 인프라를 프로비저닝한 후 생성된 자원을 output으로 뽑는데, 뽑은 이후 remote state에서 활용
  • backend : output을 저장하는 공간으로, 리소스 최신 상태를 외부에 저장하며, 대표적으로는 AWS S3
  • remote state : VPC, IAM 등 공용 서비스를 다른 서비스에서 참조할 수 있게 최신 테라폼 상태를 저장한 것.
  • module : 공통적으로 활용할 수 있는 인프라 코드를 한 곳에 모아서 정의하여, 변수 명만 바꿔서 재사용 가능.

 

프로비저닝이란?

프로비저닝(provisioning)은 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요 시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다.

 

테라폼 작동 원리

  • 로컬 코드 : 현재 개발자가 작성/수정하고 있는 테라폼 코드
  • AWS 실제 인프라 : 실제로 AWS에 배포되어 있는 인프라 ( 또는 다른 프로바이더에서 )
  • 백엔드에 저장된 상태 : 가장 최근에 배포한 테라폼 코드 형상

실제 인프라와 백엔드에 저장된 상태가 일치하도록 하는 것이 매우 중요하다.

이 둘이 어긋나는 경우는 AWS 실제 인프라를 콘솔에서 직접 제어하거나, 백엔드 status 파일을 수정한 경우,

또는 다른 개발자가 자신의 로컬 코드를 이용해 수정한 경우, 싱크가 어긋나게 되면서 충돌나는 경우가 있다.

이런 문제를 해결하기 위해서 테라폼에서는 import, state 등 여러 명령어를 제공한다.

 

테라폼 주요 명령어

$ terraform --help

Main commands:
  init          Prepare your working directory for other commands
  validate      Check whether the configuration is valid
  plan          Show changes required by the current configuration
  apply         Create or update infrastructure
  destroy       Destroy previously-created infrastructure

All other commands:
  console       Try Terraform expressions at an interactive command prompt
  fmt           Reformat your configuration in the standard style
  force-unlock  Release a stuck lock on the current workspace
  get           Install or upgrade remote Terraform modules
  graph         Generate a Graphviz graph of the steps in an operation
  import        Associate existing infrastructure with a Terraform resource
  login         Obtain and save credentials for a remote host
  logout        Remove locally-stored credentials for a remote host
  output        Show output values from your root module
  providers     Show the providers required for this configuration
  refresh       Update the state to match remote systems
  show          Show the current state or a saved plan
  state         Advanced state management
  taint         Mark a resource instance as not fully functional
  test          Experimental support for module integration testing
  untaint       Remove the 'tainted' state from a resource instance
  version       Show the current Terraform version
  workspace     Workspace management
  • init : 테라폼 initialize하는 명령어
  • plan : 실행의 결과를 보여주는 것

 

지금은 init 명령어를 쳐도 아무런 반응이 없다.

아직 아무 테라폼 코드도 없기 때문에 아무것도 이루어지지 않는 것이 정상이다.

일단 프로바이더를 생성해야 한다.

 

terraform init

# AWS provider

provider "aws" {
    region= "ap-northeast-2"
    version = "~> 3.0"
}
resource "aws_s3_bucket" "test" {
    bucket = "terraform-test"
}
  • aws_s3_bucket 이라는 리소스를 사용할 것이다.
  • 그 인스턴스의 이름은 test다.
  • 생성된 버킷의 이름은 terraform-test 이다.
    • 생성된 버킷 이름은 정말로 aws 내에서 생성된 이름을 의미하며, 인스턴스 이름은 테라폼의 변수명이다.

 

terraform plan

$ terraform plan

 

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create

Terraform will perform the following actions:

  # aws_s3_bucket.test will be created
  + resource "aws_s3_bucket" "test" {
      + acceleration_status         = (known after apply)
      + acl                         = "private"
      + arn                         = (known after apply)
      + bucket                      = "terraform-test"
      + bucket_domain_name          = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags_all                    = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + object_lock_configuration {
          + object_lock_enabled = (known after apply)

          + rule {
              + default_retention {
                  + days  = (known after apply)
                  + mode  = (known after apply)
                  + years = (known after apply)
                }
            }
        }

      + versioning {
          + enabled    = (known after apply)
          + mfa_delete = (known after apply)
        }
    }
  • plan 명령어는 아무리 쳐도 문제가 발생하지 않는다.
  • plan 은 작성된 코드를 바탕으로 어떻게 리소스를 생성할지를 미리 보여주는 명령어 이다.

 

terraform apply

$ terraform apply
  • plan에서 보여준 것과 동일하게, 인프라를 생성하는 명령어.
  • 생성 이후 .tfstate 확장자의 파일을 생성하는데, 여기에서 생성된 최신 상태를 보여준다.
  • 백엔드를 따로 지정하지 않았기 때문에 상태 파일이 로컬에 저장된 것.

 

$ aws s3 ls
  • 실제로 버킷이 생겼는지 aws-cli로 확인이 가능하다.

 

테라폼 인스턴스의 삭제

아까 만들었던 s3 파일을 로컬에서 다시 삭제하고 plan 명령어를 입력하면 s3가 삭제될 거라는 내용이 나온다.

테라폼에서는 이 상태를 destroyed 라고 하는데,

로컬에서 코드가 사라졌기 때문에, 로컬과 상태를 맞추기 위해 실제 인프라를 삭제할 거라는 얘기가 나온다.

여기서 설정 파일인 .tfstate를 삭제하고 다시 plan을 입력해보면 변화가 없다는 얘기가 나온다.

이는 테라폼이 코드를 분실했기 때문에, s3를 삭제해야 한다는 현 상태를 추적하지 못하는 것 이다.

 

import를 사용한 현 테라폼 상태 추가

terraform import aws_s3_bucket test

해석

  • terraform import 명령어를 사용한다.
  • import 명령어는 현재 인프라의 상태를 추가해주는 명령어다.
  • 추가할 대상은 aws_s3_bucket 이라는 리소스이며, 이름은 test로 만들어져 있다.
  • 이렇게 작성한다고 해도 동작하지 않는데, 그 이유는 대상은 알았지만 아직 그에 대응할 코드가 없어서다.
  • 다시 리소스와 이름을 맞춰 테라폼 파일을 만들면 이 문제를 해결할 수 있다.

만약 동일한 변수 명으로 리소스를 또 만든다면?

  • 여기까지 수행한 상태에서 plan을 치면, 다시 s3를 1개 추가할 거라는 내용이 나온다.
  • 하지만 apply 명령어를 입력하면, 이미 동일한 버킷으로 생성되었기 때문에 불가능하다는 내용이 나온다.
반응형

'프로그래밍 > devops' 카테고리의 다른 글

AWS beanstalk과 ECS의 차이  (0) 2023.02.12
Docker 소개 & 사용 방법 정리  (0) 2023.01.08
AWS-CLI 및 terraform 설치  (0) 2023.01.01
[Mac OS] ZSH 및 OH-MY-ZSH  (0) 2023.01.01