基于Terraform管理阿里云Elasticsearch最佳實(shí)踐
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
通過(guò)Terraform,您可以使用代碼配置實(shí)現(xiàn)物理機(jī)等資源的分配。也就是說(shuō)通過(guò)Terraform,寫(xiě)一個(gè)配置文件,就可以幫助您購(gòu)買(mǎi)一臺(tái)云服務(wù)器,或者申請(qǐng)到阿里云Elasticsearch、OSS等云資源。本文介紹通過(guò)Terraform管理阿里云Elasticsearch的方法,包括創(chuàng)建、更新、查看、刪除實(shí)例等操作。
背景信息
您可以通過(guò)以下兩種方式安裝并配置Terraform環(huán)境:
在本地安裝和配置Terraform(本文以此為例)。
安裝并配置Terraform
前往Terraform官網(wǎng),下載適用于您的操作系統(tǒng)的程序包。
本文以L(fǎng)inux系統(tǒng)為例。如果您還沒(méi)有Linux環(huán)境,可購(gòu)買(mǎi)阿里云ECS實(shí)例,詳情請(qǐng)參見(jiàn)步驟一:創(chuàng)建ECS實(shí)例。
將程序包解壓到/usr/local/bin目錄。
如果您需要將可執(zhí)行文件解壓到其他目錄,請(qǐng)按照以下方法為其定義全局路徑:
Linux:參見(jiàn)在Linux系統(tǒng)定義全局路徑
Windows:參見(jiàn)在Windows系統(tǒng)定義全局路徑
Mac:參見(jiàn)在Mac系統(tǒng)定義全局路徑
執(zhí)行
terraform
命令驗(yàn)證路徑配置。執(zhí)行成功后,返回如下結(jié)果。
創(chuàng)建RAM用戶(hù),并為其授權(quán)。
為提高權(quán)限管理的靈活性和安全性,建議您創(chuàng)建RAM用戶(hù),并為其授權(quán)。
登錄RAM控制臺(tái)。
創(chuàng)建名為T(mén)erraform的RAM用戶(hù),并為該用戶(hù)創(chuàng)建AccessKey。
具體操作方法請(qǐng)參見(jiàn)創(chuàng)建RAM用戶(hù)。
重要請(qǐng)不要使用阿里云賬號(hào)的AccessKey配置Terraform工具。
為RAM用戶(hù)授權(quán)。
本示例為用戶(hù)Terraform授予AliyunElasticsearchFullAccess和AliyunVPCFullAccess權(quán)限,具體操作方法請(qǐng)參見(jiàn)為RAM用戶(hù)授權(quán)。
創(chuàng)建測(cè)試目錄。
因?yàn)槊總€(gè)Terraform項(xiàng)目都需要?jiǎng)?chuàng)建一個(gè)獨(dú)立的執(zhí)行目錄,所以需要先創(chuàng)建一個(gè)測(cè)試目錄。以下創(chuàng)建一個(gè)名為terraform-test的測(cè)試目錄。
mkdir terraform-test
進(jìn)入terraform-test目錄。
cd terraform-test
創(chuàng)建配置文件,并配置身份認(rèn)證信息。
Terraform在運(yùn)行時(shí),會(huì)讀取該目錄下所有的*.tf和*.tfvars文件。請(qǐng)按照實(shí)際需求,將配置信息寫(xiě)入到不同的文件中。以下列出幾個(gè)常用的配置文件。
配置文件
說(shuō)明
provider.tf
provider配置。
terraform.tfvars
配置provider要用到的變量。
varable.tf
通用變量。
resource.tf
資源定義。
data.tf
包文件定義。
output.tf
輸出文件定義。
例如創(chuàng)建provider.tf文件時(shí),使用
vim provider.tf
打開(kāi)文件,并按照以下格式配置您的身份認(rèn)證信息。provider "alicloud" { region = "cn-hangzhou" access_key = "LTA**********NO2" secret_key = "MOk8x0*********************wwff" }
更多配置信息請(qǐng)參見(jiàn)alicloud_elasticsearch_instance。
使用
mkdir -p plugh
命令,在當(dāng)前目錄下創(chuàng)建plugh目錄,下載provider插件并解壓到plugh目錄下。初始化工作目錄,使用-plugin-dir指定provider所在的路徑,完成配置。
terraform init -plugin-dir=./plugh/
返回Terraform has been successfully initialized表示初始化成功。
重要每個(gè)Terraform項(xiàng)目在新建Terraform工作目錄并創(chuàng)建配置文件后,都需要初始化工作目錄。
通過(guò)Terraform創(chuàng)建阿里云Elasticsearch實(shí)例
在測(cè)試目錄下,創(chuàng)建一個(gè)elastic.tf配置文件。
參考以下腳本配置elastic.tf文件,創(chuàng)建一個(gè)跨可用區(qū)的通用商業(yè)版6.7版本的阿里云Elasticsearch實(shí)例。
resource "alicloud_elasticsearch_instance" "instance" { description = "testInstanceName" instance_charge_type = "PostPaid" data_node_amount = "2" data_node_spec = "elasticsearch.sn2ne.large" data_node_disk_size = "20" data_node_disk_type = "cloud_ssd" vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" password = "es_password" version = "6.7_with_X-Pack" master_node_spec = "elasticsearch.sn2ne.large" zone_count = "1" }
provider插件支持的所有參數(shù)說(shuō)明如下。
參數(shù)
是否必選
描述
description
否
實(shí)例自定義名稱(chēng)的描述。
instance_charge_type
否
計(jì)費(fèi)模式。可選值:
PostPaid(默認(rèn)):按量付費(fèi)
PrePaid:包年包月
period
否
購(gòu)買(mǎi)時(shí)長(zhǎng)(單位:月),當(dāng)instance_charge_type為PrePaid時(shí)有效。可選值:1~9、12、24、36,默認(rèn)是1個(gè)月。
data_node_amount
是
ES集群的數(shù)據(jù)節(jié)點(diǎn)的個(gè)數(shù)。可選值:2~50。
data_node_spec
是
數(shù)據(jù)節(jié)點(diǎn)實(shí)例規(guī)格。
data_node_disk_size
是
指定磁盤(pán)空間。不同類(lèi)型的磁盤(pán),支持的最大存儲(chǔ)空間大小不同:
cloud_ssd:SSD云盤(pán),支持最大存儲(chǔ)2048 GB(2 TB)。
cloud_efficiency:高效云盤(pán),支持最大5 TB的存儲(chǔ)空間,提供較為低廉的存儲(chǔ)能力,適合大規(guī)模數(shù)據(jù)量的日志及分析場(chǎng)景。高效云盤(pán)超過(guò)2048 GB時(shí),只能取:2560、3072、3584、4096、4608、5120。
data_node_disk_type
是
存儲(chǔ)類(lèi)型。可選值:
cloud_ssd:SSD云盤(pán)。
cloud_efficiency:高效云盤(pán)。
vswitch_id
是
虛擬交換機(jī)的實(shí)例ID。
password
否
實(shí)例密碼,支持大小寫(xiě)字母、數(shù)字、特殊字符,長(zhǎng)度為8~32位字符。特殊字符包括
!@#$%^&*()_+-=
。kms_encrypted_password
否
KMS加密密碼。如果配置了password,該字段將被忽略。password和kms_encrypted_password必須配置一個(gè)。
kms_encryption_context
否
KMS加密上下文。只有設(shè)置了kms_encrypted_password時(shí)才有效。用于對(duì)使用kms_encrypted_password加密創(chuàng)建或更新的實(shí)例進(jìn)行解密,詳情請(qǐng)參見(jiàn)encryption context。
version
是
Elasticsearch版本。可選值:
5.5.3_with_X-Pack:5.5.3版本。
6.3_with_X-Pack:6.3.0版本。
6.7_with_X-Pack:6.7.0版本。
說(shuō)明Terraform不支持云原生架構(gòu)實(shí)例版本。
private_whitelist
否
設(shè)置實(shí)例的專(zhuān)有網(wǎng)絡(luò)VPC(Virtual Private Cloud)網(wǎng)絡(luò)白名單。
kibana_whitelist
否
設(shè)置Kibana訪(fǎng)問(wèn)白名單。
master_node_spec
否
Master節(jié)點(diǎn)規(guī)格。
advancedDedicateMaster
否
用于表示是否創(chuàng)建專(zhuān)有主節(jié)點(diǎn),取值含義如下:
true:創(chuàng)建專(zhuān)有主節(jié)點(diǎn)。如果部署多可用區(qū)并且啟用專(zhuān)有主節(jié)點(diǎn),則需要將該參數(shù)設(shè)置為true。
false(默認(rèn)值):不創(chuàng)建專(zhuān)有主節(jié)點(diǎn)。
zone_count
否
可用區(qū)數(shù)量。取值為1~3,data_node_amount必須是該值的整數(shù)倍。
更多參數(shù)詳情請(qǐng)參見(jiàn)alicloud_elasticsearch_instance。
重要kms_encrypted_password和kms_encryption_context參數(shù)要求provider插件版本在1.57.1及以上;zone_count參數(shù)要求provider插件版本在1.44.0及以上。
如果需要購(gòu)買(mǎi)除數(shù)據(jù)節(jié)點(diǎn)外的其他屬性節(jié)點(diǎn),請(qǐng)參見(jiàn)createInstance參數(shù)開(kāi)啟其他節(jié)點(diǎn)屬性。例如,購(gòu)買(mǎi)多可用區(qū)專(zhuān)有主節(jié)點(diǎn),腳本中需要加入
advancedDedicateMaster="true"
。
執(zhí)行
terraform plan
命令,查看將會(huì)執(zhí)行的操作。執(zhí)行成功后,返回如下結(jié)果。
Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ------------------------------------------------------------------------ An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # alicloud_elasticsearch_instance.instance will be created + resource "alicloud_elasticsearch_instance" "instance" { + description = "testInstanceName" + data_node_amount = 2 + data_node_disk_size = 20 + data_node_disk_type = "cloud_ssd" + data_node_spec = "elasticsearch.sn2ne.large" + domain = (known after apply) + id = (known after apply) + instance_charge_type = "PostPaid" + kibana_domain = (known after apply) + kibana_port = (known after apply) + kibana_whitelist = (known after apply) + master_node_spec = "elasticsearch.sn2ne.large" + password = (sensitive value) + port = (known after apply) + private_whitelist = (known after apply) + public_whitelist = (known after apply) + status = (known after apply) + version = "6.7_with_X-Pack" + vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" + zone_count = 1 } Plan: 1 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
執(zhí)行
terraform apply
命令,運(yùn)行工作目錄中的配置文件,輸入yes。執(zhí)行成功后,返回如下結(jié)果。
Plan: 1 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes alicloud_elasticsearch_instance.instance: Creating... alicloud_elasticsearch_instance.instance: Still creating... [10s elapsed] alicloud_elasticsearch_instance.instance: Still creating... [20s elapsed] ............... Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
登錄阿里云Elasticsearch控制臺(tái),查看創(chuàng)建成功的Elasticsearch集群。
通過(guò)Terraform更新Elasticsearch資源配置
進(jìn)入測(cè)試目錄,修改elastic.tf配置文件。
例如修改data_node_disk_size為50。
resource "alicloud_elasticsearch_instance" "instance" { instance_charge_type = "PostPaid" data_node_amount = "2" data_node_spec = "elasticsearch.sn2ne.large" data_node_disk_size = "50" data_node_disk_type = "cloud_ssd" vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" password = "es_password" version = "6.7_with_X-Pack" master_node_spec = "elasticsearch.sn2ne.large" zone_count = "1" }
重要實(shí)例創(chuàng)建成功后,version無(wú)法修改。
每次請(qǐng)求,只支持修改一項(xiàng)配置。例如同時(shí)修改data_node_spec和data_node_disk_size,系統(tǒng)將會(huì)出現(xiàn)錯(cuò)誤響應(yīng)。
執(zhí)行
terraform plan
查看資源配置信息。執(zhí)行
terraform apply
等待資源升配結(jié)束。
將Elasticsearch資源導(dǎo)入Terraform
如果阿里云Elasticsearch實(shí)例不是通過(guò)Terraform創(chuàng)建的,可通過(guò)命令,將阿里云Elasticsearch導(dǎo)入到Terraform的state目錄下進(jìn)行管理。
在測(cè)試目錄下,創(chuàng)建一個(gè)main.tf文件。
vim main.tf
進(jìn)行資源聲明,指定所要導(dǎo)入的資源在state中的存放路徑。
resource "alicloud_elasticsearch_instance" "test" {}
開(kāi)始資源導(dǎo)入操作。
terraform import alicloud_elasticsearch_instance.test es-cn-0pp1f1y5g000h****
執(zhí)行成功后,返回如下結(jié)果。
alicloud_elasticsearch_instance.test: Importing from ID "es-cn-0pp1f1y5g000h****"... alicloud_elasticsearch_instance.test: Import prepared! Prepared alicloud_elasticsearch_instance for import alicloud_elasticsearch_instance.test: Refreshing state... [id=es-cn-0pp1f1y5g000h****] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.
說(shuō)明有關(guān)import如何實(shí)現(xiàn)存量資源的管理,請(qǐng)參見(jiàn)一文揭秘存量云資源的管理難題。
查看Terraform管理的所有Elasticsearch資源
使用terraform show
命令,查看當(dāng)前state中所有被管理的資源及其所有屬性值。
# alicloud_elasticsearch_instance.instance:
resource "alicloud_elasticsearch_instance" "instance" {
data_node_amount = 2
data_node_disk_size = 20
data_node_disk_type = "cloud_ssd"
data_node_spec = "elasticsearch.sn2ne.large"
domain = "es-cn-dssf9op81lz4q****.elasticsearch.aliyuncs.com"
id = "es-cn-dssf9op81lz4q****"
instance_charge_type = "PostPaid"
kibana_domain = "es-cn-dssf9op81lz4q****.kibana.elasticsearch.aliyuncs.com"
kibana_port = 5601
kibana_whitelist = []
master_node_spec = "elasticsearch.sn2ne.large"
password = (sensitive value)
port = 9200
private_whitelist = []
public_whitelist = []
status = "active"
version = "6.7.0_with_X-Pack"
vswitch_id = "vsw-bp1f7r0ma00pf9h2l****"
zone_count = 1
}
# alicloud_elasticsearch_instance.test:
resource "alicloud_elasticsearch_instance" "test" {
data_node_amount = 3
data_node_disk_size = 51
data_node_disk_type = "cloud_ssd"
data_node_spec = "elasticsearch.r5.large"
domain = "es-cn-0pp1f1y5g000h****.elasticsearch.aliyuncs.com"
id = "es-cn-0pp1f1y5g000h****"
instance_charge_type = "PostPaid"
kibana_domain = "es-cn-0pp1f1y5g000h****.kibana.elasticsearch.aliyuncs.com"
kibana_port = 5601
kibana_whitelist = []
port = 9200
private_whitelist = []
public_whitelist = []
status = "active"
version = "6.7.0_with_X-Pack"
vswitch_id = "vsw-bp1f7r0ma00pf9h2l****"
zone_count = 1
timeouts {}
}
通過(guò)Terraform刪除Elasticsearch實(shí)例
實(shí)例刪除后將不可恢復(fù),實(shí)例中的所有數(shù)據(jù)將被清空。
進(jìn)入測(cè)試目錄,執(zhí)行terraform destroy
命令,輸入yes,即可刪除該實(shí)例。
# terraform destroy
alicloud_elasticsearch_instance.instance: Refreshing state... [id=es-cn-v3x49h5397fau****]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# alicloud_elasticsearch_instance.instance will be destroyed
- resource "alicloud_elasticsearch_instance" "instance" {
- data_node_amount = 2 -> null
- data_node_disk_size = 20 -> null
- data_node_disk_type = "cloud_ssd" -> null
- data_node_spec = "elasticsearch.sn2ne.large" -> null
- domain = "es-cn-v3x49h5397fau****.elasticsearch.aliyuncs.com" -> null
- id = "es-cn-v3x49h5397fau****" -> null
- instance_charge_type = "PostPaid" -> null
- kibana_domain = "es-cn-v3x49h5397fau****.kibana.elasticsearch.aliyuncs.com" -> null
- kibana_port = 5601 -> null
- kibana_whitelist = [] -> null
- master_node_spec = "elasticsearch.sn2ne.large" -> null
- password = (sensitive value)
- port = 9200 -> null
- private_whitelist = [] -> null
- public_whitelist = [] -> null
- status = "active" -> null
- version = "6.7.0_with_X-Pack" -> null
- vswitch_id = "vsw-bp1f7r0ma00pf9h2l****" -> null
- zone_count = 1 -> null
}
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes
alicloud_elasticsearch_instance.instance: Destroying... [id=es-cn-v3x49h5397fau****]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 10s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 20s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 30s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 40s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 50s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m0s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m10s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m20s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m30s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m40s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 1m50s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m0s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m10s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m20s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m30s elapsed]
alicloud_elasticsearch_instance.instance: Still destroying... [id=es-cn-v3x49h5397fau****, 2m40s elapsed]
alicloud_elasticsearch_instance.instance: Destruction complete after 10m2s
Destroy complete! Resources: 1 destroyed.