こんにちは。検索チームの加藤です。
推しのサウナが閉店してしまうということで悲しみにくれています。 厳しくなったらぱっと閉じる、必要になったら新しい状態でぱっと立ち上げる、そんなことが現実でも簡単にできたらなと思う次第です。
そんなこと現実では夢物語でも、システムの世界では容易です。そう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です。 今回はこれを使います。
今回作るもの
最小構成(メモリ1G 1ZONE)のElasticsearchと、default設定のKibanaで構成されるdeploymentを作成します。
事前準備
- APIKEYを取得する
- 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
引数の詳細に関しては以下を参考にしてください。
name = "terraform-provider-example"
name
で指定した値がdeploymentの名前になります。
version = "7.17.4"
Elasticsearchのバージョンを指定します。 作成段階でコンソールから選択できるバージョン以外は指定できません。
version = "7.17.4" deployment_template_id = "gcp-compute-optimized"
以下のドキュメントを参考に、利用しているクラウドサービスに応じたregion
とdeployment_template_id
を指定してください。
deployment_template_id
はコンソールでdeployment作る際のHardware profileに該当します。
例えば上記リストで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時に表示できるようにしています。
確認可能できる値は以下の項目です。
deployment credentialはリソース作成時に自動で生成されます。
https://registry.terraform.io/providers/elastic/ec/latest/docs/resources/ec_deployment#import
終わりに
ElasticCloudはコンソールからも簡単に環境を作成できますが、ログインが面倒であったり細かい設定をクリックする必要があったりと小さな手間がかかります。
IaC化することで、検証のために何度も環境作ったり消したりという作業もミスなく手軽に行えるようになりました。 これで気楽に検証できる環境の準備が整ったので、どんどん改善を進めていきたいと思っています。