本文為您介紹在Windows中,如何快速使用Terraform建立阿里雲資源。
使用Terraform進行基礎設施即代碼(IaC)管理,包含以下幾個主要步驟。
-
安裝Terraform:確保您的系統能夠識別並執行Terraform命令。
-
編寫Terraform設定檔:設定檔是Terraform的核心,用於描述資源的建立、配置和依賴關係,如建立VPC、ECS、OSS等。
-
初始化與建立資源:將基礎設施設計變為現實的關鍵步驟。
-
查看和管理資源:在部署後,可以便捷地查看和管理基礎設施環境,確保其符合最新的需求和設計。
-
銷毀資源:當不再需要所建立的資源時,可以銷毀相應目錄下已建立資源。
1. 安裝Terraform
-
訪問Terraform官網,下載適合您的Windows作業系統版本的Terraform二進位檔案並解壓。
下載頁面提供 386 和 AMD64 兩種架構的安裝包,選擇適合的架構後單擊 Download 下載。
-
配置環境變數,將Terraform的安裝路徑添加到系統內容變數Path中。
-
在案頭按右鍵此電腦,選擇屬性 -> 進階系統設定 -> 環境變數 -> 系統變數/使用者變數。
-
在系統變數/使用者變數中單擊Path,選擇編輯 -> 建立,輸入檔案所在目錄的路徑,單擊確定完成配置。
-
-
驗證安裝成功,同步選取Win+R鍵,輸入
cmd單擊確定,開啟命令提示字元。執行terraform --version,如果出現以下資訊則表示安裝成功。Terraform v1.9.3 on windows_amd64
2. 編寫Terraform設定檔
設定檔是Terraform的核心,用於定義在雲端或本地部署的基礎設施資源,如VPC、ECS、OSS等。
-
建立一個新的檔案夾,例如命名為ecs,並在該檔案夾下建立一個Terraform設定檔,例如設定檔名稱為main.tf。
為每個Terraform專案建立獨立執行目錄可以確保資源群組織清晰,避免狀態檔案混淆,便於版本控制和團隊協作,同時有利於實現環境隔離和模組化管理,提高組態管理的可維護性和安全性。
-
編寫Terraform設定檔,以建立ECS為例。將 ECS 執行個體及其依賴的資源(VPC,安全性群組等)以代碼化的方式定義到設定檔中。為了方便起見,您可以將以下代碼複製到main.tf中。
重要-
樣本中建立的ECS為隨用隨付,資源建立後將會產生相關費用。
-
樣本中使用了環境變數作為Terraform認證方式,更多資訊,請參見Terraform身份認證。
建立ECS所需要的資源如下:
Resource
說明
建立VPC執行個體
建立vSwitch執行個體
建立安全性群組執行個體
建立安全性群組的出入訪問規則
建立ECS執行個體
variable "name" { type = string default = "tf-test" } # 設定地區 variable "region" { type = string default = "cn-beijing" } # 公網頻寬,當大於0的時候,將為執行個體分配一個公網。 variable "internet_max_bandwidth_out" { type = number default = 10 } # 設定ECS執行個體規格 variable "instance_type" { type = string default = "ecs.e-c1m1.large" } # 設定鏡像ID variable "image_id" { default = "ubuntu_18_04_64_20G_alibase_20190624.vhd" } # 設定標籤 variable "tags" { type = map(string) default = { From = "Terraform" Usage = "demo" } } provider "alicloud" { region = var.region } # 擷取zone_id data "alicloud_zones" "default" { available_instance_type = var.instance_type available_resource_creation = "VSwitch" available_disk_category = "cloud_ssd" } # 建立VPC resource "alicloud_vpc" "vpc" { vpc_name = var.name cidr_block = "172.16.0.0/12" } # 建立vswitch 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.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" } # 建立ECS resource "alicloud_instance" "instance" { availability_zone = data.alicloud_zones.default.zones.0.id security_groups = alicloud_security_group.default.*.id instance_type = var.instance_type system_disk_category = "cloud_essd_entry" image_id = var.image_id instance_name = var.name vswitch_id = alicloud_vswitch.vsw.id internet_max_bandwidth_out = var.internet_max_bandwidth_out tags = var.tags } output "ecs_id" { value = alicloud_instance.instance.id } output "ecs_ip" { value = alicloud_instance.instance.public_ip } -
3. 初始化與建立資源
Terraform設定檔編寫完成後,需要先初始化工作目錄,然後再建立資源。
3.1 Terraform初始化
在cmd中切換到步驟2所建立的檔案夾,然後執行terraform init命令進行初始化。terraform init命令是使用任何Terraform設定檔之前必須執行的第一個命令,主要目的是初始化一個Terraform工作目錄,包括下載必要的阿里雲供應商外掛程式以及各種其他記錄檔案。
# 切換到D盤
d:
# 切換到步驟2中的檔案夾路徑的命令,tool/terraform/projects/ecs是步驟2建立的檔案夾路徑,您可根據實際路徑替換。
cd tool/terraform/projects/ecs
# 執行初始化命令
terraform init
3.2 建立資源
-
執行
terraform plan建立一個執行計畫,並詳細展示了在執行 terraform apply 時將建立、修改或銷毀的所有資源資訊。... + router_table_id = (known after apply) + secondary_cidr_blocks = (known after apply) + status = (known after apply) + user_cidrs = (known after apply) + vpc_name = "tf_vpc_test" } # alicloud_vswitch.vsw will be created + resource "alicloud_vswitch" "vsw" { + availability_zone = (known after apply) + cidr_block = "172.16.0.0/21" + create_time = (known after apply) + id = (known after apply) + ipv6_cidr_block = (known after apply) + ipv6_cidr_block_mask = (known after apply) + name = (known after apply) + status = (known after apply) + vpc_id = (known after apply) + vswitch_name = (known after apply) + zone_id = "cn-beijing-a" } Plan: 5 to add, 0 to change, 0 to destroy. Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now. -
執行
terraform apply時,將根據terraform plan產生的執行計畫來建立資源。在建立過程中,需要按照提示輸入yes,以繼續建立資源。關於變數如何傳值,請參見Variable中的變數設定方式。Plan: 5 to add, 0 to change, 0 to destroy. Changes to Outputs: + ecs_id = (known after apply) + ecs_ip = (known after apply) 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 7s [id=vpc-2zexxx5: xxxk5w] alicloud_security_group.default: Creating... alicloud_vswitch.vsw: Creating... alicloud_security_group.default: Creation complete after 2s [id=sg-2zexxx4xxx9pa] alicloud_security_group_rule.allow_tcp_22: Creating... alicloud_security_group_rule.allow_tcp_22: Creation complete after 0s [id=sg-2zexxx4xxx9pa:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1] alicloud_vswitch.vsw: Creation complete after 4s [id=vsw-2zexxxxxxxxxxxgwdf] alicloud_instance.instance: Creating... alicloud_instance.instance: Still creating... [10s elapsed] alicloud_instance.instance: Creation complete after 14s [id=i-2zexxxxxxxxxxxkmo] Apply complete! Resources: 5 added, 0 changed, 0 destroyed. Outputs: ecs_id = "i-2zexxxxxxxxxxxkmo" ecs_ip = "3x.1xx.1xx.x41"
4. 查看和管理資源
在部署後,您也能輕鬆地管理和維護您的基礎設施環境,確保其符合最新的需求和設計。
4.1 查看資源
-
通過
terraform show命令查看資源的詳細資料。D:\tool\terraform\projects\ecs>terraform show # data.alicloud_zones.default: data "alicloud_zones" "default" { available_disk_category = "cloud_ssd" available_instance_type = "ecs.e-c1m1.large" available_resource_creation = "VSwitch" enable_details = false id = "2398922967" ids = [ "cn-beijing-a", "cn-beijing-c", "cn-beijing-e", "cn-beijing-f", "cn-beijing-g", "cn-beijing-h", "cn-beijing-i", ] instance_charge_type = "PostPaid" multi = false spot_strategy = "NoSpot" zones = [ { available_disk_categories = [] available_instance_types = [] available_resource_creation = [] id = "cn-beijing-a" local_name = null multi_zone_ids = [] slb_slave_zone_ids = [] } ] } -
通過
terraform state list命令列出所有已建立的資源。D:\tool\terraform\projects\ecs>terraform state list data.alicloud_zones.default alicloud_instance.instance alicloud_security_group.default alicloud_security_group_rule.allow_tcp_22 alicloud_vpc.vpc alicloud_vswitch.vsw -
通過
terraform state show <資源類型>.<資源名稱>查看某個資源的詳細資料。D:\tool\terraform\projects\ecs>terraform state show alicloud_vpc.vpc # alicloud_vpc.vpc: resource "alicloud_vpc" "vpc" { cidr_block = "172.16.0.0/12" classic_link_enabled = false create_time = "2024-09-09T05:54:41Z" description = null enable_ipv6 = false id = "vpc-2zexxx" ipv6_cidr_block = null ipv6_cidr_blocks = [] name = "tf-test" resource_group_id = "rg-acfxxx" route_table_id = "vtb-2zexxx" router_id = "vrt-2zexxx" router_table_id = "vtb-2zexxx" secondary_cidr_blocks = [] status = "Available" system_route_table_description = null system_route_table_name = null user_cidrs = [] vpc_name = "tf-test" } -
通過阿里雲控制台查看已建立資源資訊。
4.2 管理資源
Terraform在完成資源的建立和修改後,會將資源的狀態和屬性資訊儲存在terraform.tfstate檔案中。我們可以使用terraform state相關命令對state進行管理。更多資訊,請參見狀態原理介紹。
4.3 資源變更
-
修改設定檔(如main.tf或者其他.tf檔案)中需要變更的資源定義,例如您想添加新的安全性群組入方向允許存取規則。
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" } -
執行
terraform plan命令預覽所做的變更。Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # alicloud_security_group_rule.allow_tcp_22 will be created + resource "alicloud_security_group_rule" "allow_tcp_22" { + cidr_ip = "0.0.0.0/0" + id = (known after apply) + ip_protocol = "tcp" + nic_type = "intranet" + policy = "accept" + port_range = "22/22" + prefix_list_id = (known after apply) + priority = 1 + security_group_id = "sg-2zexxx9pa" + type = "ingress" } # 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-2zexxx9pa" + type = "ingress" } Plan: 2 to add, 0 to change, 0 to destroy. -
如果變更符合預期,執行
terraform apply命令,來應用這些變更到您的基礎設施。執行此命令時,Terraform會要求您確認是否確實要進行這些變更。輸入yes並斷行符號後,變更會被應用。Plan: 2 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_security_group_rule.allow_tcp_22: Creating... alicloud_security_group_rule.allow_tcp_443: Creating... alicloud_security_group_rule.allow_tcp_22: Creation complete after 1s [id=sg-2zexxx:xxx:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1] alicloud_security_group_rule.allow_tcp_443: Creation complete after 1s [id=sg-2zexxx:xxx:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1] Apply complete! Resources: 2 added, 0 changed, 0 destroyed. Outputs: ecs_id = "i-2zexxx" ecs_ip = "3x.xxx.xxx.x41"
5. 資源銷毀
當不再需要所建立的資源時,可以通過terraform destroy命令銷毀所有已建立的資源。
Plan: 0 to add, 0 to change, 6 to destroy.
Changes to Outputs:
- ecs_id = "i-2zxxx" -> null
- ecs_ip = "3xxx" -> null
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-2zexxx:ingress:tcp:443/443:intranet:0.0.0.0/0:accept:1]
alicloud_security_group_rule.allow_tcp_22: Destroying... [id=sg-2zexxx:ingress:tcp:22/22:intranet:0.0.0.0/0:accept:1]
alicloud_instance.instance: Destroying... [id=i-2zexxxkmo]
alicloud_security_group_rule.allow_tcp_443: Destruction complete after 1s
alicloud_security_group_rule.allow_tcp_22: Destruction complete after 1s
alicloud_instance.instance: Still destroying... [id=i-2zexxxkmo, 10s elapsed]
alicloud_instance.instance: Destruction complete after 12s
alicloud_security_group.default: Destroying... [id=sg-2zexxxpa]
alicloud_vswitch.vsw: Destroying... [id=vsw-2zexxxvdf]
alicloud_security_group.default: Destruction complete after 2s
alicloud_vswitch.vsw: Destruction complete after 8s
alicloud_vpc.vpc: Destroying... [id=vpc-2zexxxk5w]
alicloud_vpc.vpc: Destruction complete after 6s
Destroy complete! Resources: 6 destroyed.