Provisionamento de uma instância do IBM Cloud Logs usando o Terraform

O Terraform no IBM Cloud® possibilita o provisionamento previsível e consistente dos serviços IBM Cloud para que você possa construir rapidamente ambientes de nuvem complexos e de multicamadas, que seguem os princípios de Infraestrutura como Código (IaC). Semelhante ao uso da CLI ou API e SDKs do IBM Cloud, é possível automatizar o fornecimento, a atualização e a exclusão de suas instâncias do IBM Cloud Logs usando o HashiCorp Configuration Language (HCL).

Para implantações de produção, considere o uso do Terraform IBM Modules(TIM) para IBM Cloud Logs que fornecem configurações pré-construídas, de código aberto e prontas para a empresa, seguindo as práticas recomendadas do site IBM Cloud.

Os módulos TIM simplificam implementações complexas, garantem a consistência entre ambientes e reduzem os erros de configuração. Explore o registro do Terraform IBM Modules(TIM) para obter os módulos disponíveis.

Procurando por um Terraform gerenciado na solução do IBM Cloud? Experimente o IBM Cloud® Schematics. Com o Schematics, é possível usar a linguagem de script do Terraform com a qual você está familiarizado, mas não é necessário se preocupar em configurar e manter a linha de comandos do Terraform e o plug-in do Provedor IBM Cloud. O Schematics também fornece modelos do Terraform pré-definidos que podem ser instalados a partir do catálogo do IBM Cloud.

Pré-requisitos

  • Antes de começar, certifique-se de que você tenha o acesso necessário para criar e trabalhar com recursos do IBM Cloud Logs.
  • Instale a CLI do Terraform.

Instalar a CLI do Terraform

Conclua as etapas a seguir para instalar a CLI do Terraform:

  1. Crie uma pasta do Terraform em sua máquina local e navegue até essa pasta.

    mkdir terraform && cd terraform
    
  2. Faça download da versão do Terraform desejada. Por exemplo, você pode fazer o download de terraform_1.12.2_darwin_amd64.zip para um MacOS. Consulte Instalar o Terraform.

  3. Extraia o arquivo zip do Terraform e copie os arquivos para o seu diretório terraform. Execute os seguintes comandos:

    chmod +x terraform
    
    sudo mv terraform /usr/local/bin/
    
  4. Verifique se a instalação foi bem-sucedida usando um comando terraform para confirmar a versão.

    terraform --version
    

Configurar o diretório de trabalho do Terraform

Crie uma pasta e navegue até ela. Essa pasta é usada para armazenar todos os arquivos de configuração e definições de variáveis necessários para criar a instância do IBM Cloud Logs.

Por exemplo, em seu diretório de trabalho do Terraform <terraform-working-directory>/terraform, crie o diretório myproject.

mkdir myproject && cd myproject

Configurar o plug-in do Provedor IBM Cloud

Após a conclusão da instalação da CLI do Terraform, deve-se configurar o plug-in IBM Cloud Provider para Terraform para que você possa começar a trabalhar com recursos e serviços na IBM Cloud.

Para obter uma lista das versões compatíveis, consulte as versões do plug-in do provedor IBM Cloud.

Certifique-se de usar a versão mais recente do plug-in do provedor IBM Cloud.

Crie um arquivo versions.tf e especifique a versão do plug-in IBM Cloud Provider que deseja usar com o parâmetro version.

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

Por exemplo:

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

Configure o plug-in do Provedor da IBM Cloud

Depois de concluir a configuração, deve-se configurar o plug-in IBM Cloud Provider .

Antes de começar a trabalhar com o Terraform no IBM Cloud, deve-se recuperar as credenciais e os parâmetros necessários para um recurso ou origem de dados do Terraform e especificá-los na configuração do provider. Essa configuração é usada pelo plug-in do IBM Cloud Provider para autenticar com a plataforma IBM Cloud e visualizar, criar, atualizar ou excluir recursos e serviços do IBM Cloud.

A tabela a seguir lista os parâmetros de entrada que podem ser configurados no bloco provider do arquivo de configuração Terraform no IBM Cloud:

Lista de parâmetros de entrada que você pode definir no bloco do provedor do seu Terraform
Parâmetro de entrada Obrigatório / opcional Descrição
ibmcloud_api_key Obrigatório A chave de API IBM Cloud para autenticação na plataforma IBM Cloud. Para obter mais informações sobre como criar uma chave de API, consulte Criando uma chave de API. É possível especificar a chave de API no bloco provider ou recuperar o valor das variáveis de ambiente IC_API_KEY ou IBMCLOUD_API_KEY. Se ambas as variáveis de ambiente forem definidas, IC_API_KEY terá precedência.
ibmcloud_timeout Opcional O número de segundos que você deseja esperar até que a API IBM Cloud seja considerada indisponível. O valor padrão é 60. É possível especificar o tempo limite no bloco provider ou recuperar o valor das variáveis de ambiente IC_TIMEOUT ou IBMCLOUD_TIMEOUT. Se ambas as variáveis forem especificadas, IC_TIMEOUT terá precedência.
region Opcional A região do IBM Cloud em que você deseja criar seus recursos. Se este valor não for especificado, us-south será usado por padrão. É possível especificar a região no bloco provider ou recuperar o valor das variáveis de ambiente IBMCLOUD_REGION or IC_REGION. Se ambas as variáveis de ambiente forem especificadas, IC_REGION terá precedência.
resource_group Opcional O ID do grupo de recursos que você deseja usar para seus recursos IBM Cloud. Para recuperar o ID, execute ibmcloud resource groups. É possível especificar o grupo de recursos no bloco provider ou recuperar o valor a partir das variáveis de ambiente IC_RESOURCE_GROUP ou IBMCLOUD_RESOURCE_GROUP. Se ambas as variáveis de ambiente forem definidas, IC_RESOURCE_GROUP terá precedência.

Para obter mais informações sobre como usar variáveis de ambiente, consulte Uso de variáveis de ambiente.

Configure as variáveis de entrada no arquivo terraform.tfvars

Você pode armazenar informações em um arquivo local terraform.tfvars e fazer referência a esses dados em seu bloco provider.

Não confirme o terraform.tfvars em um repositório de origem pública. Esse arquivo deve ser armazenado apenas em seu computador local.

No diretório do projeto <terraform-directory>/terraform/myproject, crie um arquivo terraform.tfvars em seu computador local e adicione os parâmetros de entrada necessários para o seu recurso ou fonte de dados.

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"

Declare variáveis no arquivo variables.tf

No diretório do projeto <terraform-directory>/terraform/myproject, crie um arquivo de variáveis denominado variables.tf para incluir valores padrão.

O exemplo a seguir lista as variáveis que você pode usar ao provisionar uma instância do 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"
}

Variáveis de referência no arquivo provider.tf

No diretório do seu projeto <terraform-directory>/terraform/myproject, crie um arquivo provider.tf e use a sintaxe de interpolação do Terraform para fazer referência às variáveis do terraform.tfvars.

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

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

Crie os arquivos de configuração do Terraform para provisionar uma instância do IBM Cloud Logs

Em seguida, crie os seguintes arquivos:

  • data-bucket.tf: Contém a definição de recurso do Terraform para criar um bucket para armazenar dados de registro.

    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: Contém a definição de recurso do Terraform para criar um bucket para armazenar métricas coletadas de dados de registro.

    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: Contém a definição de recurso do Terraform para criar a instância do IBM Cloud Logs e anexar o bucket de dados e o bucket de métricas.

    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: Contém a definição de recurso do Terraform para criar o serviço para autorizações de serviço entre a instância IBM Cloud Logs e os 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: Contém a definição de recurso do Terraform para criar uma integração de saída entre a instância IBM Cloud Logs e a instância IBM Cloud Event Notifications por meio da qual você envia notificações para seus destinos, como Slack ou e-mail.

    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: Contém a definição de recurso do Terraform para criar a autorização entre a instância IBM Cloud Logs e a instância 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"
    }
    

Para obter mais informações sobre como usar o Terraform para os recursos do IBM Cloud, consulte ibm_resource_instance

Provisionamento da instância IBM Cloud Logs usando os módulos do Terraform IBM

Como alternativa à Etapa 4, você pode provisionar IBM Cloud Logs usando o Terraform IBM Modules (TIM). Se você escolher essa abordagem baseada em módulos, pule a Etapa 4 e vá diretamente para Recursos de provisionamento.

  1. Crie um arquivo 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. Opcional: se você quiser parametrizar a configuração, defina as variáveis de entrada. Por exemplo, crie um arquivo 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"
    }
    

Para obter a documentação completa do módulo e opções avançadas de configuração, consulte o módulo IBM Cloud Logs.

Você também pode consultar esta documentação para a implantação de módulos do Terraform IBM usando o Terraform CLI.

Provisionar recursos

Conclua as etapas a seguir:

  1. Inicialize a CLI do Terraform.

    ../terraform init
    

    Você verá a seguinte mensagem: Terraform has been successfully initialized!.

  2. Crie um plano de execução do Terraform. O plano de execução do Terraform resume todas as ações que precisam ser executadas para criar a instância IBM Cloud Logs, a chave de recursos e a política de acesso do IAM em sua conta.

    ../terraform plan
    
  3. Crie os recursos.

    ../terraform apply
    

    Para excluir recursos, execute ./terraform destroy.

O que vem a seguir?

Verifique se os recursos foram criados. Inicie a interface do usuário do Observability e verifique se a instância foi criada.

Você pode explorar todos os módulos para configurações prontas para produção: