Terraform是一款IaC工具(Infrastructure as Code),旨在幫助開發人員和運維團隊自動化基礎設施的創建、部署和管理。您可以通過編寫簡潔的代碼來定義和配置云端基礎設施,而不必手動操作和配置。本文為您介紹如何通過Terraform創建ECS實例。
如需了解更多Terraform相關內容,請參見Terraform產品介紹。
準備工作
1. 安裝Terraform
本文以在Linux或Windows系統中使用程序包安裝Terraform為例,更多安裝方式,請參見Terraform 安裝。
阿里云提供了兩種Terraform在線環境,無需手動安裝Terraform即可實現對Terraform命令的執行:
Terraform Explorer:點擊一鍵運行,自動運行本文所提供的Terraform代碼。
Cloud Shell:復制本文所提供的代碼,在Cloud Shell中直接執行Terraform命令。
進入Terraform官網下載適用于您的操作系統的程序包。
配置Terraform運行環境。
Linux
執行以下命令將程序包解壓到/usr/local/bin。
# 將{your_zip_path}替換為程序包所在路徑,若系統不支持unzip命令,請先安裝。 sudo unzip {your_zip_path} -d /usr/local/bin
Windows
解壓程序包,例如解壓后的目錄為D:\tool\terraform。
在桌面右鍵單擊此電腦,選擇
。在系統變量/用戶變量中單擊Path,選擇 ,輸入Terraform的解壓目錄(如D:\tool\terraform),單擊確定完成配置。
運行
terraform
驗證路徑配置。terraform
命令運行后將顯示可用的Terraform選項的列表,如下所示,表示安裝完成。
2. 配置Terraform身份認證
Terraform身份認證是指在通過Terraform操作阿里云基礎設施之前,對阿里云Terraform Provider進行身份驗證。只有在身份認證成功后,才能與阿里云API進行通信,并創建和管理阿里云的基礎設施資源。阿里云Terraform Provider提供多種身份認證方式,有關更多身份認證信息,請參見相關文檔Terraform 身份認證。
您如果使用Terraform Explorer或者Cloud Shell,則無需手動配置身份認證信息,只需確保所登錄的賬號具有操作VPC和ECS的權限即可。
本文以在環境變量中使用RAM用戶AccessKey配置身份認證為例:
由于阿里云賬號(主賬號)擁有資源的所有權限,其AccessKey一旦泄露風險巨大,所以建議您使用RAM用戶的AccessKey。如何創建RAM用戶的AccessKey,請參見創建AccessKey。
在為RAM用戶授予操作云服務器ECS及專有網絡VPC相關資源的權限時,建議所授予的權限應遵循最小權限原則。有關如何為RAM用戶進行授權的詳細信息,請參見為RAM用戶授權。本文提供的示例代碼需要創建ECS、VPC、交換機等資源,為便于執行本文中的示例,您可以為授予RAM用戶以下權限:
云產品
授予權限
專有網絡VPC
本示例選擇系統策略:AliyunVPCFullAccess
云服務器ECS
本示例選擇系統策略:AliyunECSFullAccess
創建環境變量,存放身份認證信息。
Linux
重要使用export命令配置的臨時環境變量僅對當前會話有效,當會話退出之后所設置的環境變量將會丟失。若需長期保留環境變量,可將export命令配置到對應操作系統的啟動配置文件中。
# AccessKey Id export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********" # AccessKey Secret export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************" # 資源將要部署的地域 export ALICLOUD_REGION="cn-beijing"
Windows
在桌面右鍵單擊此電腦,選擇
。在系統變量/用戶變量中,單擊新建,創建以下環境變量。
變量名
變量描述
變量值
ALICLOUD_ACCESS_KEY
AccessKey Id
示例:LTAIUrZCw3********
ALICLOUD_SECRET_KEY
AccessKey Secret
示例:zfwwWAMWIAiooj14GQ2*************
ALICLOUD_REGION
資源將要部署的地域
示例:cn-beijing
涉及的Terraform資源
本文所提供的示例代碼中,所涉及到的Terraform資源信息。
本教程示例包含的部分資源會產生一定費用,請在不需要時及時進行釋放或退訂。
Resource
alicloud_vpc:創建專有網絡VPC。
alicloud_vswitch:創建vSwitch。
alicloud_security_group:創建安全組。
alicloud_security_group_rule:創建安全組規則。
alicloud_instance:創建ECS實例。
Data Source
alicloud_zones:動態查詢可以創建特定實例規格的可用區。
編寫Terraform配置文件
在main.tf中定義創建ECS所需的基礎設施資源,例如ECS、VPC等。您可以直接復制下方完整示例中的代碼到配置文件中
創建配置文件。
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。
定義Provider配置。
配置阿里云資源部署的地域。
# 資源所在的地域 variable "region" { default = "cn-chengdu" } provider "alicloud" { region = var.region }
定義專有網絡VPC及其子網。
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 }
定義安全組。
安全組是一種虛擬防火墻,能夠控制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" }
定義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實例。
資源變更
當您需要調整配置時,可以通過直接修改配置文件中的資源定義來實現,例如添加新的安全組入方向的放行規則。
若您希望在安全組入方向規則中添加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" }
執行
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.
如果變更符合預期,執行
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支持的
Resource
和Data Source
請參考支持的資源列表。在Terraform Explorer中使用Terraform,無需安裝和配置Terraform即可對Terraform代碼進行調試。
在Cloud Shell中使用Terraform,無需安裝和配置Terraform即可手動執行Terraform命令。