테라폼 주요 커맨드

terraform의 주요 커맨드는 아래와 같다.

$ terraform
Usage: terraform [global options] <subcommand> [args]

The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.

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
  metadata      Metadata related commands
  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          Execute integration tests for Terraform modules
  untaint       Remove the 'tainted' state from a resource instance
  version       Show the current Terraform version
  workspace     Workspace management

Global options (use these before the subcommand, if any):
  -chdir=DIR    Switch to a different working directory before executing the
                given subcommand.
  -help         Show this help output, or the help for a specified subcommand.
  -version      An alias for the "version" subcommand.

커맨드 사용법과 ‘help’ 옵션

terraform 명령으로 시작하면 여러 가지 인수와 추가 커맨드가 구성된다. 보조 명령에 대해 사용 가능한 인수 값을 더 확인하고 싶다면 서브커맨드와 함께 -help를 입력해 사용한다.

아래는 예시

$ terraform console -help
Usage: terraform [global options] console [options]

  Starts an interactive console for experimenting with Terraform
  interpolations.

  This will open an interactive console that you can use to type
  interpolations into and inspect their values. This command loads the
  current state. This lets you explore and test interpolations before
  using them in future configurations.

  This command will never modify your state.

Options:

  -state=path       Legacy option for the local backend only. See the local
                    backend's documentation for more information.

  -plan             Create a new plan (as if running "terraform plan") and
                    then evaluate expressions against its planned state,
                    instead of evaluating against the current state.
                    You can use this to inspect the effects of configuration
                    changes that haven't been applied yet.

  -var 'foo=bar'    Set a variable in the Terraform configuration. This
                    flag can be set multiple times.

  -var-file=foo     Set variables in the Terraform configuration from
                    a file. If "terraform.tfvars" or any ".auto.tfvars"
                    files are present, they will be automatically loaded.

init

기본 사용법

$ terraform [global options] init [options]

terraform init 명령은 테라폼 구성 파일이 있는 작업 디렉토리를 초기화하는 데 사용된다.

이 작업을 실행하는 디렉토리를 *루트 모듈이라 부른다. 테라폼을 시작하는 데 사용되는 첫 번째 명령어로 테라폼에서 사용되는 프로바이더, 모듈 등의 지정된 버전에 맞춰 루트 모듈을 구성하는 역할을 수행한다. 자동화 구성을 위한 파이프라인 설계 시 테라폼을 실행하는 시점에 필수적으로 요청되는 명령어이기도 하다.

루트 모듈?

  • 테라폼이 실행되는 디렉토리를 모듈이라고 부른다.

  • 모듈에는 테라폼 코드 정의를 위한 tf 또는 tf.json 확장자의 파일과 tfvars 같은 변수를 정의하는 파일이 포함된다.

  • 일반적으로 기본 작업 디렉토리의 정의된 파일 집합을 ‘루트 모듈’이라고 한다.

  • 루트 모듈은 다른 모듈을 호출해 해당 루트 모듈이 구성하는 리소스 구성을 포함시킬 수 있고, 이렇게 호출되는 모듈을 ‘자식 모듈’이라고 한다.

terraform plan을 실행하면, 다음과 같은 에러가 출력된다.

$ terraform plan
╷
│ Error: Inconsistent dependency lock file
│
│ The following dependency selections recorded in the lock file are inconsistent with the current configuration:
│   - provider registry.terraform.io/hashicorp/local: required by this configuration but no version is selected
│
│ To make the initial dependency selections that will initialize the dependency lock file, run:
│   terraform init
╵

해당 오류 메시지는 작성한 코드에서 local이라는 종속성에 대한 구성을 요구하지만, 초기화되지 않아 문제가 발생했다는 내용이며, terraform init을 실행하라고 한다.

$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/local...
- Installing hashicorp/local v2.5.1...
- Installed hashicorp/local v2.5.1 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

테라폼 코드에서 사용된 구문을 기반으로 필요한 프로바이더 플러그인을 찾고 설치한다.

프로바이더, 모듈, 백엔드 구성이 설정되고 변경되는 경우에도 해당 명령어를 수행해야 한다.

-upgrade

0.14 버전 이후부터 프로바이더 종속성을 고정시키는 .terraform.lock.hcl이 추가됐다.

작업자가 의도적으로 버전을 변경하거나 코드에 명시한 다른 버전으로 변경하려면 terraform init -upgrade를 수행해야 한다.

validate

기본 사용법

$ terraform [global options] validate [options]

디렉토리에 있는 테라폼 구성 파일의 유효성을 확인한다.

-no-color

이 옵션은 대부분의 명령어와 함께 사용할 수 있다. 로컬이 아닌 외부 실행 환경(젠킨스, Terraform Cloud, Github Actions 등)을 사용하는 경우 색상 표기 문자가 표기될 수 있다. 이 경우 -no-color 옵션을 추가하면 색상 표기 문자 없이 출력한다.

-json

서브커맨드 옵션 중에 -json 옵션을 사용할 수 있는 명령어는 실행 결과를 JSON 형식으로 출력할 수 있다.

plan

plan 기본 사용법

$ terraform [global options] plan [options]

terraform plan 명령은 테라폼으로 적용할 인프라의 변경 사항에 관한 실행 계획을 생성하는 동작이다.

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:

  # local_file.abc will be created
  + resource "local_file" "abc" {
      + content              = "abc!"
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./abc.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

-detailed-exitcode

옵션이 없던 때와 결과는 같지만 exitcode가 환경 변수로 구성되는 옵션이다.

$ terraform plan -detailed-exitcode
...
$ echo $?
2

exitcode 또는 errorlevel은 동작의 결과를 숫자 코드로 제공한다.

  • 0 : 변경 사항이 없는 성공
  • 1 : 오류가 있음
  • 2 : 변경 사항이 있는 성공

apply

apply 기본 사용법

$ terraform [global options] apply [options] [PLAN]

terraform apply 명령은 계획을 기반으로 작업을 실행한다.

apply 명령은 plan에서 작성된 적용 내용을 토대로 작업을 실행한다. terraform plan 명령으로 생성되는 실행 계획이 필요하지만, 만약 없다면 새 실행 계획을 자동으로 생성하고 해당 계획을 승인할 것인지 묻는 메시지가 표시된다.

plan과 apply를 통해 테라폼 사용의 주요 목적인 작업을 계획하고 적용한다.

$ terraform apply

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:

  # local_file.abc will be created
  + resource "local_file" "abc" {
      + content              = "abc!"
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./abc.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:

terraform plan 명령과 같이 동작의 계획을 보여준 후 적용 여부를 묻는 입력 모드가 있다.

yes가 아니면 모두 취소한다.

-out=tfplan

-out=<파일명> 형식으로 파일 이름이 정해져 플랜 결과가 생성된다.

$ terraform plan -out=tfplan

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:

  # local_file.abc will be created
  + resource "local_file" "abc" {
      + content              = "abc!"
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./abc.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Saved the plan to: tfplan

To perform exactly these actions, run the following command to apply:
    terraform apply "tfplan"
$ terraform apply tfplan
local_file.abc: Creating...
local_file.abc: Creation complete after 0s [id=5678fb68a642f3c6c8004c1bdc21e7142087287b]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

앞서 실행 계획 없이 terraform apply를 실행했을 때는 terraform plan과 동일한 동작을 먼저 실행하고 해당 실행 계획을 적용할 것인지 묻는 과정이 있었다. 하지만 지금은 실행 계획이 있으므로, 즉시 적용하는 것을 확인할 수 있다.

적용이 완료된 상태에서 다시 terraform apply를 실행해보자.

$ terraform apply
local_file.abc: Refreshing state... [id=5678fb68a642f3c6c8004c1bdc21e7142087287b]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

앞서 apply 기본 수행에서 plan 이후 변경 내용을 확인하고 적용하려는 동작이 있다.

테라폼은 선언적 구성 관리를 제공하는 언어로 멱등성을 갖고, 이후에 추가로 설명될 상태를 관리하기 때문에 동일한 구성에 대해서는 다시 실행하거나 변경하는 작업을 수행하지 않는다.

-replace

사용자가 필요에 의해 특정 리소스를 다시 생성해야하는 경우 -replace 옵션으로 대상 리소스 주소를 지정하면 대상을 삭제 후 생성하는 실행 계획이 발생한다.

$ terraform apply -replace=local_file.abc
local_file.abc: Refreshing state... [id=5678fb68a642f3c6c8004c1bdc21e7142087287b]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # local_file.abc will be replaced, as requested
-/+ resource "local_file" "abc" {
      ~ content_base64sha256 = "U+Dv8yBGJvPiVspjZXLXzN+OtaGQyd76P6VnvGOGa3Y=" -> (known after apply)
      ~ content_base64sha512 = "J873Ugx5HyDEnYsjdX8iMBjn4I3gft82udsl3lNeWEoqwmNE3mvUZNNz4QRqQ3iaT5SW1y9p3e1Xn2txEBapKg==" -> (known after apply)
      ~ content_md5          = "4edb03f55c86d5e0a76f5627fa506bbf" -> (known after apply)
      ~ content_sha1         = "5678fb68a642f3c6c8004c1bdc21e7142087287b" -> (known after apply)
      ~ content_sha256       = "53e0eff3204626f3e256ca636572d7ccdf8eb5a190c9defa3fa567bc63866b76" -> (known after apply)
      ~ content_sha512       = "27cef7520c791f20c49d8b23757f223018e7e08de07edf36b9db25de535e584a2ac26344de6bd464d373e1046a43789a4f9496d72f69dded579f6b711016a92a" -> (known after apply)
      ~ id                   = "5678fb68a642f3c6c8004c1bdc21e7142087287b" -> (known after apply)
        # (4 unchanged attributes hidden)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

local_file.abc: Destroying... [id=5678fb68a642f3c6c8004c1bdc21e7142087287b]
local_file.abc: Destruction complete after 0s
local_file.abc: Creating...
local_file.abc: Creation complete after 0s [id=5678fb68a642f3c6c8004c1bdc21e7142087287b]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

destroy

기본 사용법

$ terraform [global options] destroy [options]

terraform destroy 명령은 테라폼 구성에서 관리하는 모든 개체를 제거하는 명령이다.

destroy도 plan과 apply의 관계처럼 실행 계획이 필요하다.

실행 계획 생성은 terraform plan -destroy이다.

-auto-approve

자동 승인 기능을 부여하는 옵션이다.

fmt

기본 사용법

$ terraform fmt [options] [DIR]

fmt 명령어는 테라폼 구성 파일을 표준 형식과 표준 스타일로 적용하는 데 사용한다.

주로 구성 파일에 작성된 테라폼 코드의 가독성을 높이는 작업에 사용된다.

-recursive

하위 디렉토리의 테라폼 구성 파일을 모두 포함해 적용하는 옵션이다.