ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [T102 3주차] (1) 테라폼 프로비저너
    테라폼(Terraform) 스터디 2023. 7. 22. 13:56
    cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 3주차 정리입니다.

     

    ●프로비저닝(Provisioning)이란?

    : 사용자의 요구에 맞게 인프라를 제공 하는 것

     

     

    프로비저너란?

    프로비저너는 프로바이더와 비슷하게 ‘제공자’로 해석되나, 프로바이더로 실행되지 않는 커맨드와 파일 복사 같은 역할을 수행(프로바이더 다음 포스팅에서 다룰 예정)

     

    ※프로비저너 사용상 주의사항

    • ex) AWS EC2 생성 후 특정 패키지를 설치해야 하거나 파일을 생성해야 하는 경우, 이것들은 테라폼의 구성과 별개로 동작해야 한다.
    • 프로비저너로 실행된 결과는 테라폼의 상태 파일과 동기화되지 않으므로 프로비저닝에 대한 결과가 항상 같다고 보장할 수 없다선언적 보장 안됨
    • 따라서 프로비저너 사용을 최소화하는 것이 좋다. 프로비저너의 종류에는 파일 복사와 명령어 실행을 위한 file, local-exec, remote-exec가 있다.

     

    실습

    -main.tf 파일 생성

    variable "sensitive_content" {
      default   = "secret"
      #sensitive = true
    }

    resource "local_file" "foo" {
      content  = upper(var.sensitive_content)
      filename = "${path.module}/foo.bar"

      provisioner "local-exec" {
        command = "echo The content is ${self.content}"
      }

      provisioner "local-exec" {
        command    = "abc"
        on_failure = continue
      }

      provisioner "local-exec" {
        when    = destroy
        command = "echo The deleting filename is ${self.filename}"
      }
    }

    -실행


    terraform init && terraform plan


    terraform apply -auto-approve
    ...
    Plan: 1 to add, 0 to change, 0 to destroy.
    local_file.foo: Creating...
    local_file.foo: Provisioning with 'local-exec'...
    local_file.foo (local-exec): Executing: ["/bin/sh" "-c" "echo The content is SECRET"]
    local_file.foo (local-exec): The content is SECRET
    local_file.foo: Provisioning with 'local-exec'...
    local_file.foo (local-exec): Executing: ["/bin/sh" "-c" "abc"]
    local_file.foo (local-exec): /bin/sh: abc: command not found
    local_file.foo: Creation complete after 0s [id=3c3b274d119ff5a5ec6c1e215c1cb794d9973ac1]

    # 테라폼 상태에 프로비저너 정보(실행 및 결과)가 없다
    terraform state list
    terraform state show local_file.foo
    cat foo.bar ; echo
    cat terraform.tfstate | jq

    # graph 확인 : 프로비저너 정보(의존성)이 없다
    terraform graph > graph.dot

    # 삭제
    terraform destroy -auto-approve
    ...
    Plan: 0 to add, 0 to change, 1 to destroy.
    local_file.foo: Destroying... [id=3c3b274d119ff5a5ec6c1e215c1cb794d9973ac1]
    local_file.foo: Provisioning with 'local-exec'...
    local_file.foo (local-exec): Executing: ["/bin/sh" "-c" "echo The deleting filename is ./foo.bar"]
    local_file.foo (local-exec): The deleting filename is ./foo.bar
    local_file.foo: Destruction complete after 0s

    => (main.tf 수정 후 재실행 -> 민감 정보 참조 부분의 실행 및 결과 내용은 출력 안됨, 에러 발생)

    -main.tf 파일 내용 수정

    variable "sensitive_content" {
      default   = "secret"
      sensitive = true
    }

    resource "local_file" "foo" {
      content  = upper(var.sensitive_content)
      filename = "${path.module}/foo.bar"

      provisioner "local-exec" {
        command = "echo The content is ${self.content}"
      }

      provisioner "local-exec" {
        command    = "abc"
        #on_failure = continue
      }

      provisioner "local-exec" {
        when    = destroy
        command = "echo The deleting filename is ${self.filename}"
      }
    }

    실행 2


    terraform apply -auto-approve
    ...
    Plan: 1 to add, 0 to change, 0 to destroy.
    local_file.foo: Creating...
    local_file.foo: Provisioning with 'local-exec'...
    local_file.foo (local-exec): (output suppressed due to sensitive value in config)
    local_file.foo (local-exec): (output suppressed due to sensitive value in config)
    local_file.foo: Provisioning with 'local-exec'...
    local_file.foo (local-exec): Executing: ["/bin/sh" "-c" "abc"]
    local_file.foo (local-exec): /bin/sh: abc: command not found

    │ Error: local-exec provisioner error
    │ 
    │   with local_file.foo,
    │   on main.tf line 14, in resource "local_file" "foo":
    │   14:   provisioner "local-exec" {
    │ 
    │ Error running command 'abc': exit status 127. Output: /bin/sh: abc: command not found

     

    실행 에러 예시

Designed by Tistory.