全部產品
Search
文件中心

Elastic Compute Service:Terraform參考

更新時間:Apr 16, 2025

Terraform是一個開源的基礎設施即代碼工具,允許開發人員通過聲明式的語言來定義和管理基礎設施的配置,提供了一種簡潔的方式來建立、修改或刪除ECS資源,減少手動操作的繁瑣和錯誤,提高基礎設施的可管理性和可維護性。本文為您介紹如何安裝與配置Terraform、使用Terraform建立ECS執行個體。

Terraform準系統

Terraform是IT基礎架構自動化編排工具,可以用代碼來管理維護IT資源。更多資訊,請參見Terraform產品介紹

  • Terraform的命令列介面CLI(Command Line Interface)提供一種簡單機制,用於將設定檔部署到阿里雲或其他任意支援的雲上,並對其進資料列版本設定。它編寫了描述雲資源拓撲的設定檔中的基礎結構,例如虛擬機器、儲存賬戶和網路介面。

  • Terraform通過Provider支援新的基礎架構,讓您在阿里雲上能夠便於使用簡單範本語言來定義、預覽和部署雲基礎結構。

  • Terraform可以建立、修改和刪除多種阿里雲產品的相關資源。

關於阿里雲與Terraform整合的更多資訊,請參見Alibaba Cloud Provider

Terraform安裝

CloudShell

阿里雲Cloud Shell是一款協助您營運的免費產品,預裝了Terraform的組件,您可直接在Cloud Shell中運行Terraform的命令。

首先,確保您有一個合法的、有相關許可權的阿里雲帳號。

其次,開啟瀏覽器,訪問Cloud Shell的地址https://shell.alibabacloud.com

登入成功後,執行如下指令

terraform

您將看到,Terraform組件已經內建在CloudShell中,並且可以直接使用。

image

更多Cloud Shell使用方式,請參見使用雲命令列

手動安裝

使用先行編譯包

登入Terraform官網,找到對應作業系統的zip包,並下載。

在下載完成後,請將程式包解壓到/usr/local/bin其餘檔案在複製完成後均可刪除,這並不會影響Terraform正常運行。

最後,請確保Terraform目錄在PATH變數中已完成定義,不同作業系統會有所不同。

Windows

  1. 進入控制台 -> 系統 -> 系統設定 -> 環境變數。

  2. 在系統變數中向下滾動,直到找到 PATH。

  3. 單擊編輯並進行相應更改。

  4. 請務必在前一個末尾添加分號,因為這是分隔字元,即 c:\path;c:\path2

  5. 啟動新控制台以使設定生效。

更多資訊參見:在Windows系統定義全域路徑

Mac或Linux

列印您的PATH配置

echo $PATH

將Terraform二進位檔案移動到列出的位置之一。此命令假定二進位檔案當前位於您的Downloads檔案夾中並且您的PATH包含/usr/local/bin,但如果您的位置不同,您可以自訂命令中的目錄。

mv ~/Downloads/terraform /usr/local/bin/

更多資訊參見:

使用源

如果您期望從原始碼編譯二進位檔案,可以複製HashiCorp Terraform程式碼程式庫

git clone https://github.com/hashicorp/terraform.git

您將會看到如下進度提示資訊,並等待其執行完成。

image

執行完成後,您執行命令的目錄下會新增一個terraform名稱的目錄。通過cd指令進入該目錄。

cd terraform

然後,執行install 指令,這將會編譯目錄並將編譯後的包移動到$GOPATH/bin/terraform目錄中

go install

當您看到如下提示資訊,則說明正在編譯中。等待完成後即可進行下一步操作。

image

注意:如果提示zsh: command not found: go,則您需要先安裝go的環境

最終,確保terraform目錄在PATH中定義並可用。 PATH定義取決於您所使用的作業系統。

Mac或Linux

列印您的PATH配置

echo $PATH

將 Terraform 二進位檔案移動到列出的位置之一。此命令假定二進位檔案當前位於您的Downloads檔案夾中並且您的PATH包含/usr/local/bin,但如果您的位置不同,您可以自訂命令中的目錄。

mv ~/Downloads/terraform /usr/local/bin/

更多資訊參見:

Windows

  1. 進入控制台 -> 系統 -> 系統設定 -> 環境變數。

  2. 在系統變數中向下滾動,直到找到 PATH。

  3. 單擊編輯並進行相應更改。

  4. 請務必在前一個末尾添加分號,如:c:\path;c:\path2

  5. 啟動新控制台以使設定生效。

更多資訊參見:在Windows系統定義全域路徑

macOS Homebrew

Homebrew 是一款在Mac系統上經常使用的包安裝工具。藉助Homebrew可以通過簡單的指令安裝Terraform。

第一步,安裝HashiCorp的tap,用來定義包在Homebrew的位置。

brew tap hashicorp/tap

第二步,執行安裝指令,安裝Terraform

brew install hashicorp/tap/terraform
重要

安裝指令將索引最新的版本並進行安裝,如果在安裝一段時間後希望更新到最新版本。可以通過重新執行upgrade指令進行。

更新最新版本的Terraform,首先需要更新Homebrew。

brew update

然後,運行upgrade指令更新到最新版本。

brew upgrade hashicorp/tap/terraform

Linux

Alibaba Cloud Liunx

yum install -y dnf-plugin-releasever-adapter
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
yum install terraform

image

image

Windows Chocolatey

Chocolatey是一款在Mac系統上經常使用的包安裝工具。藉助Chocolatey可以通過簡單的指令安裝Terraform。

choco install terraform

Terraform 身份認證

基於環境變數配置身份認證是將訪問憑證儲存在特定的環境變數中,當執行Terraform命令時,如果配置模板中沒有顯式聲明訪問憑證,那麼將嘗試從如下的環境變數中擷取。具體環境變數的設定方式如下:

Windows

  1. 在案頭按右鍵此電腦,選擇屬性 > 進階系統設定 > 環境變數 > 系統變數/使用者變數

  2. 系統變數/使用者變數中,單擊建立,建立以下環境變數。

    變數名

    變數描述

    變數值

    ALICLOUD_ACCESS_KEY

    Access Key Id

    yourAccessKeyID

    ALICLOUD_SECRET_KEY

    Access Key Secret

    yourAccessKeySecret

    ALICLOUD_SECURITY_TOKEN(可選)

    如果是 STS 的訪問憑證,此處需要配置Security Token

    yourSTSToken

Linux

重要

使用export命令配置的臨時環境變數僅對當前會話有效,當會話退出之後所設定的環境變數將會丟失。如需長期保留環境變數,可將export命令配置到作業系統的啟動設定檔中。

# Access Key Id
$ export ALICLOUD_ACCESS_KEY="<你的 Access Key ID>"
# Access Key Secret
$ export ALICLOUD_SECRET_KEY="<你的 Access Key Secret>"
# 如果是 STS 的訪問憑證,此處需要配置 security_token
$ export ALICLOUD_SECURITY_TOKEN="<你的訪問 Token>"

設定了環境變數之後,provider塊可以不在配置模板中顯式聲明或者只聲明地區資訊:

provider "alicloud" {
  region = "cn-hangzhou"
}

當然,region也是支援通過環境變數 ALICLOUD_REGION進行配置的。如果 region 沒有顯式聲明也沒有配置環境變數,cn-beijing 將是其預設配置值。

支援的資源清單

說明

Resource:資源,指新建立的資源,用於定義基礎設施組件,例如一個ECS執行個體、一個虛擬機器、一個網路安全性群組等。

Resource

alicloud_auto_provisioning_group:用於ECS的自動設定組資源,它利用搶佔式執行個體和隨用隨付執行個體快速部署叢集。

alicloud_ecs_disk_attachment:用於為ECS執行個體掛載資料盤或系統硬碟。

alicloud_ecs_activation:用於建立ECS啟用碼,允許使用者配置描述、最大註冊執行個體數、預設執行個體名稱首碼、允許使用啟用碼的主機IP位址範圍及啟用碼的有效期間等參數,以大量註冊受管執行個體。

alicloud_ecs_auto_snapshot_policy:用於建立ECS自動快照策略,允許使用者配置自動建立快照的周期(如每周的哪幾天)、一天中的哪些時間點建立快照、快照保留天數等參數,同時也支援跨地區複製快照及其加密設定。

alicloud_ecs_auto_snapshot_policy_attachment:用於將自動快照策略附加到指定的磁碟上,允許使用者通過指定自動快照策略ID和磁碟ID來關聯兩者的配置,以實現對特定磁碟應用預設的自動快照策略。

alicloud_ecs_capacity_reservation:用於在阿里雲上建立容量預留,允許使用者為特定執行個體類型預留資源,確保在需要時能夠啟動指定數量的執行個體。

alicloud_ecs_command:資源用於在阿里雲ECS執行個體上建立命令,允許使用者通過指定命令內容(Base64編碼)、描述、是否啟用自訂參數、命令名稱、逾時時間及命令類型等參數來執行預設的指令碼命令。

alicloud_ecs_dedicated_host:用於在阿里雲上建立專用主機,並允許使用者配置如主控件類型、計費方式、自動續約周期、主機名稱及描述等參數。

alicloud_ecs_dedicated_host_cluster:用於在阿里雲上建立專用主機叢集,允許使用者配置如叢集名稱、描述、所屬可用性區域及標籤等參數,以集中管理和組織專用主機資源。

alicloud_ecs_deployment_set:用於在阿里雲上建立部署集,允許使用者通過指定部署策略、部署集名稱和描述等參數來管理和組織ECS執行個體的分布,以實現高可用性或低延遲等特定部署目標。

alicloud_ecs_disk:用於在阿里雲上建立雲端硬碟(資料盤),允許使用者配置如磁碟類型、大小、是否加密、快照ID、效能層級及標籤等參數,以滿足不同應用情境下的儲存需求。

alicloud_ecs_disk_attachment:用於在阿里雲上實現ECS執行個體與磁碟的掛載和卸載操作,允許使用者通過指定執行個體ID和磁碟ID來關聯兩者,支援設定是否隨執行個體釋放磁碟以及是否作為系統硬碟掛載等選項。

alicloud_ecs_elasticity_assurance:資源用於在阿里雲上建立彈性保障,以確保在特定地區中為指定的執行個體類型預留一定的計算資源容量。

alicloud_ecs_hpc_cluster:用於在阿里雲上建立Alibaba Cloud HPC叢集,允許使用者通過指定HPC叢集的名稱和描述來配置叢集的基礎資訊。

alicloud_ecs_image_component:用於在阿里雲上建立鏡像組件,允許使用者定義構建或測試組件的內容、類型、適用的作業系統及其他中繼資料,以便在建立自訂鏡像時複用這些組件。

alicloud_ecs_image_pipeline:用於在阿里雲上建立鏡像管道,允許使用者通過指定基礎鏡像、構建內容、執行個體類型及其他相關配置來自動化地建立和管理自訂鏡像。

alicloud_ecs_image_pipeline_execution:用於執行阿里雲上的鏡像管道任務,即根據已定義的鏡像管道來建立自訂鏡像。它通過指定鏡像管道ID來觸發鏡像構建任務,並允許使用者監控任務狀態和結果。

alicloud_ecs_invocation:用於管理和執行 ECS 執行個體上的命令調用(Invocation)。它允許使用者在一台或多台 ECS 執行個體上運行指定的命令,並擷取執行結果。

alicloud_ecs_key_pair:用於管理和建立 ECS 執行個體的金鑰組(Key Pair)。

alicloud_ecs_key_pair_attachment:用於將建立的 ECS 金鑰組綁定到指定的 ECS 執行個體。

alicloud_ecs_launch_template:用於管理 ECS 啟動模板的資源,協助使用者通過預定義的配置快速建立和部署 ECS 執行個體,提升效率並確保一致性。

alicloud_ecs_network_interface:用於管理 ECS 網路介面的資源,協助使用者配置和管理執行個體的網路連接,支援靈活的私人 IP 分配策略,適用於複雜的網路環境和高可用架構設計。

alicloud_ecs_network_interface_attachment:允許使用者將彈性網卡(ENI)附加到阿里雲的ECS執行個體上,以靈活擴充執行個體的網路功能,如增加多個IP地址或實現更複雜的網路設定。

alicloud_ecs_network_interface_permission:提供了一個ECS網路介面許可權資源。

alicloud_ecs_prefix_list:用於在阿里雲ECS服務中建立和管理首碼列表的資源。

alicloud_ecs_session_manager_status:用於在阿里雲ECS服務中管理和配置會話管理器狀態的資源,允許使用者啟用或禁用會話管理功能,以控制對ECS執行個體的訪問和管理方式。

alicloud_ecs_snapshot:用於在阿里雲中建立磁碟快照的資源,允許使用者備份指定磁碟的資料以便日後恢複或存檔。

alicloud_ecs_snapshot_group:用於在阿里雲中為一組磁碟建立快照的資源。

alicloud_ecs_storage_capacity_unit:用於在阿里雲ECS服務中建立和管理儲存容量單元的資源。

alicloud_image:用於在阿里雲上基於現有ECS執行個體建立自訂鏡像的資源。

alicloud_image_copy:用於將自訂鏡像從一個地區複製到另一個地區。

alicloud_image_export: 用於將自訂鏡像匯出到與該自訂鏡像同一地區的OSS儲存桶中。

alicloud_image_import: 用於提供ECS鏡像匯入功能。

alicloud_image_share_permission:用於管理鏡像共用許可權。

alicloud_instance:用於提供ECS執行個體資源

alicloud_ecs_key_pair:用於提供ECS金鑰組資源。

alicloud_ecs_key_pair_attachment:用於將金鑰組綁定到多個ECS執行個體。

alicloud_ecs_launch_template:用於提供ECS啟動模板資源。

alicloud_ecs_network_interface:用於提供ECS網路介面資源。

alicloud_ecs_network_interface_attachment:用於提供ECS網路介面附加資源。

alicloud_ram_role_attachment:用於為多個ECS執行個體綁定RAM角色。

alicloud_reserved_instance:用於提供預留執行個體券資源。

alicloud_security_group: 用於提供ECS安全性群組資源。

alicloud_security_group_rule:用於提供安全性群組規則資源。

alicloud_ecs_snapshot:用於提供ECS快照資源。

alicloud_ecs_auto_snapshot_policy:用於提供ECS自動快照策略資源。

使用Terraform建立並管理ECS

下文以建立ECS為例,介紹如何使用Terraform建立並管理ECS資源。

  1. 建立一個工作目錄,並在該工作目錄中建立名為main.tf的設定檔。以下代碼將建立一個ECS執行個體,以及建立ECS執行個體所需的VPC、安全性群組與交換器資源。將以下代碼複製到main.tf中。

    # 定義一個變數region,預設值為"cn-beijing",用於指定阿里雲地區
    variable "region"{
      default = "cn-beijing"
    }
    
    # 配置阿里雲provider,使用變數region中定義的地區
    provider "alicloud"{
      region = var.region
    }
    
    # 定義一個字串類型的變數instance_type,預設值為"ecs.e-c1m1.large",用於指定ECS執行個體類型
    variable "instance_type" {
      type    = string
      default = "ecs.e-c1m1.large"
    }
    
    # 使用資料來源查詢可用性區域資訊,通過指定的執行個體類型、資源建立類型(如VSwitch)以及磁碟種類來過濾結果
    data "alicloud_zones" "default" {
      available_instance_type     = var.instance_type
      available_resource_creation = "VSwitch"
      available_disk_category     = "cloud_essd"
    }
    
    # 定義一個變數vpc_cidr_block,預設值為"172.16.0.0/16",用於指定VPC的CIDR塊
    variable "vpc_cidr_block" {
      default = "172.16.0.0/16"
    }
    
    # 定義一個變數vsw_cidr_block,預設值為"172.16.0.0/24",用於指定VSwitch的CIDR塊
    variable "vsw_cidr_block" {
      default = "172.16.0.0/24"
    }
    
    # 產生一個介於10000到99999之間的隨機整數,用於確保某些資源名稱的唯一性
    resource "random_integer" "default" {
      min = 10000
      max = 99999
    }
    
    # 建立名為vpc-test的VPC,並使用隨機整數確保名稱唯一性
    resource "alicloud_vpc" "vpc" {
      vpc_name   = "vpc-test_${random_integer.default.result}"
      cidr_block = var.vpc_cidr_block
    }
    
    # 建立安全性群組,名稱包含隨機整數以保證唯一性,並關聯至上述VPC
    resource "alicloud_security_group" "group" {
      security_group_name = "test_${random_integer.default.result}"  # 替換了這裡的欄位名
      vpc_id              = alicloud_vpc.vpc.id
    }
    
    # 建立一條允許所有TCP流量進入的安全性群組規則,與之前建立的安全性群組關聯
    resource "alicloud_security_group_rule" "allow_all_tcp" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"  # 修改了這裡,將nic_type改為'intranet'
      policy            = "accept"
      port_range        = "1/65535"
      priority          = 1
      security_group_id = alicloud_security_group.group.id
      cidr_ip           = "0.0.0.0/0"
    }
    
    # 建立VSwitch,名稱中包含隨機整數以確保唯一性,並與VPC、可用性區域關聯
    resource "alicloud_vswitch" "vswitch" {
      vpc_id       = alicloud_vpc.vpc.id
      cidr_block   = var.vsw_cidr_block
      zone_id      = data.alicloud_zones.default.zones[0].id
      vswitch_name = "vswitch-test-${random_integer.default.result}"
    }
    
    # 建立ECS執行個體,設定多個參數如可用性區域、安全性群組、執行個體類型等,並使用隨機整數保證執行個體名稱的唯一性
    resource "alicloud_instance" "instance" {
      availability_zone          = data.alicloud_zones.default.zones[0].id
      security_groups            = [alicloud_security_group.group.id]
      instance_type              = var.instance_type
      system_disk_category       = "cloud_essd"
      system_disk_name           = "test_foo_system_disk_${random_integer.default.result}"
      system_disk_description    = "test_foo_system_disk_description"
      image_id                   = "aliyun_2_1903_x64_20G_alibase_20240628.vhd"
      instance_name              = "test_ecs_${random_integer.default.result}"
      vswitch_id                 = alicloud_vswitch.vswitch.id
      internet_max_bandwidth_out = 10
      password                   = "Terraform@Example" # 使用者根據自己實際情況修改
    }
  2. 執行如下命令,初始化Terraform運行環境。

    terraform init

    返回資訊如下,則Terraform初始化成功。

    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
  3. 執行如下命令,開始執行代碼。

    terraform apply

    在執行過程中,根據提示輸入yes並按下Enter鍵,等待命令執行完成,若出現以下資訊,則表示代碼執行成功。

    You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure.
    
    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
    
    
    Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

  4. 結果驗證

執行terraform show命令

您可以在工作目錄中,使用以下命令查詢Terraform已建立資源的詳細資料:

terraform show

image

登入控制台查看

登入雲端服務器管理主控台,進入執行個體與鏡像 > 執行個體頁面,左上方選擇地區,此例中選擇華北2(北京),查看已建立的ECS執行個體。

image

相關文檔