Provisionnement d'une instance IBM Cloud Logs à l'aide de Terraform

Terraform sur IBM Cloud® permet une mise à disposition prévisible et cohérente des services IBM Cloud de sorte que vous puissiez générer rapidement des environnements de cloud complexes et multiniveaux qui suivent les principes de l'infrastructure en tant que code (IaC). Vous pouvez automatiser la mise à disposition, la mise à jour et la suppression de vos instances IBM Cloud en utilisant le langage HCL (HashiCorp Configuration Language), comme lorsque vous utilisez l'interface de ligne de commande IBM Cloud Logs ou l'API et les SDK.

Pour les déploiements en production, envisagez d'utiliser Terraform IBM Modules(TIM) pour IBM Cloud Logs, qui fournissent des configurations préconstruites, open-source et prêtes pour l'entreprise, en suivant les meilleures pratiques de IBM Cloud.

Les modules TIM simplifient les déploiements complexes, assurent la cohérence entre les environnements et réduisent les erreurs de configuration. Explorez le registre Terraform IBM Modules(TIM) pour trouver les modules disponibles.

Vous recherchez un Terraform géré sur une solution IBM Cloud ? Essayez IBM Cloud® Schematics. Avec Schematics, vous pouvez utiliser le langage de script Terraform que vous connaissez, mais vous n'avez pas à vous inquiéter de la configuration et de la maintenance de la ligne de commande Terraform et du plug-in IBM Cloud Provider. Schematics fournit également des modèles Terraform prédéfinis que vous pouvez installer à partir du catalogue IBM Cloud.

Configuration requise

  • Avant de commencer, vérifiez que vous disposez de l'accès requis pour créer et utiliser des ressources IBM Cloud Logs.
  • Installez le CLI Terraform.

Installation de l'interface de ligne de commande Terraform

Pour installer l'interface de ligne de commande Terraform, procédez comme suit :

  1. Créez un dossier terraform sur votre machine locale et accédez à votre dossier Terraform.

    mkdir terraform && cd terraform
    
  2. Téléchargez la version souhaitée de Terraform. Par exemple, vous pouvez télécharger terraform_1.12.2_darwin_amd64.zip pour un MacOS. Voir Installer Terraform.

  3. Extrayez le fichier zip Terraform et copiez les fichiers dans votre répertoire Terraform. Exécutez les commandes suivantes :

    chmod +x terraform
    
    sudo mv terraform /usr/local/bin/
    
  4. Vérifiez que l'installation est réussie en utilisant une commande terraform pour confirmer la version.

    terraform --version
    

Configurer le répertoire de travail de Terraform

Créez un dossier et accédez-y. Ce dossier est utilisé pour stocker tous les fichiers de configuration et les définitions de variables nécessaires à la création de l'instance IBM Cloud Logs.

Par exemple, dans votre répertoire de travail Terraform <terraform-working-directory>/terraform, créez le répertoire myproject.

mkdir myproject && cd myproject

Configurez le plug-inProvider IBM Cloud

Une fois l'installation de l'interface de ligne de commande Terraform terminée, vous devez installer le plug-in IBM Cloud Provider pour Terraform pour pouvoir commencer à utiliser les ressources et les services dans IBM Cloud.

Pour une liste des versions prises en charge, voir les versions du plug-in IBM Cloud Provider.

Veillez à utiliser la dernière version du plug-in IBM Cloud Provider.

Créez un fichier versions.tf et indiquez la version du plug-in IBM Cloud Provider que vous souhaitez utiliser à l'aide du paramètre version.

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

Exemple :

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

Configurez le plug-in Provider IBM Cloud

Une fois l'installation terminée, vous devez configurer le plug-in IBM Cloud Provider.

Avant de commencer à utiliser Terraform on IBM Cloud, vous devez extraire les données d'identification et les paramètres obligatoires pour une source de données ou une ressource Terraform et les spécifier dans la configuration du provider. Le plug-in IBM Cloud Provider utilise cette configuration pour s'authentifier auprès de la plateforme IBM Cloud et afficher, créer, mettre à jour ou supprimer des ressources et des services IBM Cloud.

Le tableau ci-dessous répertorie les paramètres d'entrée que vous pouvez définir dans le bloc provider de votre fichier de configuration Terraform on IBM Cloud :

Liste des paramètres d'entrée que vous pouvez définir dans le bloc fournisseur de votre Terraform
Paramètre d'entrée Obligatoire / Facultatif Description
ibmcloud_api_key Obligatoire Clé d'API IBM Cloud utilisée pour procéder à l'authentification auprès de la plateforme IBM Cloud. Pour plus d'informations sur la création d'une clé d'API, voir Création d'une clé d'API. Vous pouvez spécifier la clé d'API dans le bloc provider ou extraire la valeur des variables d'environnement IC_API_KEY ou IBMCLOUD_API_KEY. Si les deux variables d'environnement sont définies, IC_API_KEY prévaut.
ibmcloud_timeout Facultatif Nombre de secondes à attendre avant que l'API IBM Cloud ne soit considérée comme indisponible. La valeur par défaut est 60. Vous pouvez spécifier le délai d'attente dans le bloc provider ou extraire la valeur des variables d'environnement
IC_TIMEOUT ou IBMCLOUD_TIMEOUT. Si les deux variables sont définies, IC_TIMEOUT prévaut.
region Facultatif Région IBM Cloud où vous voulez créer vos ressources. Si cette valeur n'est pas indiquée, us-south est utilisé par défaut. Vous pouvez spécifier la région dans le bloc provider ou extraire la valeur des variables d'environnement IBMCLOUD_REGION ou IC_REGION. Si les deux variables d'environnement sont définies, IC_REGION prévaut.
resource_group Facultatif ID du groupe de ressources que vous souhaitez utiliser pour vos ressources IBM Cloud. Pour extraire l'ID, exécutez ibmcloud resource groups. Vous pouvez spécifier le groupe de ressources dans le bloc provider ou extraire la valeur des variables d'environnement IC_RESOURCE_GROUP ou IBMCLOUD_RESOURCE_GROUP. Si les deux variables d'environnement sont définies, IC_RESOURCE_GROUP prévaut.

Pour plus d'informations sur l'utilisation des variables d'environnement, voir Utilisation des variables d'environnement.

Configurer les variables d'entrée dans le fichier terraform.tfvars

Vous pouvez stocker des informations dans un fichier local terraform.tfvars et faire référence à ces données dans votre bloc provider.

Ne placez pas le fichier terraform.tfvars dans un référentiel source public. Ce fichier est destiné à être stocké uniquement sur votre machine locale.

Dans le répertoire de votre projet <terraform-directory>/terraform/myproject, créez un fichier terraform.tfvars sur votre machine locale et ajoutez les paramètres d'entrée requis pour votre ressource ou source de données.

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"

Déclarer des variables dans le fichier variables.tf

Dans le répertoire de votre projet <terraform-directory>/terraform/myproject, créez un fichier de variables nommé variables.tf pour inclure les valeurs par défaut.

L'exemple suivant énumère les variables que vous pouvez utiliser lorsque vous provisionnez une instance 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"
}

Variables de référence dans le fichier provider.tf

Dans le répertoire de votre projet <terraform-directory>/terraform/myproject, créez un fichier provider.tf et utilisez la syntaxe d'interpolation de Terraform pour référencer les variables du fichier terraform.tfvars.

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

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

Créer les fichiers de configuration Terraform pour provisionner une instance de IBM Cloud Logs

Ensuite, créez les fichiers suivants :

  • data-bucket.tf: Contient la définition de la ressource Terraform permettant de créer un seau pour stocker les données du journal.

    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: Contient la définition de la ressource Terraform permettant de créer un seau pour stocker les métriques collectées à partir des données de journalisation.

    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: Contient la définition de ressource Terraform pour créer l'instance IBM Cloud Logs et attacher le data bucket et le metrics bucket.

    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: Contient la définition de la ressource Terraform pour créer les autorisations de service à service entre l'instance IBM Cloud Logs et les 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: Contient la définition de la ressource Terraform pour créer une intégration sortante entre l'instance IBM Cloud Logs et l'instance IBM Cloud Event Notifications par laquelle vous envoyez des notifications à vos destinations telles que Slack ou le courrier électronique.

    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: Contient la définition de la ressource Terraform pour créer l'autorisation entre l'instance IBM Cloud Logs et l'instance 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"
    }
    

Pour plus d'informations sur l'utilisation de Terraform pour les ressources IBM Cloud, voir ibm_resource_instance

Provisionnement de l'instance IBM Cloud Logs à l'aide de Terraform IBM Modules

Comme alternative à l'étape 4, vous pouvez provisionner IBM Cloud Logs en utilisant Terraform IBM Modules (TIM). Si vous choisissez cette approche par module, sautez l'étape 4 et passez directement aux ressources de la provision.

  1. Créer un fichier 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. Facultatif : si vous souhaitez paramétrer la configuration, définissez des variables d'entrée. Par exemple, créez un fichier 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"
    }
    

Pour une documentation complète du module et des options de configuration avancées, voir le module IBM Cloud Logs.

Vous pouvez également consulter cette documentation pour le déploiement des modules Terraform IBM à l'aide de Terraform CLI.

Ressources d'approvisionnement

Procédez comme suit :

  1. Initialisez l'interface de ligne de commande de Terraform.

    ../terraform init
    

    Le message suivant devrait s'afficher : Terraform has been successfully initialized!.

  2. Créez un plan d'exécution Terraform. Le plan d'exécution Terraform récapitule toutes les actions à exécuter pour créer l'instance IBM Cloud Logs, la clé de ressource et la règle d'accès IAM dans votre compte.

    ../terraform plan
    
  3. Créez les ressources.

    ../terraform apply
    

    Pour supprimer des ressources, exécutez ./terraform destroy.

Étape suivante ?

Vérifiez que les ressources ont été créées. Lancez l'interface utilisateur d'Observability et vérifiez que l'instance a bien été créée.

Vous pouvez explorer tous les modules pour des configurations prêtes à la production :