Terraform Provisioner
Terraform의 Provisioner는 Terraform이 리소스를 생성한 후에, 그 리소스 내에서 추가 작업(스크립트 실행, 파일 복사 등)을 자동으로 수행하도록 해주는 기능이다.
즉, Terraform이 인프라를 생성하는 것에 그치지 않고, 생성된 리소스 안에서 필요한 초기 설정 작업(프로비저닝)을 자동화할 때 사용한다.
📌Provisioner 문법
provisioner는 항상 resource 블록 내부에 정의되어야 한다. (단독으로 따로 사용할 수 없다)
resource "<리소스_타입>" "<이름>" {
# 리소스 설정들...
provisioner "<프로비저너_타입>" {
# 실행할 명령어 또는 설정
}
}
질문: Terraform 프로비저너(provisioner)는 모든 리소스 블록에 추가할 수 있다.
A. 참
B. 거짓
정답
정답. A
📌 Provisioner 사용 예시
Terraform 리소스를 만들고 나서 Provisioner는 다음과 같은 작업을 할 수 있다.
- 서버 안에 명령어 실행 (예: sudo apt update )
- 서버에 파일 복사 (예: script.sh 업로드)
Provisioner 종류
Provisioner | 설명 | 사용 위치 |
remote-exec | 생성한 리소스 내부에서 명령 실행 | EC2 등 리소스 내부 |
file | 생성한 리소스 내부로 파일 복사 | EC2 등 리소스 내부 |
local-exec | Terraform을 실행한 나의 컴퓨터에서 실행 | 로컬 |
🧪 1. remote-exec 예시
Provisioner을통해 EC2 인스턴스에 접속해서 명령어를 직접 실행한다.
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
## EC2 인스턴스를 만든 뒤, apt update와 nginx 설치 명령을 실행
provisioner "remote-exec" {
inline = [
"sudo apt update",
"sudo apt install -y nginx"
]
}
##connection 블록은 SSH 접속을 위한 설정
connection {
type = "ssh"
user = "ubuntu"
private_key = file("~/.ssh/id_rsa")
host = self.public_ip
}
}
🧪 2. file 예시
로컬에서 만든 파일을 EC2 인스턴스로 복사한다.
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
## 로컬의 startup.sh 파일을 EC2의 /home/ubuntu/ 경로로 복사
provisioner "file" {
source = "startup.sh"
destination = "/home/ubuntu/startup.sh"
}
connection {
type = "ssh"
user = "ubuntu"
private_key = file("~/.ssh/id_rsa")
host = self.public_ip
}
}
🧪 3. local-exec 예시
Terraform을 실행하는 내 컴퓨터에서 명령어를 실행한다.
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
## EC2가 생성되면, 내 컴퓨터에서 public IP를 출력
provisioner "local-exec" {
command = "echo 'EC2 instance has been created: ${self.public_ip}'"
}
}
Connection 블록
connection block은 provisioner가 원격 리소스(보통 EC2 같은 VM)에 접근할 때 필요한 접속 정보(인증, 포트 등) 를 설정하는 블록이다.
왜 Connection 블록이 필요한가?
provisioner 중 remote-exec, file 등은 EC2 인스턴스나 다른 서버에 접속해서 작업을 실행해야한다.
이 때 접속하기 위해서 SSH 나 WinRM을 통해 접속해야하는데 이 떄 필요한 접속 정보를 connection block에서 지정한다.
사용 예시: provisioner 내부에 작성한다.
// EC2 인스턴스를 정의하는 리소스 블록
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0" // 사용할 AMI ID (Amazon Linux 2 등)
instance_type = "t2.micro" // 인스턴스 유형 (무료 티어 대상)
// 프로비저너: EC2 인스턴스에 접속하여 명령을 실행
provisioner "remote-exec" {
inline = [
"echo Hello from Terraform" // 인스턴스에서 실행할 명령 (터미널에 메시지 출력)
]
// EC2에 SSH로 접속하기 위한 설정 (connection block)
connection {
type = "ssh" // 접속 방식: SSH
user = "ec2-user" // EC2 로그인 사용자 (Amazon Linux의 기본 사용자)
private_key = file("~/.ssh/id_rsa") // 개인 키 파일 경로 (SSH 인증용)
host = self.public_ip // 접속 대상 호스트 (이 인스턴스의 퍼블릭 IP)
}
}
}
🤔 문제
Terraform이 생성한 리소스 안에서 프로세스를 실행하는 프로비저너는 무엇인가요?
- remote-exec
- null-exec
- local-exec
- file
정답
정답. 1번
🤔 문제 2
Terraform의 provisioner는 반드시 리소스 설정 블록 안에 중첩(nest)되어야 한다.
- 맞다 (True)
- 아니다 (False)
정답
정답 1번
🤔 문제 3
인증이 필요한 Terraform 프로비저너는 ______ 블록을 사용할 수 있습니다.
A. connection
B. credentials
C. secrets
D. ssh
정답
정답. A
'Terraform' 카테고리의 다른 글
IaC(infrastructure as code) 핵심 원칙 쉽게 정리 (0) | 2025.06.16 |
---|---|
[Terraform] terraform state 명령어란? 아주 쉽게 정리 (state list, show, rm) (0) | 2025.06.16 |
[Terraform] terraform taint 명령어란? 아주 쉽게 정리 (0) | 2025.06.14 |
[Terraform] Provider란? 쉽게 정리 (required_providers) (0) | 2025.06.14 |
[Terraform] remote backend란? 쉽게 정리 (2) | 2025.06.14 |