全部產品
Search
文件中心

Elastic Compute Service:通過Terraform建立並使用ECS執行個體

更新時間:Dec 18, 2024

Terraform是一款IaC工具(Infrastructure as Code),旨在協助開發人員和營運團隊自動化基礎設施的建立、部署和管理。您可以通過編寫簡潔的代碼來定義和配置雲端基礎設施,而不必手動操作和配置。本文為您介紹如何通過Terraform建立ECS執行個體。

說明

如需瞭解更多Terraform相關內容,請參見Terraform產品介紹

準備工作

1. 安裝Terraform

本文以在Linux或Windows系統中使用程式包安裝Terraform為例。

說明

阿里雲提供了兩種Terraform線上環境,無需手動安裝Terraform即可實現對Terraform命令的執行:

  1. Terraform Explorer:點擊一鍵運行,自動運行本文所提供的Terraform代碼。

  2. Cloud Shell:複製本文所提供的代碼,在Cloud Shell中直接執行Terraform命令。

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

  2. 配置Terraform運行環境。

    Linux

    執行以下命令將程式包解壓到/usr/local/bin

    # 將{your_zip_path}替換為程式包所在路徑,若系統不支援unzip命令,請先安裝。
    sudo unzip {your_zip_path} -d /usr/local/bin

    Windows

    1. 解壓程式包,例如解壓後的目錄為D:\tool\terraform

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

    3. 在系統變數/使用者變數中單擊Path,選擇編輯 > 建立,輸入Terraform的解壓目錄(如D:\tool\terraform),單擊確定完成配置。

  3. 運行terraform驗證路徑配置。

    terraform

    命令運行後將顯示可用的Terraform選項的列表,如下所示,表示安裝完成。

    image.png

2. 配置Terraform身份認證

Terraform身份認證是指在通過Terraform操作阿里雲基礎設施之前,對阿里雲Terraform Provider進行身分識別驗證。只有在身份認證成功後,才能與阿里雲API進行通訊,並建立和管理阿里雲的基礎設施資源。

說明

您如果使用Terraform Explorer或者Cloud Shell,則無需手動設定身份認證資訊,只需確保所登入的帳號具有操作VPC和ECS的許可權即可。

本文以在環境變數中使用RAM使用者AccessKey配置身份認證為例:

  1. 由於阿里雲帳號(主帳號)擁有資源的所有許可權,其AccessKey一旦泄露風險巨大,所以建議您使用RAM使用者的AccessKey。如何建立RAM使用者的AccessKey,請參見建立AccessKey

  2. 在為RAM使用者授予操作Elastic Compute Service及Virtual Private Cloud相關資源的許可權時,建議所授與權限應遵循最小許可權原則。有關如何為RAM使用者進行授權的詳細資料,請參見為RAM使用者授權。本文提供的範例程式碼需要建立ECS、VPC、交換器等資源,為便於執行本文中的樣本,您可以為授予RAM使用者以下許可權:

    雲產品

    授予許可權

    Virtual Private Cloud

    本樣本選擇系統策略:AliyunVPCFullAccess

    Elastic Compute Service

    本樣本選擇系統策略:AliyunECSFullAccess

  3. 建立環境變數,存放身份認證資訊。

    Linux

    重要

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

    # AccessKey Id
    export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********"
    # AccessKey Secret
    export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************"
    # 資源將要部署的地區
    export ALICLOUD_REGION="cn-beijing"

    Windows

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

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

      變數名

      變數描述

      變數值

      ALICLOUD_ACCESS_KEY

      AccessKey Id

      樣本:LTAIUrZCw3********

      ALICLOUD_SECRET_KEY

      AccessKey Secret

      樣本:zfwwWAMWIAiooj14GQ2*************

      ALICLOUD_REGION

      資源將要部署的地區

      樣本:cn-beijing

涉及的Terraform資源

本文所提供的範例程式碼中,所涉及到的Terraform資源資訊。

說明

本教程樣本包含的部分資源會產生一定費用,請在不需要時及時進行釋放或退訂。

Resource

Data Source

alicloud_zones:動態查詢可以建立特定執行個體規格的可用性區域。

編寫Terraform設定檔

在main.tf中定義建立ECS所需的基礎設施資源,例如ECS、VPC等。您可以直接複製下方完整樣本中的代碼到設定檔中

  1. 建立設定檔。

    Terraform的基礎設施資源是在設定檔中進行定義的,因此必須首先建立一個設定檔。

    Linux

    # 建立工作目錄
    mkdir terraform-projects && cd terraform-projects
    mkdir ecs-quickstart && cd ecs-quickstart
    # 建立設定檔並編輯
    touch main.tf && vim main.tf

    Windows

    建立一個新的檔案夾,例如命名為ecs-quickstart,並在該檔案夾內建立一個Terraform設定檔,例如設定檔名稱為main.tf

  2. 定義Provider配置。

    配置阿里雲資源部署的地區。

    # 資源所在的地區
    variable "region" {
      default = "cn-chengdu"
    }
    
    provider "alicloud" {
      region = var.region
    }
  3. 定義Virtual Private Cloud及其子網。

    VPC是一種專有的雲上私人網路,允許使用者在公用雲上配置和管理一個邏輯隔離的網路地區。

    variable "instance_name" {
      default = "tf-sample"
    }
    
    # ecs執行個體規格
    variable "instance_type" {
      default = "ecs.e-c1m2.large"
    }
    
    # 查詢滿足條件的可用性區域
    data "alicloud_zones" "default" {
      available_disk_category     = "cloud_essd"
      available_resource_creation = "VSwitch"
      available_instance_type     = var.instance_type
    }
    
    # 建立VPC
    resource "alicloud_vpc" "vpc" {
      vpc_name   = var.instance_name
      cidr_block = "172.16.0.0/12"
    }
    
    # 建立交換器
    resource "alicloud_vswitch" "vsw" {
      vpc_id     = alicloud_vpc.vpc.id
      cidr_block = "172.16.0.0/21"
      zone_id    = data.alicloud_zones.default.zones.0.id
    }
  4. 定義安全性群組。

    安全性群組是一種虛擬防火牆,能夠控制ECS執行個體的出入方向流量。

    # 建立安全性群組
    resource "alicloud_security_group" "default" {
      name   = var.instance_name
      vpc_id = alicloud_vpc.vpc.id
    }
    
    # 為安全性群組入方向添加規則
    resource "alicloud_security_group_rule" "allow_tcp_22" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "22/22"
      priority          = 1
      security_group_id = alicloud_security_group.default.id
      cidr_ip           = "0.0.0.0/0"
    }
  5. 定義ECS執行個體。

    使用ECS,您可以快速部署和運行應用程式,靈活調整資源以應對業務變化,同時享受高效能、高安全性和低成本的計算能力,適用於網站託管、應用開發、資料處理等多種情境。

    # ecs執行個體鏡像ID
    variable "image_id" {
      default = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
    }
    
    # ecs執行個體公網頻寬
    variable "internet_bandwidth" {
      default = "10"
    }
    
    # ecs執行個體登入密碼
    variable "password" {
      default = "Test@12345"
    }
    
    # 指定建立ECS的數量,預設值是 1
    variable "ecs_count" {
      default = 1
    }
    
    # 建立ECS執行個體
    resource "alicloud_instance" "instance" {
      count                      = var.ecs_count
      availability_zone          = data.alicloud_zones.default.zones.0.id
      security_groups            = alicloud_security_group.default.*.id
      password                   = var.password
      instance_type              = var.instance_type
      system_disk_category       = "cloud_essd"
      image_id                   = var.image_id
      instance_name              = var.instance_name
      vswitch_id                 = alicloud_vswitch.vsw.id
      internet_max_bandwidth_out = var.internet_bandwidth
    }
    
    output "public_ip" {
      value = alicloud_instance.instance.*.public_ip
    }
    

完整樣本

說明

當前範例程式碼支援一鍵運行,您可以直接運行代碼。一鍵運行

variable "region" {
  default = "cn-chengdu"
}

provider "alicloud" {
  region = var.region
}

variable "instance_name" {
  default = "tf-sample"
}

variable "instance_type" {
  default = "ecs.e-c1m2.large"
}

data "alicloud_zones" "default" {
  available_disk_category     = "cloud_essd"
  available_resource_creation = "VSwitch"
  available_instance_type     = var.instance_type
}

resource "alicloud_vpc" "vpc" {
  vpc_name   = var.instance_name
  cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vsw" {
  vpc_id     = alicloud_vpc.vpc.id
  cidr_block = "172.16.0.0/21"
  zone_id    = data.alicloud_zones.default.zones.0.id
}

resource "alicloud_security_group" "default" {
  name   = var.instance_name
  vpc_id = alicloud_vpc.vpc.id
}

resource "alicloud_security_group_rule" "allow_tcp_22" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "22/22"
  priority          = 1
  security_group_id = alicloud_security_group.default.id
  cidr_ip           = "0.0.0.0/0"
}

variable "image_id" {
  default = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
}

variable "internet_bandwidth" {
  default = "10"
}

variable "password" {
  default = "Test@12345"
}

variable "ecs_count" {
  default = 1
}

resource "alicloud_instance" "instance" {
  count                      = var.ecs_count
  availability_zone          = data.alicloud_zones.default.zones.0.id
  security_groups            = alicloud_security_group.default.*.id
  password                   = var.password
  instance_type              = var.instance_type
  system_disk_category       = "cloud_essd"
  image_id                   = var.image_id
  instance_name              = var.instance_name
  vswitch_id                 = alicloud_vswitch.vsw.id
  internet_max_bandwidth_out = var.internet_bandwidth
}

output "public_ip" {
  value = [for i in range(var.ecs_count) : alicloud_instance.instance[i].public_ip]
}

運行Terraform命令建立資源

在完成Terraform設定檔編寫後,運行Terraform命令來完成ECS執行個體的自動建立。

1. 初始化Terraform

terraform init命令用於下載並安裝阿里雲供應商的外掛程式到當前檔案夾中,同時還會產生各類記錄檔案。

Linux

terraform init

Windows

開啟命令提示字元cmd,在cmd中切換到Terraform設定檔所在檔案夾,然後執行terraform init命令進行初始化。

# 例如設定檔路徑 D:/ecs-quickstart
# 切換到 D盤
d:
# 切換到設定檔所在檔案夾路徑的命令,ecs-quickstart是設定檔所在檔案夾路徑,您可根據實際路徑替換。
cd ecs-quickstart
# 執行初始化命令
terraform init
說明

當您因網路延遲等原因導致terraform init逾時,無法正常下載Provider等情況時,可通過配置阿里雲鏡像站解決,具體操作步驟,請參見Terraform Init 加速方案配置

如下所示的資訊表示初始化成功。

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.

2. 預覽Terraform代碼

運行terraform plan實現如下功能:

  • 驗證main.tf中Terraform代碼的文法是否正確。

  • 顯示當前Terraform代碼將要建立的資源的預覽結果。

terraform plan

如果顯示如下所示的資訊表示Terraform檔案無語法錯誤,可以執行terraform apply命令建立資源。若出現其他報錯提示,請根據提示修改Terraform設定檔。

...

Plan: 5 to add, 0 to change, 0 to destroy.

3. 執行Terraform代碼

運行terraform apply以完成ECS執行個體及其依賴資源的自動建立和Python的自動安裝。在建立過程中,需要按照提示輸入yes,以允許Terraform建立所有定義的資源。

terraform apply

如下所示的資訊表示ECS及所依賴資源均已建立成功。

...

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_vpc.vpc: Creating...
alicloud_vpc.vpc: Creation complete after 6s [id=vpc-2vcsghlpznz74XXXXXXXX]
alicloud_security_group.default: Creating...
alicloud_vswitch.vsw: Creating...
alicloud_security_group.default: Creation complete after 1s [id=sg-2vcdz6b8h9c3XXXXXXXX]
alicloud_security_group_rule.allow_tcp_22: Creating...
alicloud_security_group_rule.allow_tcp_22: Creation complete after 0s [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1]
alicloud_vswitch.vsw: Creation complete after 4s [id=vsw-2vc50dknug30bXXXXXXXX]
alicloud_instance.instance: Creating...
alicloud_instance.instance: Still creating... [10s elapsed]
alicloud_instance.instance: Creation complete after 15s [id=i-2vc3rf151bwcXXXXXXXX]

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

Outputs:

public_ip = [
  "4XX.XXX.XXX.XX7",
]

串連ECS執行個體

當ECS執行個體成功建立後,您可以通過SSH協議遠程登入到指定公網IP的ECS。更多遠端連線方式,請參見串連方式概述

ssh <使用者名稱>@<公網IP>

查看結果

使用Terraform命令

您可以通過以下命令查看已建立的ECS執行個體資訊。

# 命令格式:terraform state show <資源類型>.<資源別名>
terraform state show alicloud_instance.instance

登入控制台查看

您可以登入ECS管理主控台查看已建立的ECS執行個體。image

資源變更

當您需要調整配置時,可以通過直接修改設定檔中的資源定義來實現,例如添加新的安全性群組入方向的允許存取規則。

  1. 若您希望在安全性群組入方向規則中添加443連接埠的允許存取規則,您可以在設定檔中添加以下代碼。

    resource "alicloud_security_group_rule" "allow_tcp_443" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "443/443"
      priority          = 1
      security_group_id = alicloud_security_group.default.id
      cidr_ip           = "0.0.0.0/0"
    }
  2. 執行terraform plan命令預覽所做的變更。如下所示的資訊表示將要為安全性群組ID是sg-2vcdz6b8h9c3XXXXXXXX的安全性群組增加一條安全性群組規則。

    ...
    
    Terraform will perform the following actions:
    
      # alicloud_security_group_rule.allow_tcp_443 will be created
      + resource "alicloud_security_group_rule" "allow_tcp_443" {
          + cidr_ip           = "0.0.0.0/0"
          + id                = (known after apply)
          + ip_protocol       = "tcp"
          + nic_type          = "intranet"
          + policy            = "accept"
          + port_range        = "443/443"
          + prefix_list_id    = (known after apply)
          + priority          = 1
          + security_group_id = "sg-2vcdz6b8h9c3XXXXXXXX"
          + type              = "ingress"
        }
    
    Plan: 1 to add, 0 to change, 0 to destroy.
  3. 如果變更符合預期,執行terraform apply命令將變更應用到您的基礎設施。在執行該命令時,Terraform將要求您確認是否進行變更,請鍵入yes並按斷行符號鍵確認。如下所示的資訊表示已為安全性群組ID是sg-2vcdz6b8h9c3XXXXXXXX的安全性群組新增規則成功。

    ...
    
    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_security_group_rule.allow_tcp_443: Creating...
    alicloud_security_group_rule.allow_tcp_443: Creation complete after 0s [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

釋放資源

當您不再需要上述通過Terraform建立或管理的資源時,運行下面的命令釋放資源。

terraform 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_security_group_rule.allow_tcp_443: Destroying... [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1]
alicloud_security_group_rule.allow_tcp_22: Destroying... [id=sg-2vcdz6b8h9c3XXXXXXXX:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1]
alicloud_instance.instance: Destroying... [id=i-2vc3rf151bwcXXXXXXXX]
alicloud_security_group_rule.allow_tcp_22: Destruction complete after 0s
alicloud_security_group_rule.allow_tcp_443: Destruction complete after 0s
alicloud_instance.instance: Still destroying... [id=i-2vc3rf151bwcXXXXXXXX, 10s elapsed]
alicloud_instance.instance: Destruction complete after 10s
alicloud_security_group.default: Destroying... [id=sg-2vcdz6b8h9c3XXXXXXXX]
alicloud_vswitch.vsw: Destroying... [id=vsw-2vc50dknug30bXXXXXXXX]
alicloud_security_group.default: Destruction complete after 1s
alicloud_vswitch.vsw: Destruction complete after 8s
alicloud_vpc.vpc: Destroying... [id=vpc-2vcsghlpznz74XXXXXXXX]
alicloud_vpc.vpc: Destruction complete after 6s

Destroy complete! Resources: 6 destroyed.

相關文檔

  • ECS支援的ResourceData Source請參考支援的資源清單

  • 在Terraform Explorer中使用Terraform,無需安裝和配置Terraform即可對Terraform代碼進行調試。

  • Cloud Shell中使用Terraform,無需安裝和配置Terraform即可手動執行Terraform命令。