VisasQ Dev Blog

ビザスク開発ブログ

TerraformでElasticCloudの環境を立ち上げる

こんにちは。検索チームの加藤です。

推しのサウナが閉店してしまうということで悲しみにくれています。 厳しくなったらぱっと閉じる、必要になったら新しい状態でぱっと立ち上げる、そんなことが現実でも簡単にできたらなと思う次第です。

そんなこと現実では夢物語でも、システムの世界では容易です。そうTerrafromを使えばね。

ということで、今回は弊社で使っているElasticCloudの環境をTerraformを使って作成する方法を備忘録がてらご紹介します。

対象読者

  • Terraformについて最低限知っている
  • ElasticCloudでコンソールからdeploymentを作成したことがある

上記のような人を対象読者としています。 TerraformやElasticCloudの使い方や用語の説明などは行いません。

検証環境

  • macOS Bis Sur v11.5.1
  • terraform: v1.1.7
  • terraform-provider-ec: v0.4.1

terraform-provider-ec

ElasticCloud APIのためのTerraformのproviderです。 今回はこれを使います。

github.com

今回作るもの

最小構成(メモリ1G 1ZONE)のElasticsearchと、default設定のKibanaで構成されるdeploymentを作成します。

事前準備

  1. APIKEYを取得する
  2. APIKEYをセットする

APIKEYを取得する

まずFeatures > API KeysのページからElasticCloudのAPIを利用するためのAPIKEYを取得します。

まだAPIKEYを生成していない場合は、”Generate API Key” から生成してください。

APIKEYをセットする

今回はAPIKEYを環境変数にセットします。

$ export EC_API_KEY="<apikey value>"

もしコード上でセットしたい場合は以下のように記載してください。

provider "ec" {
  apikey = "<apikey value>"
}

コード

まずは全体を示します。

terraform {
  required_providers {
    ec = {
      source = "elastic/ec"
      version = "0.4.1"
    }
  }
}

provider "ec" {}

resource "ec_deployment" "terraform-provider-example" {
  name = "terraform-provider-example"

  region                 = "gcp-us-central1"
  version                = "7.17.4"
  deployment_template_id = "gcp-compute-optimized"
  
  tags = {
      env = "dev"
  }

  elasticsearch {
    config {
      plugins=["analysis-icu", "analysis-kuromoji"]
    }
    topology {
      id="hot_content"
      size="1g"
      size_resource="memory"
      zone_count=1
    }
  }

  kibana {}

}

output "credential_name" {
    value = ec_deployment.terraform-provider-example.elasticsearch_username
}

output "credential_password" {
    value = nonsensitive(ec_deployment.terraform-provider-example.elasticsearch_password)
}

output "endpoint" {
  value = ec_deployment.terraform-provider-example.elasticsearch[0].https_endpoint
}

解説

terraform block

terraform {
  required_providers {
    ec = {
      source = "elastic/ec"
      version = "0.4.1"
    }
  }
}

Elastic Cloud ProviderはElasticが提供しているものなので、required_providersを忘れずに指定しましょう。

provider block

provider "ec" {}

今回は環境変数にAPIKEYをセットしていて、特別何も設定していないためproviderの引数は何も指定していません。 必要に応じて指定してください。

https://registry.terraform.io/providers/elastic/ec/latest/docs

resource block

引数の詳細に関しては以下を参考にしてください。

https://registry.terraform.io/providers/elastic/ec/latest/docs/resources/ec_deployment#argument-reference

name = "terraform-provider-example"

nameで指定した値がdeploymentの名前になります。

version = "7.17.4"

Elasticsearchのバージョンを指定します。 作成段階でコンソールから選択できるバージョン以外は指定できません。

version                = "7.17.4"
deployment_template_id = "gcp-compute-optimized"

以下のドキュメントを参考に、利用しているクラウドサービスに応じたregiondeployment_template_idを指定してください。 deployment_template_idはコンソールでdeployment作る際のHardware profileに該当します。

Available regions, deployment templates and instance configurations | Elasticsearch Service Documentation | Elastic

例えば上記リストでIowa (us-central1), gcp-us-central1と記載されているgcp-us-central1がregionです。 弊社ではGCPを使っているため、GCPのものを指定しています。

tag block

tags = {
    env = "dev"
}

deployment管理用のタグを指定できます。 上記の場合は"env:dev"というタグが付与されます。 検索する際は、tags:(env:dev)で検索できます。 とくに動作に影響はしません。

Elasticsearch block

elasticsearch {
    topology {
        id="hot_content"
        size="1g"
        size_resource="memory"
        zone_count=1
    }

    config {
        plugins=["analysis-icu", "analysis-kuromoji"]
    }
}

Elasticsearchのスペック等の設定です。 何も指定しないelasticsearch{}場合はメモリ8G 2ZONEで作成されます。

nodeの指定はtopology blockで行います。 idにはcold, coordinating, frozen, hot_content, master, ml, warmが選べます。 今回は1つのtopologyしか指定しませんが、複数指定可能です。 また、nodeの役割によっては別のnodeが必須となります。(例えばdata nodeを指定したら、合わせてmaster nodeも必要)

sizeは、 "<size in GB>g”のフォーマットでsize_resourceの値(デフォルトでメモリ)のサイズを指定します。 size_resourceは、わかりやすいように指定していますがデフォルトでmemoryなので指定なくてもOKです。

デフォルトで利用できるpluginはconfig blockで指定できます。

Extensionを使う場合は、ec_deployment_extension resourceを作成し、extension blockで指定する必要があります。 https://registry.terraform.io/providers/elastic/ec/latest/docs/resources/ec_deployment_extension

kibana block

kibana {}

今回kibanaのインスタンス定義はデフォルトを指定しています。 もし指定したい場合は、ドキュメントを参照してください。

https://registry.terraform.io/providers/elastic/ec/latest/docs/resources/ec_deployment#resources

kibana引数はオプションなため、指定しなければ無効にできます。

ただし、デプロイメントの変更やアップグレードで問題が発生する可能性があるため、公式では指定するよう推奨されています。 検証目的のような一時的な利用の場合は無効にしてもいいでしょう。

output

output "credential_name" {
    value = ec_deployment.terraform-provider-example.elasticsearch_username
}

output "credential_password" {
    value = nonsensitive(ec_deployment.terraform-provider-example.elasticsearch_password)
}

output "endpoint" {
  value = ec_deployment.terraform-provider-example.elasticsearch[0].https_endpoint
}

手元からリクエストする際必要な情報を、apply時に表示できるようにしています。

確認可能できる値は以下の項目です。

https://registry.terraform.io/providers/elastic/ec/latest/docs/resources/ec_deployment#attributes-reference

deployment credentialはリソース作成時に自動で生成されます。

https://registry.terraform.io/providers/elastic/ec/latest/docs/resources/ec_deployment#import

終わりに

ElasticCloudはコンソールからも簡単に環境を作成できますが、ログインが面倒であったり細かい設定をクリックする必要があったりと小さな手間がかかります。

IaC化することで、検証のために何度も環境作ったり消したりという作業もミスなく手軽に行えるようになりました。 これで気楽に検証できる環境の準備が整ったので、どんどん改善を進めていきたいと思っています。