Provisioning di un'istanza di IBM Cloud Logs utilizzando Terraform
Terraform su IBM Cloud® consente un provisioning prevedibile e coerente dei servizi IBM Cloud in modo da poter costruire rapidamente ambienti cloud complessi e multitier che seguono i principi di Infrastructure as Code ( IaC ). Analogamente all'uso della CLI o dell'API e degli SDK di IBM Cloud, è possibile automatizzare il provisioning, l'aggiornamento e l'eliminazione delle istanze di IBM Cloud Logs utilizzando HashiCorp Configuration Language (HCL).
Per le distribuzioni di produzione, considerare l'utilizzo di Terraform IBM Modules(TIM) per IBM Cloud Logs che forniscono configurazioni precostituite, open-source e pronte per l'impresa secondo le migliori pratiche di IBM Cloud.
I moduli TIM semplificano le implementazioni complesse, garantiscono la coerenza tra gli ambienti e riducono gli errori di configurazione. Esplorare il registro Terraform IBM Modules(TIM) per i moduli disponibili.
Cercate una soluzione Terraform gestita su IBM Cloud? Prova IBM Cloud® Schematics. Con Schematics, puoi utilizzare il linguaggio di script Terraform che ti è familiare, ma non devi preoccuparti di configurare e mantenere la riga di comando Terraform e il plug-in del provider IBM Cloud. Schematics fornisce anche i template Terraform predefiniti che puoi installare dal catalogo IBM Cloud.
Prerequisiti
- Prima di iniziare, assicurarsi di avere l'accesso necessario per creare e lavorare con le risorse IBM Cloud Logs.
- Installare la CLI di Terraform.
Installa la CLI Terraform
Completare i seguenti passaggi per installare la CLI di Terraform:
-
Crea una cartella terraform sulla tua macchina locale e passa alla tua cartella terraform.
mkdir terraform && cd terraform -
Scarica la versione di Terraform che desideri. Ad esempio, è possibile scaricare
terraform_1.12.2_darwin_amd64.zipper un sito MacOS. Vedere Installazione di Terraform. -
Estrarre il file zip Terraform e copiare i file nella directory terraform. Esegui questi comandi:
chmod +x terraformsudo mv terraform /usr/local/bin/ -
Verificare che l'installazione sia avvenuta con successo utilizzando un comando terraform per confermare la versione.
terraform --version
Impostare la directory di lavoro di Terraform
Creare una cartella e navigare al suo interno. Questa cartella viene utilizzata per memorizzare tutti i file di configurazione e le definizioni delle variabili necessarie per creare l'istanza di IBM Cloud Logs.
Ad esempio, nella directory di lavoro di Terraform <terraform-working-directory>/terraform, creare la directory myproject.
mkdir myproject && cd myproject
Configurare il plug-in IBM Cloud Provider
Dopo aver completato l'installazione di Terraform CLI, è necessario configurare il plug-in IBM Cloud Provider per Terraform, in modo da poter iniziare a lavorare con le risorse e i servizi in IBM Cloud.
Per un elenco delle versioni supportate, consultare le release del plug-in IBM Cloud Provider.
Assicurarsi di utilizzare l'ultima release del plug-in IBM Cloud Provider.
Creare un file versions.tf e specificare la versione del plug-in IBM Cloud Provider che si desidera utilizzare con il parametro version.
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
version = "<provider version>"
}
}
}
Ad esempio:
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
version = ">=1.80.0"
}
}
}
Configura il plug-in del provider IBM Cloud
Una volta completata la configurazione, è necessario configurare il plug-in IBM Cloud Provider.
Prima di iniziare a utilizzare Terraform su IBM Cloud, devi richiamare le credenziali e i parametri richiesti per un'origine dati o una risorsa Terraform e specificarli nella configurazione provider. Questa configurazione viene
utilizzata dal plug-in del provider IBM Cloud per l'autenticazione con la piattaforma IBM Cloud e per visualizzare, creare, aggiornare o eliminare le risorse e i servizi IBM Cloud.
La seguente tabella elenca i parametri di input che puoi impostare nel blocco provider del tuo Terraform sul file di configurazione IBM Cloud:
| Parametro di input | Obbligatorio / facoltativo | Descrizione |
|---|---|---|
ibmcloud_api_key |
Obbligatorio | La chiave API IBM Cloud per l'autenticazione con la piattaforma IBM Cloud. Per ulteriori informazioni, su come creare una chiave API, vedi Creazione di una chiave API.
Puoi specificare la chiave API nel blocco provider o richiamare il valore dalle variabili di ambiente IC_API_KEY o IBMCLOUD_API_KEY. Se sono definite entrambe le variabili di ambiente, IC_API_KEY ha la precedenza. |
ibmcloud_timeout |
Facoltativo | Il numero di secondi che vuoi attendere prima che l'API IBM Cloud venga considerata non disponibile. Il valore predefinito è 60. È possibile specificare il valore di timeout nel blocco provider o richiamare il
valore dalle variabili di ambiente IC_TIMEOUT o IBMCLOUD_TIMEOUT. Se vengono specificate entrambe le variabili, IC_TIMEOUT ha la precedenza. |
region |
Facoltativo | La regione IBM Cloud in cui vuoi creare le tue risorse. Se questo valore non viene specificato, per impostazione predefinita viene utilizzato us-south. Puoi specificare la regione nel blocco provider o richiamare
il valore dalle variabili di ambiente IBMCLOUD_REGION o IC_REGION. Se vengono specificate entrambe le variabili di ambiente, IC_REGION ha la precedenza. |
resource_group |
Facoltativo | L'ID del gruppo di risorse che vuoi utilizzare per le tue risorse IBM Cloud. Per recuperare l'ID, eseguire ibmcloud resource groups. Puoi specificare il gruppo di risorse nel blocco provider o richiamare il valore
dalle variabili di ambiente IC_RESOURCE_GROUP o IBMCLOUD_RESOURCE_GROUP. Se sono definite entrambe le variabili di ambiente, IC_RESOURCE_GROUP ha la precedenza. |
Per ulteriori informazioni sull'uso delle variabili d'ambiente, vedere Uso delle variabili d'ambiente.
Configurare le variabili di input nel file terraform.tfvars
È possibile memorizzare le informazioni in un file locale di terraform.tfvars e fare riferimento a questi dati nel blocco provider.
Non eseguire il commit di terraform.tfvars in un repository di origine pubblico. Questo file deve essere memorizzato solo sul computer locale.
Nella directory del progetto <terraform-directory>/terraform/myproject, creare un file terraform.tfvars sul computer locale e aggiungere i parametri di input richiesti per la risorsa o l'origine dati.
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"
Dichiarare le variabili nel file variables.tf
Nella directory del progetto <terraform-directory>/terraform/myproject, creare un file di variabili denominato variables.tf per includere i valori predefiniti.
Il seguente esempio elenca le variabili che possono essere utilizzate quando si esegue il provisioning di un'istanza di 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"
}
Variabili di riferimento nel file provider.tf
Nella cartella del progetto <terraform-directory>/terraform/myproject, creare un file provider.tf e utilizzare la sintassi di interpolazione di Terraform per fare riferimento alle variabili di terraform.tfvars.
variable "ibmcloud_api_key" {}
variable "region" {}
provider "ibm" {
ibmcloud_api_key = var.ibmcloud_api_key
region = var.region
}
Creare i file di configurazione di Terraform per fornire un'istanza di IBM Cloud Logs
Quindi, creare i seguenti file:
-
data-bucket.tf: Contiene la definizione della risorsa Terraform per creare un bucket per memorizzare i dati di log.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: Contiene la definizione della risorsa Terraform per creare un bucket per memorizzare le metriche raccolte dai dati di log.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: Contiene la definizione della risorsa Terraform per creare l'istanza IBM Cloud Logs e collegare il bucket dei dati e il bucket delle metriche.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: Contiene la definizione della risorsa Terraform per creare le autorizzazioni da servizio a servizio tra l'istanza IBM Cloud Logs e i bucket.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: Contiene la definizione della risorsa Terraform per creare un'integrazione in uscita tra l'istanza IBM Cloud Logs e l'istanza IBM Cloud Event Notifications attraverso la quale si inviano le notifiche alle proprie destinazioni, come Slack o la posta elettronica.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: Contiene la definizione della risorsa Terraform per creare l'autorizzazione tra l'istanza IBM Cloud Logs e l'istanza 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" }
Per ulteriori informazioni su come utilizzare Terraform per le risorse di IBM Cloud, vedere ibm_resource_instance
Provisioning dell'istanza IBM Cloud Logs utilizzando Terraform IBM Moduli
In alternativa al punto 4, è possibile eseguire il provisioning di IBM Cloud Logs utilizzando Terraform IBM Modules (TIM). Se scegliete questo approccio basato sui moduli, saltate il passaggio 4 e passate direttamente alle risorse di provisioning.
-
Creare un file
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 } -
Opzionale: se si desidera parametrizzare la configurazione, definire le variabili di ingresso. Ad esempio, creare un file
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" }
Per la documentazione completa del modulo e le opzioni di configurazione avanzate, consultare il modulo IBM Cloud Logs.
Si può anche fare riferimento a questa documentazione per la distribuzione dei moduli Terraform IBM utilizzando la CLI di Terraform.
Esegui provisioning delle risorse
Completa i seguenti passi:
-
Inizializza la CLI Terraform.
../terraform initViene visualizzato il seguente messaggio:
Terraform has been successfully initialized!. -
Creare un piano di esecuzione Terraform. Il piano di esecuzione Terraform riepiloga tutte le azioni che devono essere eseguite per creare nel tuo account l'istanza IBM Cloud Logs, la chiave della risorsa e la politica di accesso IAM.
../terraform plan -
Creare le risorse.
../terraform applyPer eliminare le risorse, eseguire
./terraform destroy.
Operazioni successive
Verificare che le risorse siano state create. Avviare l'interfaccia utente di Observability e verificare che l'istanza sia stata creata.
È possibile esplorare tutti i moduli per configurazioni pronte per la produzione: