Bereitstellung einer IBM Cloud Logs-Instanz mithilfe von Terraform

Terraform on IBM Cloud® ermöglicht die vorhersehbare und konsistente Bereitstellung von IBM Cloud-Services, damit Sie schnell komplexe, mehrschichtige Cloudumgebungen erstellen können, die den IaC-Prinzipien (Infrastructure as Code-Code) folgen. Ähnlich wie bei der Verwendung von IBM Cloud CLI oder API und SDKs können Sie die Bereitstellung, Aktualisierung und Löschung Ihrer IBM Cloud Logs Instanzen mithilfe von HashiCorp Configuration Language (HCL) automatisieren.

Für den produktiven Einsatz sollten Sie Terraform IBM Module(TIM) für IBM Cloud Logs zu verwenden, die vorgefertigte, quelloffene und unternehmenstaugliche Konfigurationen gemäß den Best Practices von IBM Cloud bereitstellen.

TIM-Module vereinfachen komplexe Implementierungen, gewährleisten Konsistenz in verschiedenen Umgebungen und reduzieren Konfigurationsfehler. Durchsuchen Sie die Terraform IBM Modules(TIM)-Registry nach verfügbaren Modulen.

Sie suchen eine verwaltete Terraform on IBM Cloud-Lösung? Probieren Sie IBM Cloud® Schematics aus. Mit Schematics können Sie die Terraform-Skriptsprache verwenden, mit der Sie vertraut sind, müssen sich jedoch nicht um die Einrichtung und Verwaltung der Terraform-Befehlszeile und des IBM Cloud-Provider-Plug-ins kümmern. Schematics stellt auch vordefinierte Terraform-Vorlagen bereit, die Sie über den IBM Cloud-Katalog installieren können.

Voraussetzungen

  • Bevor Sie beginnen, stellen Sie sicher, dass Sie über den erforderlichen Zugang verfügen, um IBM Cloud Logs Ressourcen zu erstellen und mit ihnen zu arbeiten.
  • Installieren Sie die Terraform CLI.

Terraform-CLI (Befehlszeilenschnittstelle installieren

Führen Sie die folgenden Schritte aus, um die Terraform-CLI zu installieren:

  1. Erstellen Sie auf Ihrer lokalen Maschine einen Ordner names Terraform und navigieren Sie zu Ihrem Ordner terraform.

    mkdir terraform && cd terraform
    
  2. Laden Sie die von Ihnen gewünschte Terraformversion herunter. Sie können zum Beispiel terraform_1.12.2_darwin_amd64.zip für eine MacOS herunterladen. Siehe Terraform installieren.

  3. Extrahieren Sie die komprimierte Terraform-Datei und kopieren Sie die Dateien in das Verzeichnis terraform. Führen Sie die folgenden Befehle aus:

    chmod +x terraform
    
    sudo mv terraform /usr/local/bin/
    
  4. Überprüfen Sie, ob die Installation erfolgreich war, indem Sie einen terraform-Befehl verwenden, um die Version zu bestätigen.

    terraform --version
    

Einrichten des Terraform-Arbeitsverzeichnisses

Erstellen Sie einen Ordner und navigieren Sie zu diesem Ordner. In diesem Ordner werden alle Konfigurationsdateien und Variablendefinitionen gespeichert, die für die Erstellung der Instanz IBM Cloud Logs erforderlich sind.

Legen Sie zum Beispiel in Ihrem Terraform-Arbeitsverzeichnis <terraform-working-directory>/terraform das Verzeichnis myproject an.

mkdir myproject && cd myproject

IBM Cloud Provider-Plug-in einrichten

Nachdem die Installation der Terraform-CLI abgeschlossen ist, müssen Sie das IBM Cloud Provider-Plug-in für Terraform so konfigurieren, dass Sie mit der Arbeit mit Ressourcen und Services in IBM Cloud beginnen können.

Eine Liste der unterstützten Versionen finden Sie unter IBM Cloud Provider plug-in releases.

Stellen Sie sicher, dass Sie die neueste Version des IBM Cloud Provider Plug-ins verwenden.

Erstellen Sie eine Datei namens versions.tf und geben Sie die IBM Cloud Provider-Plug-in-Version an, die Sie mit dem Parameter version verwenden möchten.

terraform {
required_providers {
    ibm = {
        source = "IBM-Cloud/ibm"
        version = "<provider version>"
        }
    }
  }

Zum Beispiel:

terraform {
  required_providers {
    ibm = {
      source  = "IBM-Cloud/ibm"
      version = ">=1.80.0"
    }
  }
}

IBM Cloud-Provider-Plug-in konfigurieren

Nachdem Sie die Konfiguration abgeschlossen haben, müssen Sie das IBM Cloud-Provider-Plug-in konfigurieren.

Bevor Sie mit der Arbeit mit Terraform unter IBM Cloud beginnen können, müssen Sie die Berechtigungsnachweise und Parameter abrufen, die für eine Terraform-Ressource oder Datenquelle erforderlich sind und sie in der Konfiguration des provider angeben. Diese Konfiguration wird vom IBM Cloud-Provider-Plug-in für die Authentifizierung mit der IBM Cloud-Plattform und zum Anzeigen, Erstellen, Aktualisieren oder Löschen von IBM Cloud-Ressourcen und Services verwendet.

In der folgenden Tabelle werden Eingabeparameter aufgelistet, die Sie im Block provider Ihres Terraforms in der IBM Cloud-Konfigurationsdatei festlegen können:

Liste der Eingabeparameter, die Sie im Providerblock Ihres Terraforms einstellen können
Eingabeparameter Erforderlich/Optional Beschreibung
ibmcloud_api_key Erforderlich Der IBM Cloud-API-Schlüssel für die Authentifizierung mit der IBM Cloud-Plattform. Weitere Informationen zum Erstellen eines API-Schlüssels finden Sie unter API-Schlüssel erstellen. Sie können den API-Schlüssel im Block provider angeben oder den Wert aus den Umgebungsvariablen IC_API_KEY oder IBMCLOUD_API_KEY abrufen. Wenn beide Umgebungsvariablen definiert sind, hat IC_API_KEY Vorrang.
ibmcloud_timeout Optionale Die Anzahl der Sekunden, die gewartet werden soll, bis die IBM Cloud-API als nicht verfügbar angesehen wird. Der Standardwert ist 60. Sie können das Zeitlimit im Block provider angeben oder den Wert aus den Umgebungsvariablen IC_TIMEOUT oder IBMCLOUD_TIMEOUT abrufen. Wenn beide Variablen angegeben werden, hat IC_TIMEOUT Vorrang.
region Optionale Die IBM Cloud-Region, in der Sie Ihre Ressourcen erstellen möchten. Wenn dieser Wert nicht angegeben ist, wird standardmäßig us-south verwendet. Sie können die Region im Block provider angeben oder den Wert aus den Umgebungsvariablen IBMCLOUD_REGION oder IC_REGION abrufen. Wenn beide Umgebungsvariablen angegeben werden, hat IC_REGION Vorrang.
resource_group Optionale Die ID der Ressourcengruppe, die für Ihre IBM Cloud-Ressourcen verwendet werden soll. Um die ID abzurufen, führen Sie ibmcloud resource groups aus. Sie können die Ressourcengruppe im Block provider angeben oder den Wert aus den Umgebungsvariablen IC_RESOURCE_GROUP oder IBMCLOUD_RESOURCE_GROUP abrufen. Wenn beide Umgebungsvariablen definiert sind, hat IC_RESOURCE_GROUP Vorrang.

Weitere Informationen über die Verwendung von Umgebungsvariablen finden Sie unter Verwendung von Umgebungsvariablen.

Konfigurieren Sie die Eingabevariablen in der Datei terraform.tfvars

Sie können Informationen in einer lokalen terraform.tfvars Datei speichern und diese Daten in Ihrem provider Block referenzieren.

Binden Sie die Datei terraform.tfvars nicht in ein öffentliches Quellenrepository ein. Diese Datei sollte nur auf Ihrem lokalen Rechner gespeichert werden.

Erstellen Sie in Ihrem Projektverzeichnis <terraform-directory>/terraform/myproject eine Datei terraform.tfvars auf Ihrem lokalen Rechner und fügen Sie die Eingabeparameter hinzu, die für Ihre Ressource oder Datenquelle erforderlich sind.

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"

Deklarieren von Variablen in der Datei variables.tf

Erstellen Sie in Ihrem Projektverzeichnis <terraform-directory>/terraform/myproject eine Variablendatei mit dem Namen variables.tf, die Standardwerte enthält.

Im folgenden Beispiel werden Variablen aufgeführt, die Sie bei der Bereitstellung einer IBM Cloud Logs-Instanz verwenden können:

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"
}

Referenzvariablen in der Datei provider.tf

Erstellen Sie in Ihrem Projektverzeichnis <terraform-directory>/terraform/myproject eine Datei provider.tf und verwenden Sie die Terraform Interpolationssyntax, um die Variablen aus terraform.tfvars zu referenzieren.

variable "ibmcloud_api_key" {}
variable "region" {}

provider "ibm" {
  ibmcloud_api_key    = var.ibmcloud_api_key
  region = var.region
}

Erstellen Sie die Terraform-Konfigurationsdateien zur Bereitstellung einer Instanz von IBM Cloud Logs

Erstellen Sie dann die folgenden Dateien:

  • data-bucket.tf: Enthält die Terraform-Ressourcendefinition zur Erstellung eines Buckets zum Speichern von Protokolldaten.

    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: Enthält die Terraform-Ressourcendefinition zur Erstellung eines Buckets zur Speicherung von Metriken, die aus Protokolldaten gesammelt werden.

    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: Enthält die Terraform-Ressourcendefinition, um die Instanz IBM Cloud Logs zu erstellen und den Data Bucket und den Metrics Bucket anzuhängen.

    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: Enthält die Terraform-Ressourcendefinition zur Erstellung der Service-to-Service-Autorisierungen zwischen der Instanz IBM Cloud Logs und den Buckets.

    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: Enthält die Terraform-Ressourcendefinition zur Erstellung einer ausgehenden Integration zwischen der Instanz IBM Cloud Logs und der Instanz IBM Cloud Event Notifications, über die Sie Benachrichtigungen an Ihre Ziele wie Slack oder E-Mail senden.

    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: Enthält die Terraform-Ressourcendefinition, um die Autorisierung zwischen der Instanz IBM Cloud Logs und der Instanz IBM Cloud Event Notifications zu erstellen.

    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"
    }
    

Weitere Informationen über die Verwendung von Terraform für IBM Cloud Ressourcen finden Sie unter ibm_resource_instance

Bereitstellung der IBM Cloud Logs Instanz mit Hilfe von Terraform IBM Modulen

Als Alternative zu Schritt 4 können Sie IBM Cloud Logs mit Terraform IBM Modules (TIM) bereitstellen. Wenn Sie diesen modulbasierten Ansatz wählen, überspringen Sie Schritt 4 und fahren Sie direkt mit der Bereitstellung von Ressourcen fort.

  1. Erstellen Sie eine Datei 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. Optional: Wenn Sie die Konfiguration parametrisieren wollen, definieren Sie Eingabevariablen. Erstellen Sie zum Beispiel eine Datei 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"
    }
    

Eine vollständige Dokumentation des Moduls und erweiterte Konfigurationsoptionen finden Sie unter IBM Cloud Logs.

Sie können auch diese Dokumentation für die Bereitstellung von Terraform IBM Modulen mit Terraform CLI lesen.

Ressourcen bereitstellen

Führen Sie die folgenden Schritte aus:

  1. Terraform-Befehlszeilenschnittstelle initialisieren.

    ../terraform init
    

    Die folgende Nachricht sollte angezeigt werden: Terraform has been successfully initialized!.

  2. Erstellen Sie einen Terraform-Ausführungsplan. Der Terraform-Ausführungsplan fasst alle Aktionen zusammen, die ausgeführt werden müssen, um den IBM Cloud Logs-Namespace und die IAM-Zugriffsrichtlinie in Ihrem Konto zu erstellen.

    ../terraform plan
    
  3. Erstellen Sie die Ressourcen.

    ../terraform apply
    

    Um Ressourcen zu löschen, führen Sie ./terraform destroy aus.

Weitere Schritte

Stellen Sie sicher, dass die Ressourcen erstellt werden. Starten Sie die Observability-Benutzeroberfläche und überprüfen Sie, ob die Instanz erstellt worden ist.

Sie können alle Module für produktionsreife Konfigurationen untersuchen: