테라폼 구성에서 사용할 테라폼 바이너리 버전을 지정하는 것이 좋으며, 프로바이더에서도 호환성 문제가 발생하지 않도록 버전을 지정하는 것이 좋다.
사용할 테라폼 바이너리 버전에 대한 정보가 테라폼 상태 파일(terraform.lock.hcl)파일에 생성되어 있다. 이를 통해 더 낮은 버전의 테라폼 바이너리로 실행되지 않도록 보장한다.
terraform init 명령을 실행하면, 테라폼 구성을 실행하는 테라폼의 버전이 terraform 블록 내에 있는 required_version에 해당하는 버전인지 확인하고
명시된 버전보다 상위 버전이거나 같은 버전이면 에러가 발생하지 않지만 그렇지 않으면 에러가 발생한다.
terraform {
required_version = ">= 0.13,<=1"
# 테라폼 버전 명시
required_providers {
azurerm = {
version = "2.10.0" # not available on darwin/arm64
# 프로바이더의 소스와 버전 명시
}
}
}
provider "azurerm" {
features {}
}
variable "resource_group_name" {
default = "rg_test"
type = string
}
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = "westeurope"
}
resource "azurerm_public_ip" "pip" {
name = "book-ip"
location = "westeurope"
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Dynamic"
domain_name_label = "bookdevops"
}
2.3 프로바이더에 별칭을 추가해서 동일한 프로바이더의 여러 인스턴스 만들기
azurerm 블록을 복사한 후 각각의 프로바이더에 식별할 수 있는 이름과 함께 alias 속성을 추가한다.
각각의 리소스가 생성되어야 하는 구독 정보를 subscription_id 속성에 추가한다.
azurerm_resource_group 리소스에 provider 속성을 추가한 뒤 alias 속성에 설정된 이름으로 설정한다.
azurerm_resource_group 리소스는 프로바이더의 alias 속성을 이용해 프로비저닝 되어야 하는 구독 ID를 식별한다.
terraform {
required_version = "~> 1.1"
required_providers {
azurerm = {
version = "~> 3.9.0"
}
}
}
provider "azurerm" {
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
alias = "sub1"
features {}
}
provider "azurerm" {
subscription_id = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
alias = "sub2"
features {}
}
resource "azurerm_resource_group" "rg" {
provider = azurerm.sub1
name = "rg-sub1"
location = "westeurope"
}
resource "azurerm_resource_group" "rg2" {
provider = azurerm.sub2
name = "rg-sub2"
location = "westeurope"
}
위와 같이 구독 두 개에 alias(별칭)을 넣고, 각각의 리소스 그룹 생성에서 별칭을 이용해 프로비저닝 되어야 하는 구독 ID를 식별한다.
2.4 변수 조작하기
테라폼의 모든 속성값을 하드코딩하면 재사용에 문제가 생긴다. 변수를 이용해 테라폼 구성을 동적으로 만들어보자
variable로 변수를 설정하고
var.resource_group_name 등의 형식으로 변수를 사용할 수 있다.
마지막으로 main.tf와 같은 루트의 폴더 내에 terraform.tfvars라는 파일을 만들면 된다.
변수에 값을 설정하는 방법으로는 TF_VAR_변수명 이라는 환경 변수를 설정하는 또 다른 방법도 있다.
변수 규칙은 다음과 같다.
변수 이름: 이름은 테라폼 구성 내에서 고유해야 하고, 명시적이어야 한다.
변수가 나타내는 값에 대한 설명: CLI와 테라폼 구성 문서에 통합될 수 있기 떄문에 사용해야 한다.
기본값: 기본값은 선택이지만 기본값을 설정하지 않으면 필수로 값을 입력해야 한다
terraform plan과 apply 명령에 -var 옵션을 사용하면 변수에 값을 지정할 수 있다.
0.13버전부터 사용자 정의 유효성 검사 규칙을 생성할 수 있어 plan 명령의 실행 과정에서 검증할 수 있다.
terraform {
required_version = "~> 1.0"
required_providers {
azurerm = {
version = "~> 3.18"
}
}
}
provider "azurerm" {
features {}
}
variable "resource_group_name" {
description = "The name of the resource group"
type = string
}
variable "location" {
description = "The name of the Azure location"
default = "westeurope"
type = string
validation {
condition = contains(["westeurope", "westus"], var.location)
error_message = "The location must be westeurope or westus."
}
}
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = var.location
}
output "webapp_name" {
description = "Name of the webapp"
value = azurerm_linux_web_app.app.name
}
output 블록은 webapp_name이라는 이름과 azurerm_linux_web_app.name이라는 값으로 정의됐는데 이 값들은 테라폼을 통해 프로비저닝되는 애저 앱 서비스 인스턴스의 이름을 나타낸다.
출력이 반환하는 값에 대한 설명으로 description 속성을 추가할 수 있다. 이는 자동 생성되는 문서에 유용하게 사용된다.
2.8 테라폼 내장 함수 호출하기
테라폼으로 인프라를 프로비저닝하거나 리소스를 다룰 때 테라폼 구성에 있는 요소들을 변환하거나 조합하는 등의 작업을 해야 할 경우가 있다.
테라폼에는 몇몇 내장 함수들이 존재한다. 지금은 그 중 하나인 Upper Case로 출력하는 방법에 대해 배운다.
리소스 그룹의 이름은 다음의 명명규칙을 따른다.
RG - app name - environment
main.tf파일에 다음과 같은 코드를 작성한다.
variable "app_name" {
description = "Name of application"
type = string
}
variable "environment" {
description = "Environment Name"
type = string
}