본문 바로가기

♻ Terraform(테라폼)/Terraform provisioner

Terrafrom Provisioner 란?

# 사용 목적

Terraform을 활용하여 인프라를 구성 시 여러가지 추가 작업이 필요하다. 가장 많이 하는 작업은 shellscript를 통한 application의 설치와 기타 설정 작업 들일 것이다. terraform의 작업을 고도화 하기위해서는 외부에 설정된 파일의 사용은 거의 필수 이므로 해당 내용에대한 Case-Study가 필요하다.

# Terraform Provisioner에 대해 알아보고, 간단한 사용법 확인

테라폼 프로비저너(provisioner)는 테라폼을 실행할 때 여러가지 추가 작업을 위해 로컬 시스템이나 원격 시스템에서 스크립트를 실행하는데 사용된다.

여기서 로컬 시스템에서 스크립트를 실행하는 local-exec , 원격 리소스에서 스크립트를 실행하는 remote-exec, 원격 리소스에서 셰프 클라이언트를 실행하는 chef 및 원격 리소스로 파일을 복사하는 file 등이 존재한다.

1. Terraform Provisioner의 특징

- 프로비저너는 terraform apply명령에 대해 생성할 때만 실행되고 그 뒤에 업데이트되거나 하지 않는다.  

- provisioner에서 when="destory" 인수를 설정하면 삭제할 때 실행되는 프로비저너가 된다. 

- 프로비저너는 지정이 가능하며 테라폼은 한 번에 하나씩 순서대로 실행한다.

- on_failure인수를 사용하여 테라폼에 프로비저너의 오류를 처리하는 방법을 지시할 수 있다. 만약 'continue"로 설정하면 테라폼은 오류를 무시하고 리소스 생성 또는 삭제를 계속한다. 'abort'로 설정하면 테라폼은 생성 또는 삭제를 중단한다.

2. local-exec 프로비저너

로컬에 스크립트나 프로그램을 실행하거나 클라우드에 실행한 IP나 ID같은 정보를 로컬 파일로 만들 때 사용한다.

resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"

provisioner "local-exec" {
 command = "echo \"Hello, World from $(uname -smp)\""
 }
}

이 코드에서 terraform apply를 실행하면 'Hello, World from' 문자열 뒤에 uname 명령어를 이용해 로컬 운영체제 세부정보를 출력한다.

3. remote-exec 프로비저너

local-exec와 달리 리소스를 생성한 후 생성된 머신에서 실행된다.

remote-exec는 inline, script, scripts가 있는데 셋 중 한번에 하나만 사용해야 한다. inline을 예시로 보면 아래와 같다.

resource "aws_instance" "example" {
# 중략

connection {
 type ="ssh"
 host =self.public_ip
 user="ubuntu"
 private_key = tls_private_key.example.private_key_pem
 }
 
provisioner "remote-exec" {
 inline = ["echo \"Hello, World from $(uname -smp)\""]
 }
}

이처럼 원격에 접속해서 실행하려면 connection을 지정해야 한다. connection은 resource 아래 선언할 수 도있고, provisioner 아래 선언할 수도 있는데 resource 아래 선언하면 해당 리소스의 모든 프로비저너가 선언한 커넥션을 사용하게 된다. 

 

이번엔 script 를 사용해보자.

resource "aws_instance" "example" {
# 중략

connection {
 type ="ssh"
 host =self.public_ip
 user="ubuntu"
 private_key = tls_private_key.example.private_key_pem
 }
 
provisioner "remote-exec" {
 scrpit ="./apache_install.sh"
  }
}

scrpit를 사용하면 로컬에 있는 파일을 원격 서버에 복사한 뒤에 실행한다. 복잡한 스크립트의 경우 유용하고, scripts는 여러 파일을 실행해야 할 때 사용한다.

4. null_resource를 사용한 프로비저너

null_resource는 말그대로 빈 리소스를 의미한다. 기존 자원과 관련이 없는 provisioners을 구성할 수 있는 자원이다. 즉, 특정 리소스에 연결하지 않고 프로비저너를 실행할 때 사용한다. 실제 리소스에는 연결되지 않는다.

resource "null_resource" "ssh" {
 provisioner "local-exec" {
  command = "echo \"Hello, World from $(uname -smp)\""
  }
 }