Terraform 기초 실습 스터디를 진행하고 있으며, 커리큘럼 3주차에 해당하는 내용입니다.
* [테라폼으로 시작하는 IaC] 도서 참조
이전 포스팅에서 테라폼의 반복문에 대해 알아보았다.
이제 테라폼의 조건식, 함수와 프로비저너 등에 대해 알아보도록 하자.
조건식
테라폼에서 조건식은 3항 연산자 형태이다.
조건식은 ? 기호를 기준으로 왼쪽은 조건이며, 오른쪽은 : 을 기준으로 왼쪽이 조건에 대해 true 가 반환되는 경우이고 오른쪽이 false 가 반환되는 경우이다.
다음의 예에서 var.a 가 빈 문자열이 아니라면 var.a 를 나타내고, 빈 문자열이라면 "default-a" 를 반환한다.
# <조건 정의> ? <옳은 경우> : <틀린 경우>
var.a != "" ? var.a : "default-a"
응용 예시
count 에 조건식을 결합한 경우, 다음과 같이 특정 조건에 따라 리소스 생성 여부를 선택할 수 있다.
variable "enable_file" {
default = true
}
resource "local_file" "foo" {
count = var.enable_file ? 1 : 0
content = "foo!"
filename = "${path.module}/foo.bar"
}
output "content" {
value = var.enable_file ? local_file.foo[0].content: ""
}
enviroment 라는 variable 로 리소스를 분리해서 관리할 때, com 환경이라면 해당 리소스를 생성하지 않는 것을 예상할 수 있다.
함수
테라폼은 프로그래밍 언어적인 특성을 갖추고 있다. 값의 유형을 변경하거나 조합할 수 있는 내장함수 들이 그 예이다.
(단, 내장함수 외에 사용자가 구현하는 별도의 사용자 정의 함수는 지원하지 않는다.)
테라폼 코드에 함수를 적용하면 변수, 리소스 속성, 데이터 소스 속성, 출력 값 표현 시 작업을 효과적으로 수행할 수 있다.
소문자를 대문자로 변환시킬 수 있는 upper 함수의동작을 확인해보자.
terraform console
함수 사용의 결과를 확인하기 위해, 매번 코드를 작성하고 terraform plan & apply 로 확인하는 것은 비효율적이다.
이 경우 terraform console 을 사용해 테라폼에서 내장함수를 적용했을 때 어떤 결과가 나오는지 확인할 수 있다.
terraform console 을 입력하면 > 표시가 나오며, 여기에 함수와 함께 원하는 값을 넣어 테스트할 수 있다. (종료 시, Ctrl+C 또는 exit 입력)
프로비저너
프로비저너는 프로바이더와 혼동할 수 있으니 잘 이해를 해야한다.
프로비저너는 프로바디어로 실행되지 않는 커맨드와 파일 복사 같은 역할을 수행한다.
예를 들어, 클라우드의 리눅스 VM 에 특정 패키지를 설치하거나 파일을 생성해야하는 경우, 이것은 테라폼 구성과 별개로 동작해야 한다.
프로비저너로 실행된 결과는 테라폼 tfstate 파일과 동기화되지 않으므로 프로비저닝에 대한 결과가 항상 일정하다고 보장할 수 없다.
(따라서 프로비저너 사용은 최소화하는 것이 좋다.)
프로비저너 1. 프로비저너 사용 방법
프로비저너의 경우, 리소스 프로비저닝(생성) 이후 동작하도록 구성할 수 있다.
예를 들어 AWS의 EC2 인스턴스를 생성하고 난 후 CLI 를 통해 별도 작업을 수행하는 경우를 가정할 수 있다.
loacl_file 리소스 내에 provisioner 블록을 선언하여 사용방식을 확인해보자.
프로비저너는 선언된 리소스 블록의 작업이 종료되고난 후, 지정한 동작을 수행한다.
작성된 예제와 같이 다수의 프로비저너를 반족적으로 선언할 수 있고, 이는 순서대로 처리된다.
terraform apply 후, local-exec 가 수행된 결과를 확인해봤다.
첫번째 Provisioning with "local-exec"... 메시지는 content 를 출력하려는 의도이다.
sensitive_content 에 sensitive 선언으로 인해, 화면에 값이 출력은 되지 않는 것을 확인할 수 있다.
두번째 프로비저너에서는 abc 라고 하는 커맨드를 수행한다. 해당 커맨드는 존재하지 않으므로, 이 단계에서 apply 는 실패해야 한다.
하지만 on_failure = continue 서넌이 있으므로 실패 시에도 다음 단계로 넘어간다.
(기본값인 on_failure = fail 을 설정하고 실행하는 경우에는 관련 커맨드를 찾을 수 없으므로 실패한다.)
세번째 프로비저너에 대해서는 terraform apply 를 했을 때 관련 출력을 찾을 수 없다.
when = destroy 속성이 추가된 프로비저너는 destroy 시에만 정보를 출력한다.
이와 같이 terraform destroy 를 실행했을 때 동작하는 프로비저너를 활용할 수 있다.
프로비저너 2. local-exec 프로비저너
local-exec 는 테라폼이 실행되는 환경에서 수행할 커맨드를 정의한다. (앞서 사용방법에서 테스트해보았다.)
이때 리눅스나 윈도우 등 테라폼을 실행하는 환경에 맞게 설정 커맨드를 정의해야 한다.
사용하는 인수 값은 다음과 같다.
- command(필수): 실행할 명령줄을 입력하며 << 연산자를 통해 여러 줄의 커맨드 입력 가능
- working_dir(선택): command 명령을 실행할 디렉터리 지정
- interpreter(선택): 명령을 실행하는 데 필요한 인터프리터 지정
- environment(선택): 실행 시 환경변수는 실행 환경의 값을 상속받음
프로비저너 3. 원격지 연결
file 프로비저너와 remote-exec 를 사용하기 위해서는 원격지에 연결할 SSH, WinRM 연결 정의가 필요하다.
connection 블록은 리소스에 선언되는 경우 해당 리소스 내에 구성된 프로비저너에 대해 공통으로 선언되고, 프로비저너 내에 선언되는 경우 해당 프로비저너에만 적용된다.
프로비저너 4. file 프로비저너
file 프로비저너는 테라폼을 실행하는 시스템에서 원격 연결 대상으로 파일 또는 디렉터리를 복사하는 데 사용된다.
사용되는 인수는 다음과 같다.
- source: 소스 파일 혹은 디렉터리, content 와 함께 사용할 수 없다.
- content: 연결 대상에 복사할 내용을 정의하며, destination 이 디렉터리인 경우 tf-file-content 파일이 생성되고, 파일인 경우 해당 파일에 내용이 기록된다. source 와 함께 사용할 수 없다.
- destination: ssh 의 경우 대상 디렉터리가 존재해야 하며, winrm 인 경우 디렉터리가 없을 때 자동 생성한다.
destination 이 디렉터리인 경우 경로 설정에 따라 다양한 동작의 차이가 발생하므로, 설정 적용시 테스트에 유의가 필요하다.
프로비저너 5. remote-exec 프로비저너
remote-exec 는 원격지 환경에서 실행할 커맨드와 스크립트를 정의한다.
예를 들면 AWS 의 EC2 인스턴스를 생성하고 해당 VM 에서 명령을 실행하고 패키지를 설치하는 등의 동작을 의미한다.
사용되는 인수는 다음과 같고 각 인수는 서로 배타적이다.
- inline
- script
- scripts
책 설명으로만 확인했을 때, 텍스트로 명확히 이해되지 않는 부분이 있어 리소스 구축시 프로비저너 적용이 필요하다면 추가 테스트가 필요해보인다.