Terraform 템플리트 작성
잘 구조화되고 재사용 가능하며 포괄적인 Terraform 템플리트를 작성하는 방법을 알아봅니다.
Terraform 템플리트는 IBM Cloud® 리소스에 대해 달성하려는 상태를 선언하는 하나 이상의 Terraform 구성 파일로 구성됩니다. 리소스로 성공적으로 작업하려면 IBM 을 클라우드 공급자로 구성하고 Terraform 구성 파일에 리소스를 추가해야 합니다. 선택적으로 입력 변수를 사용하여 리소스를 사용자 정의할 수 있습니다.
HCL(HashiCorp Configuration Language) 또는 JSON 형식을 사용하여 Terraform 구성 파일을 작성할 수 있습니다. 배포 프로세스를 표준화하고 간소화하는 데 도움이 되는 사전 구축된 인프라 구성 요소를 제공하는 Terraform IBM 모듈(TIM)을 사용할 수도 있습니다.
Terraform 템플리트 작성을 시작하기 전에 IBM Cloud Schematics 제한사항을 검토하십시오.
provider 블록 구성
Terraform 구성 파일의 provider 블록에서 사용할 클라우드 제공자를 지정하십시오. provider 블록에는 Terraform용 IBM Cloud® 제공자 플러그인에서 리소스를 프로비저닝하는 데 필요한 모든 입력 변수가 포함되어 있습니다.
IBM Cloud API 키
IBM Cloud API 키는 IBM Cloud 플랫폼에서 인증하는 데 필수적입니다. 또한 Schematics 에서 리소스의 API로 작업하고 사용자에게 부여된 권한을 확인하는 데 필요한 IAM 토큰 및 IAM 새로 고침 토큰도 필요합니다. 네이티브 Terraform을 사용하는 경우 항상 IBM Cloud API 키를 제공해야 합니다. Schematics에서 IBM Cloud Kubernetes Service 클러스터 등의 모든
IAM 사용 리소스와 VPC 인프라 리소스의 IAM 토큰을 검색합니다. 그러나 기존 인프라 리소스에 대해서는 IAM 토큰이 검색되지 않으며 API 키는 provider 블록에 제공해야 합니다.
provider 블록의 다른 IBM Cloud API 키
IBM Cloud 계정과 연관된 API 키와 다른 키를 사용하려면 provider 블록에 이 API 키를 제공할 수 있습니다. API 키가 provider 블록에 구성된 경우 이 키가 IBM Cloud에 저장된 API 키보다 우선합니다.
IBM Cloud 서비스 ID의 API 키
VPC 인프라 리소스를 포함하여 모든 IAM 사용 서비스에 사용하는 서비스 ID의 API 키를 제공할 수 있습니다. 기존 인프라 리소스에는 서비스 ID를 사용할 수 없습니다.
지침에 따라 provider 블록을 구성합니다.
-
provider블록을 구성하는 방법을 선택하십시오.- 옵션 1 별도의
provider.tf파일을 만듭니다. 이 파일의 정보는 Terraform 및 IBM Cloud Schematics를 통해 로드되며 동일한 GitHub 디렉토리 또는 테이프 아카이브 파일(.tar)에 있는 모든 Terraform 구성 파일에 적용됩니다. 이 접근 방식은 인프라 코드를 여러 파일에 분할하는 경우에 유용합니다. - 옵션 2 테라폼 구성 파일에
provider블록을 추가합니다. 원하는 경우 이 옵션을 선택하여 하나의 Terraform 구성 파일에서 변수 및 리소스와 함께 제공자를 지정할 수 있습니다.
- 옵션 1 별도의
-
리소스로 작업하기 위해
provider블록에 제공해야 하는 자격 증명 및 정보를 검토하세요. Schematics 은 IBM Cloud API 키를 자동으로 검색하므로provider블록에서 이 정보를 지정할 필요가 없습니다. -
provider.tf파일을 작성하거나 다음 코드를 Terraform 구성 파일에 추가하십시오.provider블록에서 설정할 수 있는 지원되는 매개변수의 전체 목록은 IBM Cloud 제공자 참조를 참조하십시오.VPC 인프라 리소스 예시
provider "ibm" { generation = 1 region = "<region_name>" }클래식 인프라 리소스의 예
variable "iaas_classic_username" { type = "string" } variable "iaas_classic_api_key" { type = "string" } provider "ibm" { region = "<region_name>" iaas_classic_username = var.iaas_classic_username iaas_classic_api_key = var.iaas_classic_api_key }모든 IBM Cloud Kubernetes Service 리소스에 대한 예시
provider "ibm" { }기타 모든 리소스에 대한 예
provider "ibm" { region = "<region_name>" }
resource 블록에 클라우드 리소스 추가
resource 블록을 사용하여 IBM Cloud Schematics 으로 관리할 클라우드 리소스를 정의합니다.
다중 클라우드 접근 방식을 지원하기 위해 Terraform은 다중 클라우드 제공자에서 작동합니다. 클라우드 제공자는 프로비저닝할 수 있는 리소스, 해당 API 및 클라우드에서 이러한 리소스를 노출하는 방법을 이해해야 합니다. 사용자가 이 지식을 사용할 수 있도록, 지원되는 모든 클라우드 제공자는 사용자가 리소스에 대해 작업하는 데 사용할 수 있는 Terraform용 명령행 플러그인을 제공해야 합니다. IBM Cloud에서 프로비저닝할 수 있는 리소스의 개요를 찾으려면 IBM Cloud Provider Plug-in for Terraform 참조서를 참조하십시오.
VPC 프로비저닝을 위한 인프라 코드 예시
resource ibm_is_vpc "vpc" {
name = "myvpc"
}
다른 리소스 블록에서 리소스 참조
Terraform 구성 파일의 다른 리소스 블록에 있는 기존 리소스를 참조해야 하는 옵션을 검토하십시오.
IBM Cloud 제공자 플러그인 참조에는 두 가지 유형의 오브젝트, 데이터 소스 및 리소스가 포함됩니다. 두 오브젝트를 모두 사용하여 다른 리소스 블록의 리소스를 참조할 수 있습니다.
-
리소스: 리소스를 작성하려면 IBM Cloud 제공자 플러그인 참조의 리소스 정의를 사용합니다. 리소스 정의에는 클라우드 리소스를 구성하기 위한 구문과 다른 리소스 블록에서 입력 매개변수로 참조할 수 있는 속성을 보여주는 속성 참조가 포함되어 있습니다. 예를 들어, VPC를 작성할 때 VPC의 ID가 작성 후 사용 가능하게 됩니다. VPC에 대한 서브넷을 작성할 때 ID를 입력 매개변수로 사용할 수 있습니다. 여러 리소스를 하나의 Terraform 구성 파일에 결합하는 경우 이 옵션을 사용하십시오.
인프라 코드의 예
resource ibm_is_vpc "vpc" { name = "myvpc" } resource ibm_is_security_group "sg1" { name = "mysecuritygroup" vpc = ibm_is_vpc.vpc.id } -
데이터 소스: IBM Cloud 제공자 플러그인 참조의 데이터 소스를 사용하여 기존 클라우드 리소스에 대한 정보를 검색할 수도 있습니다. IBM Cloud 제공자 플러그인 참조의 인수 참조 섹션을 검토하여 기존 리소스를 검색하기 위해 제공해야 하는 입력 매개변수를 확인하십시오. 그런 다음 속성 참조 섹션을 검토하여 사용자가 사용할 수 있고
resource블록에서 참조할 수 있는 매개변수의 개요를 찾으십시오. 다른 Terraform 구성 파일에서 구성된 리소스의 세부사항에 액세스하려는 경우에 이 옵션을 사용하십시오.인프라 코드의 예
data ibm_is_image "ubuntu" { name = "ubuntu-18.04-amd64" } resource ibm_is_instance "vsi1" { name = "$mysi" vpc = ibm_is_vpc.vpc.id zone = "us-south1" keys = [data.ibm_is_ssh_key.ssh_key_id.id] image = data.ibm_is_image.ubuntu.id profile = "cc1-2x4" primary_network_interface { subnet = ibm_is_subnet.subnet1.id security_groups = [ibm_is_security_group.sg1.id] } }
다른 계정의 리소스 관리
IBM Cloud 소스 계정의 작업 공간을 사용하여 대상 계정에서 리소스를 생성하는 Terraform 작업을 실행할 수 있습니다. 대상 계정에서 리소스를 프로비저닝하려면 대상 계정의 ID 및 액세스 권한을 제공해야 합니다. 이는 대상 계정에 대한 권한이 있는 사용자의 ID를 사용하는 방법일 수 있습니다. 또는 API 키를 사용하여 대상 계정에 대한 인증 및 적절한 교차 계정 권한이 있는 서비스 ID입니다.
API 키를 전달하지 않고 UI를 통해 작업을 실행하는 경우, 로그인한 사용자의 신원이 작업을 실행하는 데 사용됩니다.
variable 블록을 사용하여 리소스 사용자 정의
variable 블록을 사용하여 인프라 코드에 대한 템플리트를 작성할 수 있습니다. 예를 들어, 여러 데이터 센터에 배포하려는 리소스에 대해 여러 개의 Terraform 구성 파일을 만드는 대신, 여러 개의 데이터 센터에 배포할 수 있습니다. 입력 변수를 사용하여 동일한 구성을 재사용하여 데이터 센터를 정의하기만 하면 됩니다.
변수 저장
프로비저닝할 리소스를 지정하는 것과 동일한 Terraform 구성 파일 내에 변수를 선언하거나 모든 변수 선언을 포함하는 별도의 variables.tf 파일을 작성하도록 결정할 수 있습니다. 작업공간을 작성할 때 IBM Cloud Schematics에서 자동으로 Terraform 구성 파일을 구문 분석하여 변수 선언을 찾습니다.
변수 선언
입력 변수를 선언할 때 Terraform 버전에 따라 변수 이름과 데이터 유형을 제공해야 합니다. 선택적으로 변수의 기본값을 제공할 수 있습니다. 입력 변수를 Schematics 으로 가져오고 기본값을 지정한 경우 기본값을 덮어쓰도록 선택할 수 있습니다. \n IBM Cloud Schematics 는 기본 유형의 경우 값을 문자열로 받아들이며, bool, number, string,
복잡한 변수의 경우 HCL 형식을 사용합니다.
Terraform v1.5는 문자열, 목록, 맵,bool, 숫자 및 목록(유형), 맵(유형), 객체( {attribute name=type,.} ), 집합(유형), 튜플( [유형] )과 같은 복합 데이터 유형을 지원합니다.
입력 변수 제한
예. Terraform 구성 파일에 입력 변수를 정의하는 경우 해당 변수에 입력하는 값은 최대 2049자일 수 있습니다. 입력 변수에 이 한계를 초과하는 값이 필요하면 2049자 다음의 값이 잘립니다.
기본값이 없는 변수 선언 예시
variable "datacenter" {
type = "string"
description = "The data center that you want to deploy your Kubernetes cluster in."
}
기본값이 있는 변수 선언 예시
variable "datacenter" {
type = "string"
description = "The data center that you want to deploy your Kubernetes cluster in."
default = "dal10"
}
변수 참조
"${var.<variable_name>}" 구문을 사용하여 Terraform 구성 파일의 다른 블록에서 변수 값을 참조할 수 있습니다.
datacenter 변수를 참조하는 예제
resource ibm_container_cluster "test_cluster" {
name = "test"
datacenter = var.datacenter
}
더 빠른 개발을 위한 Terraform IBM 모듈 활용하기
선택 사항으로 Terraform IBM 모듈(TIM) 을 사용하여 템플릿을 만들 수 있습니다. 복잡한 인프라를 빠르게 구축하고, 리소스 종속성을 단순화하며, IBM Cloud 모범 사례를 적용하고, IBM Cloud 커뮤니티의 기여를 통해 발전합니다.
예시: TIM의 VPC 모듈 사용
module "vpc" {
source = "terraform-ibm-modules/vpc/ibm"
version = "1.1.0"
vpc_name = "my-production-vpc"
resource_group_id = "Default"
classic_access = false
default_address_prefix = "auto"
default_network_acl_name = "my-default-acl"
default_security_group_name = "my-default-sg"
default_routing_table_name = "my-default-rt"
}
사용 가능한 모듈을 살펴보세요:
선언된 변수에 대한 값을 IBM Cloud Schematics에 제공
템플릿에 선언된 변수에 대해 IBM Cloud Schematics 작업 공간을 생성한 후 테라폼 액션에 사용할 값을 제공할 수 있습니다.
-
UI의 경우 IBM Cloud > Schematics > 워크스페이스 > 설정 페이지에서 값을 입력할 수 있습니다.value필드는HCL파일에 제공된.tfvars형식 값입니다. -
CLI의 경우 복합 데이터 유형에 대한 값을 만들거나 업데이트하는 것을 볼 수 있습니다. 그런 다음 예시와 같이value필드에 변수 저장소에 대한 이스케이프 문자열을 포함해야 합니다. -
API의 경우template_data>variablestore필드에서 값을 생성하거나 업데이트할 수 있습니다.value필드는.tfvars파일에 제공된HCL형식의 값입니다. 이는 항상 모든 유형의 변수 유형에 적합한 JSON 문자열입니다.예
"variablestore": [ { "value": "[\n {\n internal = 800\n external = 83009\n protocol = \"tcp\"\n }\n ]", "description": "", "name": "docker_ports", "type": "list(object({\n internal = number\n external = number\n protocol = string\n }))" }, { "name": "worker_pool_labels", "type": "map(string)", "value": "{\n \"label-name1\": \"label-value1\",\n \"label-name2\": \"label-value2\"\n}" }, { "name": "docker_ports", "type": "list(object({\n internal = number\n external = number\n protocol = string\n }))", "value": "[\n {\n internal = 800\n external = 83009\n protocol = \"tcp\"\n }\n ]", "description": "" } ]
파일에서 복합 변수를 선언하는 방법을 볼 수 있습니까?
예. 변수를 선언하고 변수에 값을 지정할 때 UI에서 도구 팁을 볼 수 있습니다. 다음 표는 변수 저장소에서 선언할 수 있는 복합 데이터 유형의 몇 가지 예를 제공합니다.
| 유형 | 예 |
|---|---|
number |
4.56 |
string |
예제 값 |
bool |
아니오 |
map(string) |
{key1 = "value1", key2 = "value2"} |
set(string) |
["안녕하세요", "그"] |
map(number) |
{internal = 8080, external = 2020} |
list(string) |
["US-SOUTH", "EU-GB"] |
list |
["value", 30] |
list(list(string)) |
문자열 예제 목록을 참조하세요. |
list(object({internal = number external = number protocol = string})) |
개체 예제 목록을 참조하세요. |
문자열 목록의 예
[
"test", "env:prod", "env:agent:test"
]
오브젝트 목록의 예
[
{
internal = 8300
external = 8300
protocol = "tcp"
},
{
internal = 8301
external = 8301
protocol = "ldp"
}
]
Terraform 템플리트 저장
Terraform 구성 파일에는 일반 코드로 처리해야 하는 인프라 코드가 포함되어 있습니다. 공동 작업, 소스 및 버전 관리를 지원하려면 GitHub 또는 GitLab 리포지토리에 파일을 저장하세요. 버전 제어를 사용하면 이전 버전으로 되돌리고 변경사항을 감사하며 여러 팀과 코드를 공유할 수 있습니다. GitHub, 에 파일을 저장하고 싶지 않다면 대신 로컬 컴퓨터에서 테이프 아카이브 파일 또는 .tar 을 업로드하여 템플릿을 제공하세요. 복제를 원하는 경우 복제를 위해 허용된 파일 확장명과 차단된 파일 확장명을 참조하세요.
GitHub 저장소에 있는 Terraform 템플리트의 디렉토리 구조는 최신 업데이트 시간과 함께 표에 나열됩니다.
| 파일 | 설명 |
|---|---|
| README.md | README.md 작성 |
main.tf |
main.tf 작성 |
output.tf |
output.tf 작성 |
provider.tf |
provider.tf 작성 |
variables.tf |
variables.tf 작성 |
테라폼 솔루션 샘플
다양한 솔루션이 함께 사용될 때 IBM Cloud® Schematics 및 IBM Cloud® 서비스의 강점을 보여줍니다. 이러한 솔루션은 단순 Terraform 템플리트 또는 모듈을 사용하여 인프라를 설정합니다. 각 솔루션이 특정 유스 케이스의 관점을 통해 제시된다고 하더라도 이러한 인프라는 다양한 산업 전반에서 일반적입니다.
IBM Cloud Schematics을(를) 통해 공개된 Terraform 솔루션 템플리트를 사용하여 인프라를 작성하고, 리소스를 관리하고, 강력한 도구를 사용하여 작업공간과 조치를 보호하고 관리하고 모니터합니다.