全部產品
Search
文件中心

Elasticsearch:基於Terraform管理Elasticsearch最佳實務

更新時間:Jun 30, 2024

通過Terraform,您可以使用代碼配置實現物理機等資源的分配。也就是說通過Terraform,寫一個設定檔,就可以協助您購買一台雲端服務器,或者申請到Elasticsearch、OSS等雲資源。本文介紹通過Terraform管理Elasticsearch的方法,包括建立、更新、查看、刪除執行個體等操作。

背景資訊

您可以通過以下兩種方式安裝並配置Terraform環境:

安裝並配置Terraform

  1. 前往Terraform官網,下載適用於您的作業系統的程式包。

    本文以Linux系統為例。如果您還沒有Linux環境,可購買阿里雲ECS執行個體,詳情請參見步驟一:建立ECS執行個體

  2. 將程式包解壓到/usr/local/bin目錄。

    如果您需要將可執行檔解壓到其他目錄,請按照以下方法為其定義全域路徑:

  3. 執行terraform命令驗證路徑配置。

    執行成功後,返回如下結果。運行terraform

  4. 建立RAM使用者,並為其授權。

    為提高許可權管理的靈活性和安全性,建議您建立RAM使用者,並為其授權。

    1. 登入RAM控制台

    2. 建立名為Terraform的RAM使用者,並為該使用者建立AccessKey。

      具體操作方法請參見建立RAM使用者

      重要

      請不要使用阿里雲帳號的AccessKey配置Terraform工具。

    3. 為RAM使用者授權。

      本樣本為使用者Terraform授予AliyunElasticsearchFullAccessAliyunVPCFullAccess許可權,具體操作方法請參見為RAM使用者授權

  5. 建立測試目錄。

    因為每個Terraform專案都需要建立一個獨立的執行目錄,所以需要先建立一個測試目錄。以下建立一個名為terraform-test的測試目錄。

    mkdir terraform-test
  6. 進入terraform-test目錄。

    cd terraform-test
  7. 建立設定檔,並配置身份認證資訊。

    Terraform在運行時,會讀取該目錄下所有的*.tf*.tfvars檔案。請按照實際需求,將配置資訊寫入到不同的檔案中。以下列出幾個常用的設定檔。

    設定檔

    說明

    provider.tf

    provider配置。

    terraform.tfvars

    配置provider要用到的變數。

    varable.tf

    通用變數。

    resource.tf

    資源定義。

    data.tf

    包檔案定義。

    output.tf

    輸出檔案定義。

    例如建立provider.tf檔案時,使用vim provider.tf開啟檔案,並按照以下格式配置您的身份認證資訊。

    provider "alicloud" {
        region      = "cn-hangzhou"
        access_key  = "LTA**********NO2"
        secret_key   = "MOk8x0*********************wwff"
        }

    更多配置資訊請參見alicloud_elasticsearch_instance

  8. 使用mkdir -p plugh命令,在目前的目錄下建立plugh目錄,下載provider外掛程式並解壓到plugh目錄下。

  9. 初始化工作目錄,使用-plugin-dir指定provider所在的路徑,完成配置。

    terraform init -plugin-dir=./plugh/

    返回Terraform has been successfully initialized表示初始化成功。

    重要

    每個Terraform專案在建立Terraform工作目錄並建立設定檔後,都需要初始化工作目錄。

通過Terraform建立Elasticsearch執行個體

  1. 在測試目錄下,建立一個elastic.tf設定檔。

  2. 參考以下指令碼配置elastic.tf檔案,建立一個跨可用性區域的通用商業版6.7版本的Elasticsearch執行個體。

    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外掛程式支援的所有參數說明如下。

    參數

    是否必選

    描述

    description

    執行個體自訂名稱的描述。

    instance_charge_type

    計費模式。可選值:

    • PostPaid(預設):隨用隨付

    • PrePaid:訂用帳戶

    period

    購買時間長度(單位:月),當instance_charge_typePrePaid時有效。可選值:1~9、12、24、36,預設是1個月。

    data_node_amount

    ES叢集的資料節點的個數。可選值:2~50。

    data_node_spec

    資料節點執行個體規格。

    data_node_disk_size

    指定磁碟空間。不同類型的磁碟,支援的最大儲存空間大小不同:

    • cloud_ssd:SSD雲端硬碟,支援最大儲存2048 GB(2 TB)。

    • cloud_efficiency:高效雲端硬碟,支援最大5 TB的儲存空間,提供較為低廉的儲存能力,適合大規模資料量的日誌及分析情境。高效雲端硬碟超過2048 GB時,只能取:2560、3072、3584、4096、4608、5120。

    data_node_disk_type

    儲存類型。可選值:

    • cloud_ssd:SSD雲端硬碟。

    • cloud_efficiency:高效雲端硬碟。

    vswitch_id

    虛擬交換器的執行個體ID。

    password

    執行個體密碼,支援大小寫字母、數字、特殊字元,長度為8~32位字元。特殊字元包括!@#$%^&*()_+-=

    kms_encrypted_password

    KMS加密密碼。如果配置了password,該欄位將被忽略。passwordkms_encrypted_password必須配置一個。

    kms_encryption_context

    KMS加密上下文。只有設定了kms_encrypted_password時才有效。用於對使用kms_encrypted_password加密建立或更新的執行個體進行解密,詳情請參見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版本。

    說明

    Terraform不支援雲原生架構執行個體版本。

    private_whitelist

    設定執行個體的Virtual Private Cloud(Virtual Private Cloud)網路白名單。

    kibana_whitelist

    設定Kibana訪問白名單。

    master_node_spec

    Master節點規格。

    advancedDedicateMaster

    用於表示是否建立專有主節點,取值含義如下:

    • true:建立專有主節點。如果部署多可用性區域並且啟用專有主節點,則需要將該參數設定為true。

    • false(預設值):不建立專有主節點。

    zone_count

    可用性區域數量。取值為1~3,data_node_amount必須是該值的整數倍。

    更多參數詳情請參見alicloud_elasticsearch_instance

    重要
    • kms_encrypted_passwordkms_encryption_context參數要求provider外掛程式版本在1.57.1及以上;zone_count參數要求provider外掛程式版本在1.44.0及以上。

    • 如果需要購買除資料節點外的其他屬性節點,請參見createInstance參數開啟其他節點屬性。例如,購買多可用性區域專有主節點,指令碼中需要加入advancedDedicateMaster="true"

  3. 執行terraform plan命令,查看將會執行的操作。

    執行成功後,返回如下結果。

    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.
  4. 執行terraform apply命令,運行工作目錄中的設定檔,輸入yes

    執行成功後,返回如下結果。

    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.
  5. 登入Elasticsearch控制台,查看建立成功的Elasticsearch叢集。

    建立成功的ES叢集

通過Terraform更新Elasticsearch資源配置

  1. 進入測試目錄,修改elastic.tf設定檔。

    例如修改data_node_disk_size50

    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"
    }
    重要
    • 執行個體建立成功後,version無法修改。

    • 每次請求,只支援修改一項配置。例如同時修改data_node_specdata_node_disk_size,系統將會出現錯誤響應。

  2. 執行terraform plan查看資源配置資訊。

  3. 執行terraform apply等待資源升配結束。

將Elasticsearch資源匯入Terraform

如果Elasticsearch執行個體不是通過Terraform建立的,可通過命令,將Elasticsearch匯入到Terraform的state目錄下進行管理。

  1. 在測試目錄下,建立一個main.tf檔案。

    vim main.tf
  2. 進行資源聲明,指定所要匯入的資源在state中的存放路徑。

    resource "alicloud_elasticsearch_instance" "test" {}
  3. 開始資源匯入操作。

    terraform import alicloud_elasticsearch_instance.test  es-cn-0pp1f1y5g000h****

    執行成功後,返回如下結果。

    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.
    說明

    有關import如何?存量資源的管理,請參見一文揭秘存量雲資源的管理難題

查看Terraform管理的所有Elasticsearch資源

使用terraform show命令,查看當前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 {}
}

通過Terraform刪除Elasticsearch執行個體

警告

執行個體刪除後將不可恢複,執行個體中的所有資料將被清空。

進入測試目錄,執行terraform destroy命令,輸入yes,即可刪除該執行個體。

# 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.