Terraform を使って IBM Cloud Logs インスタンスをプロビジョニングする
Terraform on IBM Cloud® により、IBM Cloud サービスの予測可能で一貫性のあるプロビジョニングが可能になり、Infrastructure as Code (IaC) の原則に従う複雑な多層クラウド環境を迅速にビルドできます。 IBM Cloud CLI または API および SDK を使用する場合と同様に、HashiCorp 構成言語 (HCL) を使用して、IBM Cloud Logs インスタンスのプロビジョニング、更新、および削除を自動化できます。
本番環境でのデプロイには、 Terraform IBM Modules(TIM) の使用を検討してください。 IBM Cloud Logs これは、 IBM Cloud のベストプラクティスに従って、あらかじめビルドされた、オープンソースの、エンタープライズ対応の設定を提供します。
TIMモジュールは、複雑なデプロイメントを簡素化し、環境間の一貫性を確保し、設定エラーを減らします。 Terraform IBM Modules(TIM)のレジストリから利用可能なモジュールを探します。
IBM Cloud ソリューションでマネージド型 Terraform をお探しですか。 IBM Cloud® Schematics をお試しください。 Schematics では、よく知られている Terraform スクリプト言語が使用できますが、Terraform コマンド・ラインおよび IBM Cloud プロバイダー・プラグインのセットアップやメンテナンスについてはご心配にはおよびません。Schematics では IBM Cloud カタログからインストールできる事前定義 Terraform テンプレートも提供されます。
前提条件
- 作業を開始する前に、 IBM Cloud Logs リソースを作成および操作するために 必要なアクセス権を持って いることを確認してください。
- Terraform CLIをインストールする。
Terraform CLI のインストール
Terraform CLI をインストールするには、以下のステップを実行します。
-
ローカル・マシンに terraform フォルダーを作成し、terraform フォルダーにナビゲートします。
mkdir terraform && cd terraform -
希望する Terraform バージョンをダウンロードします。 MacOS 例えば、
terraform_1.12.2_darwin_amd64.zipをダウンロードすることができます。 Terraformのインストールを参照してください。 -
Terraform zip ファイルを解凍し、使用している terraform ディレクトリーにファイルをコピーします。 以下のコマンドを実行します。
chmod +x terraformsudo mv terraform /usr/local/bin/ -
terraformコマンドでバージョンを確認し、インストールが成功したことを確認する。
terraform --version
Terraformの作業ディレクトリを設定する
フォルダを作成し、その中に移動する。 このフォルダは、 IBM Cloud Logs インスタンスを作成するために必要なすべての設定ファイルと変数定義を格納するために使用されます。
たとえば、Terraformの作業ディレクトリ <terraform-working-directory>/terraform に、 myproject というディレクトリを作成します。
mkdir myproject && cd myproject
IBM Cloud プロバイダー・プラグインのセットアップ
Terraform CLI のインストールが完了したら、IBM Cloud でリソースとサービスの使用を開始できるように Terraform 用の IBM Cloud Provider プラグインをセットアップする必要があります。
サポートされているバージョンのリストについては、 IBM Cloud Provider プラグインのリリースを参照してください。
最新の IBM Cloud Providerプラグインリリースを使用していることを確認してください。
versions.tf ファイルを作成し、使用する IBM Cloud Provider プラグインのバージョンを version パラメーターで指定します。
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
version = "<provider version>"
}
}
}
以下に例を示します。
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
version = ">=1.80.0"
}
}
}
IBM Cloud プロバイダー・プラグインの構成
セットアップを完了したら、IBM Cloud Provider プラグインを構成する必要があります。
Terraform on IBM Cloud を使用して作業を始める前に、Terraform リソースまたはデータ・ソースに必要な資格情報やパラメーターを取得し、provider 構成でそれらを指定する必要があります。 この構成は、IBM Cloud プラットフォームで認証を行うとき、および IBM Cloud のリソースとサービスを表示、作成、更新、または削除するときに IBM Cloud Provider プラグインによって使用されます。
次の表は、Terraform on IBM Cloud 構成ファイルの provider ブロックで設定できる入力パラメーターをリストしたものです。
| 入力パラメーター | 必須 / オプション | 説明 |
|---|---|---|
ibmcloud_api_key |
必須 | IBM Cloud プラットフォームで認証するための IBM Cloud API キー。 API キーの作成方法について詳しくは、API キーの作成を参照してください。 provider ブロックで API キーを指定するか、IC_API_KEY 環境変数または
IBMCLOUD_API_KEY 環境変数から値を取得することができます。 両方の環境変数が定義されている場合は、IC_API_KEY が優先されます。 |
ibmcloud_timeout |
オプション | IBM Cloud API が使用不可と判断されるまでの秒数を指定します。 デフォルト値は 60です。 provider ブロックでタイムアウトを指定するか、IC_TIMEOUT 環境変数または IBMCLOUD_TIMEOUT 環境変数から値を取得することができます。 両方の変数が指定されている場合は、IC_TIMEOUT が優先されます。 |
region |
オプション | リソースを作成する IBM Cloud リージョン。 この値が指定されていない場合は、デフォルトとして us-south が使用されます。 provider ブロックでリージョンを指定するか、IBMCLOUD_REGION 環境変数または IC_REGION 環境変数から値を取得することができます。 両方の環境変数が指定されている場合は、IC_REGION が優先されます。 |
resource_group |
オプション | IBM Cloud リソースに使用するリソース・グループの ID。 ID を取得するには、ibmcloud resource groups を実行します。 provider ブロックでリソース・グループを指定するか、IC_RESOURCE_GROUP 環境変数または IBMCLOUD_RESOURCE_GROUP 環境変数から値を取得することができます。 両方の環境変数が定義されている場合は、IC_RESOURCE_GROUP が優先されます。 |
環境変数の使い方については、 環境変数の使い方を 参照してください。
terraform.tfvars ファイルで入力変数を設定
ローカルの terraform.tfvars ファイルに情報を保存し、 provider ブロックでこのデータを参照することができます。
terraform.tfvars は、パブリック・ソース・リポジトリーにコミットしないでください。 このファイルは、あなたのローカルマシンにのみ保存されることを意図しています。
プロジェクト・ディレクトリ <terraform-directory>/terraform/myproject に、 terraform.tfvars ファイルを作成し、リソースまたはデータ・ソースに必要な入力パラメータを追加します。
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"
variables.tf ファイルで変数を宣言する
プロジェクトのディレクトリ <terraform-directory>/terraform/myproject に、 variables.tf という名前の変数ファイルを作成し、デフォルト値を含める。
次のサンプルは、 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"
}
provider.tf ファイルの参照変数
プロジェクトのディレクトリ <terraform-directory>/terraform/myproject に provider.tf ファイルを作成し、Terraform の補間構文を使って terraform.tfvars の変数を参照します。
variable "ibmcloud_api_key" {}
variable "region" {}
provider "ibm" {
ibmcloud_api_key = var.ibmcloud_api_key
region = var.region
}
のインスタンスをプロビジョニングするためのTerraform設定ファイルを作成する。 IBM Cloud Logs
次に、以下のファイルを作成する:
-
data-bucket.tf:ログデータを保存するバケットを作成するためのTerraformリソース定義が含まれています。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:ログデータから収集したメトリクスを保存するバケットを作成するためのTerraformリソース定義が含まれています。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: IBM Cloud Logs インスタンスを作成し、データバケットとメトリクスバケットをアタッチするための Terraform リソース定義が含まれています。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: IBM Cloud Logs インスタンスとバケット間の認証サービスを作成するための Terraform リソース定義が含まれます。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: IBM Cloud Logs インスタンスと IBM Cloud Event Notifications インスタンス間のアウトバウンドインテグレーションを作成するための Terraform リソース定義が含まれています。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: IBM Cloud Logs インスタンスと IBM Cloud Event Notifications インスタンス間の認可を作成するための Terraform リソース定義を含む。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" }
IBM Cloud リソースに Terraform を使う方法についての追加情報は、 ibm _resource_instance を参照してください
Terraform IBM モジュールを使って IBM Cloud Logs インスタンスをプロビジョニングする
ステップ4の代わりに、Terraform IBM Modules (TIM) を使って IBM Cloud Logs をプロビジョニングすることができます。 このモジュール・ベースのアプローチを選択した場合は、ステップ4をスキップして、直接「 Provision resources(リソースの提供) 」に進んでください。
-
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 } -
オプション:コンフィギュレーションをパラメータ化したい場合は、入力変数を定義する。 例えば、
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" }
モジュールの完全なドキュメントと高度な設定オプションについては、 IBM Cloud Logs モジュールを参照してください。
Terraform CLIを使ったTerraform IBM Modulesのデプロイについてはこちらの ドキュメントも 参照してください。
リソースのプロビジョン
以下のステップを実行します。
-
Terraform CLI を初期設定します。
../terraform initTerraform has been successfully initialized!というメッセージが表示されます。 -
Terraform 実行プランを作成します。 Terraform 実行プランとは、アカウントに IBM Cloud Logs インスタンス、リソース・キー、および IAM アクセス・ポリシーを作成するために実行する必要のあるすべてのアクションをまとめたものです。
../terraform plan -
リソースを作成します。
../terraform applyリソースを削除するには、
./terraform destroyを実行します。
次のステップ
リソースが作成されたことを確認します。 Observability UIを起動 し、インスタンスが作成されていることを確認する。
すべてのモジュールについて、生産可能な構成を検討することができます: