通過Terraform創(chuàng)建并使用ECS實例
Terraform是一款I(lǐng)aC工具(Infrastructure as Code),旨在幫助開發(fā)人員和運維團(tuán)隊自動化基礎(chǔ)設(shè)施的創(chuàng)建、部署和管理。您可以通過編寫簡潔的代碼來定義和配置云端基礎(chǔ)設(shè)施,而不必手動操作和配置。本文為您介紹如何通過Terraform創(chuàng)建ECS實例。
安裝Terraform
本文以在Linux或Windows系統(tǒng)中使用程序包安裝Terraform為例,更多安裝方式,請參見Provider 安裝。
進(jìn)入Terraform官網(wǎng)下載適用于您的操作系統(tǒng)的程序包。
配置Terraform運行環(huán)境。
Linux
執(zhí)行以下命令將程序包解壓到/usr/local/bin。
# 將{your_zip_path}替換為程序包所在路徑,若系統(tǒng)不支持unzip命令,請先安裝。 sudo unzip {your_zip_path} -d /usr/local/bin
Windows
解壓程序包,例如解壓后的目錄為D:\tool\terraform。
在桌面右鍵單擊此電腦,選擇
。在系統(tǒng)變量/用戶變量中單擊Path,選擇 ,輸入Terraform的解壓目錄(如D:\tool\terraform),單擊確定完成配置。
運行
terraform
驗證路徑配置。terraform
命令運行后將顯示可用的Terraform選項的列表,如下所示,表示安裝完成。
配置Terraform身份認(rèn)證
Terraform身份認(rèn)證是指在通過Terraform操作阿里云基礎(chǔ)設(shè)施之前,對阿里云Terraform Provider進(jìn)行身份驗證。只有在身份認(rèn)證成功后,才能與阿里云API進(jìn)行通信,并創(chuàng)建和管理阿里云的基礎(chǔ)設(shè)施資源。阿里云Terraform Provider提供多種身份認(rèn)證方式,有關(guān)更多身份認(rèn)證信息,請參見相關(guān)文檔Terraform 身份認(rèn)證。
本文以在環(huán)境變量中使用RAM用戶AccessKey配置身份認(rèn)證為例:
由于阿里云賬號(主賬號)擁有資源的所有權(quán)限,其AccessKey一旦泄露風(fēng)險巨大,所以建議您使用RAM用戶的AccessKey。如何創(chuàng)建RAM用戶的AccessKey,請參見創(chuàng)建AccessKey。
在為RAM用戶授予操作云服務(wù)器ECS及專有網(wǎng)絡(luò)VPC相關(guān)資源的權(quán)限時,建議所授予的權(quán)限應(yīng)遵循最小權(quán)限原則。有關(guān)如何為RAM用戶進(jìn)行授權(quán)的詳細(xì)信息,請參見為RAM用戶授權(quán)。本文提供的示例代碼需要創(chuàng)建ECS、VPC、交換機(jī)等資源,為便于執(zhí)行本文中的示例,您可以為授予RAM用戶以下權(quán)限:
云產(chǎn)品
授予權(quán)限
專有網(wǎng)絡(luò)VPC
本示例選擇系統(tǒng)策略:AliyunVPCFullAccess
云服務(wù)器ECS
本示例選擇系統(tǒng)策略:AliyunECSFullAccess
創(chuàng)建環(huán)境變量,存放身份認(rèn)證信息。
Linux
重要使用export命令配置的臨時環(huán)境變量僅對當(dāng)前會話有效,當(dāng)會話退出之后所設(shè)置的環(huán)境變量將會丟失。若需長期保留環(huán)境變量,可將export命令配置到對應(yīng)操作系統(tǒng)的啟動配置文件中。
# AccessKey Id export ALICLOUD_ACCESS_KEY="LTAIUrZCw3********" # AccessKey Secret export ALICLOUD_SECRET_KEY="zfwwWAMWIAiooj14GQ2*************" # 資源將要部署的地域 export ALICLOUD_REGION="cn-beijing"
Windows
在桌面右鍵單擊此電腦,選擇
。在系統(tǒng)變量/用戶變量中,單擊新建,創(chuàng)建以下環(huán)境變量。
變量名
變量描述
變量值
ALICLOUD_ACCESS_KEY
AccessKey Id
示例:LTAIUrZCw3********
ALICLOUD_SECRET_KEY
AccessKey Secret
示例:zfwwWAMWIAiooj14GQ2*************
ALICLOUD_REGION
資源將要部署的地域
示例:cn-beijing
涉及的Terraform資源
本文所提供的示例代碼中,所涉及到的Terraform資源信息。
本教程示例包含的部分資源會產(chǎn)生一定費用,請在不需要時及時進(jìn)行釋放或退訂。
Resource
alicloud_vpc:創(chuàng)建專有網(wǎng)絡(luò)VPC。
alicloud_vswitch:創(chuàng)建vSwitch。
alicloud_security_group:創(chuàng)建安全組。
alicloud_security_group_rule:創(chuàng)建安全組規(guī)則。
alicloud_instance:創(chuàng)建ECS實例。
Data Source
alicloud_zones:動態(tài)查詢可以創(chuàng)建特定實例規(guī)格的可用區(qū)。
編寫Terraform配置文件
在main.tf中定義創(chuàng)建ECS所需的基礎(chǔ)設(shè)施資源,例如ECS、VPC等。您可以直接復(fù)制下方完整示例中的代碼到配置文件中
創(chuàng)建配置文件。
Terraform的基礎(chǔ)設(shè)施資源是在配置文件中進(jìn)行定義的,因此必須首先創(chuàng)建一個配置文件。
Linux
# 創(chuàng)建工作目錄 mkdir terraform-projects && cd terraform-projects mkdir ecs-quickstart && cd ecs-quickstart # 創(chuàng)建配置文件并編輯 touch main.tf && vim main.tf
Windows
創(chuàng)建一個新的文件夾,例如命名為ecs-quickstart,并在該文件夾內(nèi)創(chuàng)建一個Terraform配置文件,例如配置文件名稱為main.tf。
定義Provider配置。
配置阿里云資源部署的地域。
# 資源所在的地域 variable "region" { default = "cn-chengdu" } provider "alicloud" { region = var.region }
定義專有網(wǎng)絡(luò)VPC及其子網(wǎng)。
VPC是一種專有的云上私有網(wǎng)絡(luò),允許用戶在公共云上配置和管理一個邏輯隔離的網(wǎng)絡(luò)區(qū)域。
variable "instance_name" { default = "tf-sample" } # ecs實例規(guī)格 variable "instance_type" { default = "ecs.e-c1m2.large" } # 查詢滿足條件的可用區(qū) data "alicloud_zones" "default" { available_disk_category = "cloud_essd" available_resource_creation = "VSwitch" available_instance_type = var.instance_type } # 創(chuàng)建VPC resource "alicloud_vpc" "vpc" { vpc_name = var.instance_name cidr_block = "172.16.0.0/12" } # 創(chuàng)建交換機(jī) 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實例的出入方向流量。
# 創(chuàng)建安全組 resource "alicloud_security_group" "default" { name = var.instance_name vpc_id = alicloud_vpc.vpc.id } # 為安全組入方向添加規(guī)則 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,您可以快速部署和運行應(yīng)用程序,靈活調(diào)整資源以應(yīng)對業(yè)務(wù)變化,同時享受高性能、高安全性和低成本的計算能力,適用于網(wǎng)站托管、應(yīng)用開發(fā)、數(shù)據(jù)處理等多種場景。
# ecs實例鏡像ID variable "image_id" { default = "ubuntu_18_04_64_20G_alibase_20190624.vhd" } # ecs實例公網(wǎng)帶寬 variable "internet_bandwidth" { default = "10" } # ecs實例登錄密碼 variable "password" { default = "Test@12345" } # 指定創(chuàng)建ECS的數(shù)量,默認(rèn)值是 1 variable "ecs_count" { default = 1 } # 創(chuàng)建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命令創(chuàng)建資源
在完成Terraform配置文件編寫后,運行Terraform命令來完成ECS實例的自動創(chuàng)建。
1. 初始化Terraform
terraform init
命令用于下載并安裝阿里云提供商的插件到當(dāng)前文件夾中,同時還會生成各類記錄文件。
Linux
terraform init
Windows
打開命令提示符cmd,在cmd中切換到Terraform配置文件所在文件夾,然后執(zhí)行terraform init
命令進(jìn)行初始化。
# 例如配置文件路徑 D:/ecs-quickstart
# 切換到 D盤
d:
# 切換到配置文件所在文件夾路徑的命令,ecs-quickstart是配置文件所在文件夾路徑,您可根據(jù)實際路徑替換。
cd ecs-quickstart
# 執(zhí)行初始化命令
terraform init
當(dāng)您因網(wǎng)絡(luò)延遲等原因?qū)е聇erraform 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. 預(yù)覽Terraform代碼
運行terraform plan
實現(xiàn)如下功能:
驗證
main.tf
中Terraform代碼的語法是否正確。顯示當(dāng)前Terraform代碼將要創(chuàng)建的資源的預(yù)覽結(jié)果。
terraform plan
如果顯示如下所示的信息表示Terraform文件無語法錯誤,可以執(zhí)行terraform apply
命令創(chuàng)建資源。若出現(xiàn)其他報錯提示,請根據(jù)提示修改Terraform配置文件。
...
Plan: 5 to add, 0 to change, 0 to destroy.
3. 執(zhí)行Terraform代碼
運行terraform apply
以完成ECS實例及其依賴資源的自動創(chuàng)建和Python的自動安裝。在創(chuàng)建過程中,需要按照提示輸入yes,以允許Terraform創(chuàng)建所有定義的資源。
terraform apply
如下所示的信息表示ECS及所依賴資源均已創(chuàng)建成功。
...
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實例
當(dāng)ECS實例成功創(chuàng)建后,您可以通過SSH協(xié)議遠(yuǎn)程登錄到指定公網(wǎng)IP的ECS。更多遠(yuǎn)程連接方式,請參見連接方式概述。
ssh <用戶名>@<公網(wǎng)IP>
查看結(jié)果
使用Terraform命令
您可以通過以下命令查看已創(chuàng)建的ECS實例信息。
# 命令格式:terraform state show <資源類型>.<資源別名>
terraform state show alicloud_instance.instance
登錄控制臺查看
您可以登錄ECS管理控制臺查看已創(chuàng)建的ECS實例。
資源變更
當(dāng)您需要調(diào)整配置時,可以通過直接修改配置文件中的資源定義來實現(xiàn),例如添加新的安全組入方向的放行規(guī)則。
若您希望在安全組入方向規(guī)則中添加443端口的放行規(guī)則,您可以在配置文件中添加以下代碼。
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" }
執(zhí)行
terraform plan
命令預(yù)覽所做的變更。如下所示的信息表示將要為安全組ID是sg-2vcdz6b8h9c3XXXXXXXX
的安全組增加一條安全組規(guī)則。... 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.
如果變更符合預(yù)期,執(zhí)行
terraform apply
命令將變更應(yīng)用到您的基礎(chǔ)設(shè)施。在執(zhí)行該命令時,Terraform將要求您確認(rèn)是否進(jìn)行變更,請鍵入yes
并按回車鍵確認(rèn)。如下所示的信息表示已為安全組ID是sg-2vcdz6b8h9c3XXXXXXXX
的安全組新增規(guī)則成功。... 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.
釋放資源
當(dāng)您不再需要上述通過terraform創(chuàng)建或管理的資源時,運行下面的命令釋放資源。
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.
相關(guān)文檔
ECS支持的
Resource
和Data Source
請參考支持的資源列表。Terraform提供了在線調(diào)試工具Terraform Explorer,可以在無需安裝和配置Terraform的情況下進(jìn)行調(diào)試。