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:

  1. Crea una cartella terraform sulla tua macchina locale e passa alla tua cartella terraform.

    mkdir terraform && cd terraform
    
  2. Scarica la versione di Terraform che desideri. Ad esempio, è possibile scaricare terraform_1.12.2_darwin_amd64.zip per un sito MacOS. Vedere Installazione di Terraform.

  3. Estrarre il file zip Terraform e copiare i file nella directory terraform. Esegui questi comandi:

    chmod +x terraform
    
    sudo mv terraform /usr/local/bin/
    
  4. 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:

Elenco dei parametri di input che si possono impostare nel blocco provider di Terraform
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.

  1. 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
    }
    
  2. 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:

  1. Inizializza la CLI Terraform.

    ../terraform init
    

    Viene visualizzato il seguente messaggio: Terraform has been successfully initialized!.

  2. 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
    
  3. Creare le risorse.

    ../terraform apply
    

    Per 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: