使用 Terraform 佈建 IBM Cloud Logs 實例
IBM Cloud® 上的 Terraform 可實現 IBM Cloud 服務的可預測性和一致性配置,因此您可以快速建立複雜的多層雲環境,並遵循基礎設施即代碼 ( IaC ) 原則。 與使用 IBM Cloud CLI 或 API 和 SDK 相似,您可以使用 HashiCorp Configuration Language (HCL) 自動配置、更新和刪除 IBM Cloud Logs 實例。
對於生產部署,請考慮使用 Terraform IBM Modules(TIM)。IBM Cloud Logs,它提供預先建立、開放源碼和企業就緒的配置,遵循 IBM Cloud 最佳實踐。
TIM 模組可簡化複雜的部署、確保跨環境的一致性,並減少組態錯誤。 探索 Terraform IBM Modules(TIM)登錄可用模組。
正在尋找受管理的 Terraform on IBM Cloud 解決方案? 嘗試 IBM Cloud® Schematics. 透過 Schematics,您可以使用熟悉的 Terraform 指令碼語言,但不需要擔心設定和維護 Terraform 指令行和 IBM Cloud Provider 外掛程式。Schematics 也提供預先定義的 Terraform 模版,您可以從 IBM Cloud 目錄中安裝。
先決條件
- 在開始之前,請確定您擁有建立和使用 IBM Cloud Logs 資源 所需的存取權限。
- 安裝 Terraform CLI。
安裝 Terraform CLI
完成以下步驟安裝 Terraform CLI:
-
在本端機器上建立 Terraform 資料夾,並導覽至 Terraform 資料夾。
mkdir terraform && cd terraform -
下載您想要的 Terraform 版本。 例如,您可以下載 MacOS 的
terraform_1.12.2_darwin_amd64.zip。 請參閱 安裝 Terraform。 -
解壓縮 Terraform zip 檔案並將檔案複製到 Terraform 目錄。 執行下列指令:
chmod +x terraformsudo mv terraform /usr/local/bin/ -
使用 terraform 指令確認版本,以確認安裝成功。
terraform --version
設定 Terraform 工作目錄
建立資料夾,並導航至資料夾。 此資料夾用於儲存建立 IBM Cloud Logs 範例所需的所有組態檔案和變數定義。
例如,在您的 Terraform 工作目錄 <terraform-working-directory>/terraform 中,建立目錄 myproject。
mkdir myproject && cd myproject
設定 IBM Cloud Provider 外掛程式
Terraform CLI 安裝完成後,您必須為 Terraform 設定 IBM Cloud Provider 外掛程式,才能開始在 IBM Cloud 中處理資源和服務。
如需支援版本的清單,請參閱 IBM Cloud Provider 外掛程式版本。
請確定您使用最新的 IBM Cloud Provider 外掛程式版本。
建立 versions.tf 檔案,並使用 version 參數指定要使用的 IBM Cloud Provider 外掛程式版本。
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 提供者外掛程式。
您必須先擷取 Terraform 資源或資料來源所需的認證和參數,並在 provider 配置中指定它們,然後才能在 IBM Cloud上開始使用 Terraform。 IBM Cloud 提供者外掛程式使用此配置向 IBM Cloud 平台進行鑑別,以及檢視、建立、更新或刪除 IBM Cloud 資源和服務。
下表列出您可以在 IBM Cloud 配置檔上 Terraform 的 provider 區塊中設定的輸入參數:
| 輸入參數 | 必要/選用 | 說明 |
|---|---|---|
ibmcloud_api_key |
必要 | IBM Cloud API 金鑰,用於向 IBM Cloud 平台進行鑑別。 如需如何建立 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
}
建立 Terraform 設定檔案,以提供 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:包含 Terraform 資源定義,用於建立 IBM Cloud Logs 實例,並附加資料桶和度量資料桶。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:包含 Terraform 資源定義,用於在 IBM Cloud Logs 實例和儲存桶之間建立服務對服務授權。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:包含 Terraform 資源定義,用於在 IBM Cloud Logs 實例和 IBM Cloud Event Notifications 實例之間建立向外整合,您可透過該整合將通知傳送至您的目的地,例如 Slack 或電子郵件。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:包含 Terraform 資源定義,用於建立 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" }
有關如何使用 Terraform 來取得 IBM Cloud 資源的其他資訊,請參閱 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 CLI 部署 Terraform IBM 模組。
佈建資源
請完成下列步驟:
-
起始設定 Terraform CLI。
../terraform init您應該會看到下列訊息:
Terraform has been successfully initialized!。 -
建立 Terraform 執行計劃。 Terraform 執行計劃彙總需要執行以在帳戶中建立 IBM Cloud Logs 實例、資源金鑰及 IAM 存取原則的所有動作。
../terraform plan -
建立資源。
../terraform apply若要刪除資源,請執行
./terraform destroy。
下一步為何?
驗證已建立資源。 啟動 Observability UI 並檢查實體是否已建立。
您可以探索所有模組的生產就緒配置: