Terraform을 사용하여 IBM Cloud Logs 인스턴스 프로비저닝하기
IBM Cloud®의 Terraform은 IaC(Infrastructure as Code) 프린시펄을 준수하는 복잡한 멀티티어 클라우드 환경을 신속하게 빌드할 수 있도록 IBM Cloud 서비스의 예측 가능하고 일관성 있는 프로비저닝을 가능하게 해줍니다. IBM Cloud CLI 또는 API 및 SDK를 사용하는 경우와 마찬가지로 HCL(HashiCorp Configuration Language)을 사용하여 IBM Cloud Logs 인스턴스의 프로비저닝, 업데이트 및 삭제를 자동화할 수 있습니다.
프로덕션 배포의 경우, Terraform IBM 모듈(TIM) 을 사용하는 것이 좋습니다. IBM Cloud LogsIBM Cloud 모범 사례에 따라 사전 구축된 오픈 소스 및 엔터프라이즈 지원 구성을 제공합니다.
TIM 모듈은 복잡한 배포를 간소화하고, 환경 전반의 일관성을 보장하며, 구성 오류를 줄여줍니다. 사용 가능한 모듈은 Terraform IBM 모듈(TIM)레지스트리를 살펴보세요.
IBM Cloud 솔루션에서 관리되는 Terraform을 찾으십니까? IBM Cloud® Schematics을 사용해 보십시오. Schematics를 사용하면 익숙한 Terraform 스크립팅 언어를 사용할 수 있지만 Terraform 명령행 및 IBM Cloud 제공자 플러그인을 설정하고 유지보수하는 것을 걱정할 필요가 없습니다. Schematics에서는 IBM Cloud 카탈로그에서 설치할 수 있는 사전 정의된 Terraform 템플리트도 제공합니다.
전제조건
- 시작하기 전에 IBM Cloud Logs 리소스를 만들고 작업하는 데 필요한 액세스 권한이 있는지 확인하세요.
- Terraform CLI를 설치합니다.
Terraform CLI 설치
Terraform CLI를 설치하려면 다음 단계를 완료하십시오.
-
로컬 머신에서 terraform 폴더를 작성하고 terraform 폴더로 이동하십시오.
mkdir terraform && cd terraform -
원하는 Terraform 버전을 다운로드하십시오.
terraform_1.12.2_darwin_amd64.zip예를 들어 MacOS. 테라폼 설치를 참조하세요. -
Terraform zip 파일을 추출하고 파일을 terraform 디렉토리에 복사하십시오. 다음 명령을 실행하십시오.
chmod +x terraformsudo mv terraform /usr/local/bin/ -
테라폼 명령을 사용하여 버전을 확인하여 설치가 성공했는지 확인합니다.
terraform --version
Terraform 작업 디렉토리 설정
폴더를 만들고 폴더로 이동합니다. 이 폴더는 IBM Cloud Logs 인스턴스를 만드는 데 필요한 모든 구성 파일과 변수 정의를 저장하는 데 사용됩니다.
예를 들어, Terraform 작업 디렉터리 <terraform-working-directory>/terraform 에서 myproject 디렉터리를 생성합니다.
mkdir myproject && cd myproject
IBM Cloud 제공자 플러그인 설정
Terraform CLI 설치가 완료된 후에는 IBM Cloud에서 리소스 및 서비스에 대한 작업을 시작할 수 있도록 Terraform용 IBM Cloud 제공자 플러그인을 설정해야 합니다.
지원되는 버전 목록은 IBM Cloud 공급자 플러그인 릴리스를 참조하세요.
최신 IBM Cloud 제공자 플러그인 릴리스를 사용해야 합니다.
versions.tf 파일을 작성하고 version 매개변수와 함께 사용할 IBM Cloud 제공자 플러그인 버전을 지정하십시오.
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
version = "<provider version>"
}
}
}
예를 들어, 다음과 같습니다.
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
version = ">=1.80.0"
}
}
}
IBM Cloud 제공자 플러그인 구성
설정을 완료한 후 IBM Cloud 제공자 플러그인을 구성해야 합니다.
IBM Cloud에서 Terraform에 대한 작업을 시작하려면 Terraform 리소스 또는 데이터 소스에 필요한 인증 정보 및 매개변수를 검색하고 provider 구성에서 이를 지정해야 합니다. 이 구성은 IBM Cloud 플랫폼을 인증하고 IBM Cloud 리소스 및 서비스를 보거나 작성하거나 업데이트하거나 삭제하기 위해 IBM Cloud 제공자 플러그인에서 사용합니다.
다음 표에는 IBM Cloud 구성 파일에서 Terraform의 provider 블록에서 설정할 수 있는 입력 매개변수가 나열되어 있습니다.
| 입력 매개변수 | 필수/선택사항 | 설명 |
|---|---|---|
ibmcloud_api_key |
필수 | IBM Cloud 플랫폼을 인증하기 위한 IBM Cloud API 키입니다. API 키를 작성하는 방법에 대한 자세한 정보는 API 키 작성을 참조하십시오. provider 블록에 API 키를 지정하거나 IC_API_KEY 또는
IBMCLOUD_API_KEY 환경 변수에서 값을 검색할 수 있습니다. 두 환경 변수가 모두 정의된 경우 IC_API_KEY가 우선합니다. |
ibmcloud_timeout |
선택사항 | IBM Cloud API가 사용 불가능하다고 간주될 때까지 대기할 시간(초)입니다. 기본값은 60입니다. provider 블록에 제한시간을 지정하거나 IC_TIMEOUT 또는 IBMCLOUD_TIMEOUT 환경 변수에서 값을 검색할 수 있습니다. 두 변수가 모두 지정된 경우 IC_TIMEOUT이 우선합니다. |
region |
선택사항 | 리소스를 작성할 IBM Cloud 지역입니다. 이 값이 지정되지 않으면 기본적으로 us-south가 사용됩니다. provider 블록에 지역을 지정하거나 IBMCLOUD_REGION 또는 IC_REGION 환경 변수에서 값을 검색할 수 있습니다. 두 환경 변수가 모두 지정된 경우 IC_REGION이 우선합니다. |
resource_group |
선택사항 | IBM Cloud 리소스에 사용할 리소스 그룹의 ID입니다. ID를 검색하려면 ibmcloud resource groups를 실행하십시오. provider 블록에 리소스 그룹을 지정하거나 IC_RESOURCE_GROUP 또는 IBMCLOUD_RESOURCE_GROUP 환경 변수에서 값을 검색할 수 있습니다. 두 환경 변수가 모두
정의된 경우 IC_RESOURCE_GROUP이 우선합니다. |
환경 변수 사용 방법에 대한 자세한 내용은 환경 변수 사용하기를 참조하세요.
terraform.tfvars 파일에서 입력 변수 구성
로컬 terraform.tfvars 파일에 정보를 저장하고 provider 블록에서 이 데이터를 참조할 수 있습니다.
terraform.tfvars를 공용 소스 저장소에 커미트하지 마십시오. 이 파일은 로컬 컴퓨터에만 저장해야 합니다.
프로젝트 디렉터리 <terraform-directory>/terraform/myproject 에서 로컬 컴퓨터에 terraform.tfvars 파일을 만들고 리소스 또는 데이터 소스에 필요한 입력 매개변수를 추가합니다.
ibmcloud_api_key = "<ibmcloud_api_key>"
region = "region"
account_id = "<Account ID>"
rg_id = "d7c0e937c529461f90a19e1421f9746d"
plan = "standard"
cos_instance_crn = "crn:v1:bluemix:public:cloud-object-storage:global:a/<Account ID>:<COS instance ID>::"
cos_storage_class = "standard"
cos_bucket_data_name = "cloud-logs-tf-data"
cos_bucket_metrics_name = "cloud-logs-tf-metrics"
event_notifications_crn = "crn:v1:bluemix:public:event-notifications:eu-gb:a/<Account ID>:<Event Notifications instance ID>::"
event_notifications_instance_id = "<Event Notifications instance ID>"
event_notifications_region = "eu-gb"
variables.tf 파일에 변수를 선언합니다
프로젝트 디렉터리 <terraform-directory>/terraform/myproject 에서 기본값을 포함하도록 variables.tf 이라는 이름의 변수 파일을 만듭니다.
다음 샘플에는 IBM Cloud Logs 인스턴스를 프로비저닝할 때 사용할 수 있는 변수가 나열되어 있습니다:
variable "ibm_region" {
description = "Region to create resources. To see the list of valid regions, see https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-regions."
type = string
default = "eu-gb"
}
variable "resource_group_name" {
type = string
description = "Resource group where resources are created"
default = "Default"
}
variable "rg_id" {
type = string
description = "Resource group ID where resources are created"
default = "b302120431c4456097f8970d80b93dfb"
}
variable "plan" {
type = string
description = "Service plan for Cloud Logs instances"
default = "standard"
}
variable "cos_instance_crn" {
type = string
description = "COS instance CRN where buckets are created"
default = "crn:v1:bluemix:public:cloud-object-storage:global:a/<Account ID>:<COS instance ID>::"
}
variable "cos_storage_class" {
type = string
description = "COS instance storage class"
default = "standard"
}
variable "account_id" {
type = string
description = "Account where resources are created"
default = "<Account ID>"
}
variable "cos_bucket_data_name" {
type = string
description = "Cloud Object Storage bucket data name"
default = "cloud-logs-tf-data"
}
variable "cos_bucket_metrics_name" {
type = string
description = "Cloud Object Storage bucket data name"
default = "cloud-logs-tf-metrics"
}
variable "event_notifications_crn" {
type = string
description = "Event Notifications CRN"
default = "crn:v1:bluemix:public:event-notifications:eu-gb:a/<Account ID>:<Event Notifications Instance ID>::"
}
variable "event_notifications_instance_id" {
type = string
description = "Event Notifications instance ID"
default = "<Event Notifications Instance ID>"
}
variable "event_notifications_region" {
type = string
description = "Event notifications region"
default = "eu-gb"
}
provider.tf 파일의 참조 변수
프로젝트 디렉토리 <terraform-directory>/terraform/myproject 에서 provider.tf 파일을 생성하고 Terraform 보간 구문을 사용하여 terraform.tfvars 에서 변수를 참조합니다.
variable "ibmcloud_api_key" {}
variable "region" {}
provider "ibm" {
ibmcloud_api_key = var.ibmcloud_api_key
region = var.region
}
테라폼 구성 파일을 생성하여 다음 인스턴스를 프로비저닝합니다 IBM Cloud Logs
다음으로 다음 파일을 만듭니다:
-
data-bucket.tf: 로그 데이터를 저장할 버킷을 생성하기 위한 Terraform 리소스 정의가 포함되어 있습니다.resource "ibm_cos_bucket" "data_bucket" { bucket_name = var.cos_bucket_data_name resource_instance_id = var.cos_instance_crn region_location = var.region storage_class = var.cos_storage_class } -
metrics-bucket.tf: 로그 데이터에서 수집한 메트릭을 저장할 버킷을 생성하기 위한 Terraform 리소스 정의가 포함되어 있습니다.resource "ibm_cos_bucket" "metrics_bucket" { bucket_name = var.cos_bucket_metrics_name resource_instance_id = var.cos_instance_crn region_location = var.region storage_class = var.cos_storage_class } -
main.tf: IBM Cloud Logs 인스턴스를 생성하고 데이터 버킷과 메트릭 버킷을 연결하기 위한 Terraform 리소스 정의가 포함되어 있습니다.data "ibm_resource_group" "group" { name = "marisa" } resource "ibm_resource_instance" "cloud_logs_instance" { name = "cloud-logs-via-tf" service = "logs" plan = var.plan location = var.region resource_group_id = data.ibm_resource_group.group.id parameters = { retention_period = "7" } } resource "null_resource" "update_instance_parameters" { triggers = { instance_id = ibm_resource_instance.cloud_logs_instance.id } provisioner "local-exec" { command = <<EOT ibmcloud login --apikey=$IC_API_KEY ibmcloud resource service-instance-update ${ibm_resource_instance.cloud_logs_instance.guid} -p '{"logs_bucket_crn": "${ibm_cos_bucket.data_bucket.crn}", "logs_bucket_endpoint": "${ibm_cos_bucket.data_bucket.s3_endpoint_direct}", "metrics_bucket_crn": "${ibm_cos_bucket.metrics_bucket.crn}","metrics_bucket_endpoint": "${ibm_cos_bucket.metrics_bucket.s3_endpoint_direct}"}' EOT } depends_on = [ibm_iam_authorization_policy.policy-cl-data-bucket,ibm_iam_authorization_policy.policy-cl-metrics-bucket] } -
en_s2s.tf: IBM Cloud Logs 인스턴스와 버킷 간의 서비스 대 서비스 권한을 생성하기 위한 Terraform 리소스 정의가 포함되어 있습니다.locals { cos_instance_id = split(":", ibm_cos_bucket.data_bucket.resource_instance_id)[7] } resource "ibm_iam_authorization_policy" "policy-cl-data-bucket" { source_service_name = "logs" source_resource_instance_id = ibm_resource_instance.cloud_logs_instance.guid roles = ["Writer"] resource_attributes { name = "serviceName" value = "cloud-object-storage" } resource_attributes { name = "serviceInstance" value = local.cos_instance_id operator = "stringEquals" } resource_attributes { name = "resourceType" value = "bucket" operator = "stringEquals" } resource_attributes { name = "resource" value = ibm_cos_bucket.data_bucket.bucket_name operator = "stringEquals" } resource_attributes { name = "accountId" value = var.account_id } } resource "ibm_iam_authorization_policy" "policy-cl-metrics-bucket" { source_service_name = "logs" source_resource_instance_id = ibm_resource_instance.cloud_logs_instance.guid roles = ["Writer"] resource_attributes { name = "serviceName" value = "cloud-object-storage" } resource_attributes { name = "serviceInstance" value = local.cos_instance_id operator = "stringEquals" } resource_attributes { name = "resourceType" value = "bucket" operator = "stringEquals" } resource_attributes { name = "resource" value = ibm_cos_bucket.metrics_bucket.bucket_name operator = "stringEquals" } resource_attributes { name = "accountId" value = var.account_id } } -
event-notification-extension.tf: IBM Cloud Logs 인스턴스와 IBM Cloud Event Notifications 인스턴스 간에 아웃바운드 통합을 생성하여 Slack 또는 이메일 등의 대상에게 알림을 보내는 Terraform 리소스 정의를 포함합니다.resource "ibm_logs_outgoing_webhook" "logs_outgoing_webhook_instance" { instance_id = ibm_resource_instance.cloud_logs_instance.guid region = ibm_resource_instance.cloud_logs_instance.location name = "Event-notification-cloud-logs-instance" type = "ibm_event_notifications" ibm_event_notifications { event_notifications_instance_id = var.event_notifications_instance_id region_id = var.event_notifications_region } depends_on = [ibm_iam_authorization_policy.policy-event-notifications] } -
s2s.tf: IBM Cloud Logs 인스턴스와 IBM Cloud Event Notifications 인스턴스 간의 권한을 생성하기 위한 테라폼 리소스 정의를 포함합니다.resource "ibm_iam_authorization_policy" "policy-event-notifications" { source_service_name = "logs" source_resource_instance_id = ibm_resource_instance.cloud_logs_instance.guid roles = ["Reader","Event Source Manager","Viewer"] description = "" target_service_name = "event-notifications" }
IBM Cloud 리소스에 Terraform을 사용하는 방법에 대한 자세한 내용은 ibm_resource_instance를 참조하세요
Terraform IBM 모듈을 사용하여 IBM Cloud Logs 인스턴스 프로비저닝하기
4단계의 대안으로, Terraform IBM 모듈(TIM)을 사용하여 IBM Cloud Logs 프로비저닝할 수 있습니다. 이 모듈 기반 접근 방식을 선택하는 경우 4단계를 건너뛰고 바로 리소스 프로비저닝으로 진행하세요.
-
main.tf파일을 만듭니다:module "cloud_logs" { source = "terraform-ibm-modules/cloud-logs/ibm" version = "latest" # Replace "latest" with a release version to lock into a specific release resource_group_id = var.resource_group_id region = var.region instance_name = "my-cloud-logs-instance" plan = "standard" resource_tags = ["env:production", "team:devops"] } output "cloud_logs_instance_guid" { value = module.cloud_logs.guid } -
선택 사항: 구성을 매개변수화하려면 입력 변수를 정의하세요. 예를 들어
variables.tf파일을 만듭니다:variable "resource_group_id" { description = "Resource group ID for the Cloud Logs instance" type = string } variable "region" { description = "Region where the Cloud Logs instance will be created" type = string default = "us-south" }
전체 모듈 설명서 및 고급 구성 옵션은 IBM Cloud Logs 모듈을 참조하세요.
이 문서를 참조하여 Terraform IBM Terraform CLI를 사용한 모듈 배포를 확인할 수도 있습니다.
리소스 프로비저닝
다음 단계를 완료하십시오.
-
Terraform CLI를 초기화하십시오.
../terraform initTerraform has been successfully initialized!메시지가 표시되어야 합니다. -
Terraform 실행 플랜을 작성하십시오. Terraform 실행 플랜은 계정에 IBM Cloud Logs 인스턴스, 리소스 키 및 IAM 액세스 정책을 작성하기 위해 실행해야 하는 모든 조치를 요약한 것입니다.
../terraform plan -
리소스를 작성하십시오.
../terraform apply리소스를 삭제하려면
./terraform destroy를 실행하십시오.
다음에 수행할 작업
리소스가 작성되었는지 확인하십시오. Observability UI를 실행하고 인스턴스가 생성되었는지 확인합니다.
프로덕션에 바로 사용할 수 있는 구성을 위해 모든 모듈을 탐색할 수 있습니다: