概览
Terraform 可让您以安全、可预测的方式创建、更改和改进基础架构。它是一个开源工具,可将 API 编码为声明式配置文件。您可以将这些文件分享给团队成员,将它们作为代码进行处理、修改、审核和版本控制。
在本实验中,您将创建一项包含模块的 Terraform 配置,实现 Google Cloud 基础设施的自动部署。具体而言,您需要部署一个设有防火墙规则的自动模式网络和两个虚拟机实例,如下图所示:
目标
在本实验中,您将学习如何执行以下任务:
为自动模式网络创建配置
为防火墙规则创建配置
为虚拟机实例创建模块
创建和部署配置
验证配置的部署情况
设置
对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。
点击开始实验 按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息 面板,其中包含以下各项:
打开 Google Cloud 控制台 按钮
剩余时间
进行该实验时必须使用的临时凭据
帮助您逐步完成本实验所需的其他信息(如果需要)
点击打开 Google Cloud 控制台 (如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接 )。
该实验会启动资源并打开另一个标签页,显示登录 页面。
提示 :将这些标签页安排在不同的窗口中,并排显示。
注意 :如果您看见选择账号 对话框,请点击使用其他账号 。
如有必要,请复制下方的用户名 ,然后将其粘贴到登录 对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验详细信息 面板中找到用户名 。
点击下一步 。
复制下面的密码 ,然后将其粘贴到欢迎 对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验详细信息 面板中找到密码 。
点击下一步 。
重要提示: 您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意 :在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
继续在后续页面中点击以完成相应操作:
接受条款及条件。
由于这是临时账号,请勿添加账号恢复选项或双重验证。
请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意 :如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单 ,或在搜索 字段中输入服务或产品的名称。
任务 1. 设置 Terraform 和 Cloud Shell
在此任务中,您需要将 Cloud Shell 环境配置为使用 Terraform。
安装 Terraform
Terraform 现已集成至 Cloud Shell 中。验证安装的版本。
在 Google Cloud 控制台中,点击激活 Cloud Shell ( )。
如果出现提示,点击继续 。
如需验证 Terraform 是否已安装,请运行以下命令:
terraform --version
输出应如下所示:
Terraform v1.5.7
注意: 如果系统发出 Terraform 版本过旧的警告,请不要担心,因为实验说明适用于 Terraform v1.5.7 及更高版本。最新版本的 Terraform 可在 Terraform 网站 中下载。对于所有支持的平台和架构,会以二进制软件包形式分发 Terraform;Cloud Shell 使用 Linux 64 位。
如需创建用于存储 Terraform 配置的目录,请运行以下命令:
mkdir tfinfra
在 Cloud Shell 中,点击打开编辑器 ( )。
注意 :如果显示“由于第三方 Cookie 已停用,无法加载代码编辑器” ,请点击在新窗口中打开 。代码编辑器将在新标签页中打开。返回原标签页,点击打开终端 ,然后切换回代码编辑器标签页。在本实验中,您将需要定期切换回 Cloud Shell 终端。
在代码编辑器窗口的左侧窗格中,展开 tfinfra 文件夹。
初始化 Terraform
Terraform 使用基于插件的架构来支持众多可用的基础架构和服务提供程序。每个“提供程序”均为各自封装的二进制程序,与 Terraform 本身分开分发。通过将 Google 设为提供程序来初始化 Terraform。
右键点击
tfinfra 文件夹,然后点击新建文件 ,以在 tfinfra 文件夹内创建新文件。
将新文件命名为 provider.tf ,然后将其打开。
将以下代码复制到 provider.tf
中:
provider "google" {}
依次点击文件 > 保存 ,以保存 provider.tf 。
如需初始化 Terraform,请运行以下命令:
cd tfinfra
terraform init
现在,您可以在 Cloud Shell 中使用 Terraform 了。
任务 2. 创建 mynetwork 及其资源
在此任务中,您将创建自动模式网络 mynetwork 及其防火墙规则,以及两个虚拟机实例(mynet_vm_1 和 mynet_vm_2 )。
配置 mynetwork
创建新配置,并定义 mynetwork 。
右键点击
tfinfra 文件夹,然后点击新建文件 ,以在 tfinfra 文件夹内创建新文件。
将新文件命名为 mynetwork.tf ,然后将其打开。
将以下基础代码复制到 mynetwork.tf
中:
# Create the mynetwork network
resource [RESOURCE_TYPE] "mynetwork" {
name = [RESOURCE_NAME]
# RESOURCE properties go here
}
此基础模板适合用来创建任何 Google Cloud 资源。您可在名称 字段中为资源命名,在类型 字段中指定要创建的 Google Cloud 资源。您还可以定义属性,但对于有些资源来说,这些不是必需的信息。
在 mynetwork.tf
中,将 [RESOURCE_TYPE]
替换为 "google_compute_network"
(带引号)。
注意 :google_compute_network 资源是一个 VPC 网络。Google Cloud 提供程序文档 中介绍了可用的资源。您可以在 Terraform 文档 中了解有关此特定资源的更多信息。
在 mynetwork.tf
中,将 [RESOURCE_NAME]
替换为 "mynetwork"
(带引号)。
将以下属性添加至 mynetwork.tf
:
auto_create_subnetworks = "true"
根据定义,自动模式网络会自动在每个区域中创建一个子网。因此,您要将 auto_create_subnetworks 设置为 true 。
验证 mynetwork.tf 文件是否如下所示:
# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
依次点击文件 > 保存 ,以保存 mynetwork.tf
。
配置防火墙规则
定义一条防火墙规则以允许 HTTP、SSH、RDP 和 ICMP 流量通过 mynetwork。
将以下基础代码添加至 mynetwork.tf
:
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource [RESOURCE_TYPE] "mynetwork-allow-http-ssh-rdp-icmp" {
name = [RESOURCE_NAME]
# RESOURCE properties go here
}
在 mynetwork.tf
中,将 [RESOURCE_TYPE]
替换为 "google_compute_firewall"
(带引号)。
注意 :google_compute_firewall 资源是一条防火墙规则。您可在 Terraform 文档 中了解有关此特定资源的更多信息。
在 mynetwork.tf
中,将 [RESOURCE_NAME]
替换为 "mynetwork-allow-http-ssh-rdp-icmp"
(带引号)。
将以下属性添加至 mynetwork.tf
:
network = google_compute_network.mynetwork.self_link
注意 :由于此防火墙规则取决于其网络,您要通过 google_compute_network.mynetwork.self_link 这一引用来指示 Terraform 按相关顺序解析这些资源。在这种情况下,网络先于防火墙规则创建。
将以下属性添加至 mynetwork.tf
:
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
allow 规则列表指定允许的协议和端口。
验证您的 mynetwork.tf
文件是否如下所示:
# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# RESOURCE properties go here
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
}
依次点击文件 > 保存 ,以保存 mynetwork.tf 。
配置虚拟机实例
通过创建虚拟机实例模块来定义虚拟机实例。模块是文件夹内可重复使用的配置。本实验的两个虚拟机实例均使用该模块。
选中 tfinfra 文件夹,然后依次点击文件 > 新建文件夹 ,以在 tfinfra 中创建新文件夹。
将新文件夹命名为 instance 。
右键点击
instance 文件夹,然后点击新建文件 ,以在 instance 文件夹内创建新文件。
将新文件命名为 main.tf ,然后将其打开。
Cloud Shell 中的文件夹结构应如下所示:
将以下基础代码复制到 main.tf 中:
resource [RESOURCE_TYPE] "vm_instance" {
name = [RESOURCE_NAME]
# RESOURCE properties go here
}
在 main.tf
中,将 [RESOURCE_TYPE]
替换为 "google_compute_instance"
(带引号)。
注意 :google_compute_instance 资源是一个 Compute Engine 实例。您可以在 Terraform 文档 中了解有关此特定资源的更多信息。
在 main.tf
中,将 [RESOURCE_NAME]
替换为 "${var.instance_name}"
(带引号)。
由于两个虚拟机实例均使用该模块,您要将实例名称定义为输入变量。这样您就可以控制 mynetwork.tf 中变量的名称。您可在 Terraform:输入变量定义指南 中了解有关输入变量的更多信息。
将以下属性添加至 main.tf
:
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
这些属性会将实例的可用区和机器类型定义为输入变量。
将以下属性添加至 main.tf
:
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
此属性将启动磁盘定义为使用 Debian 11 操作系统映像。由于两个虚拟机实例将使用相同的映像,您可以在模块中对该属性进行硬编码。
将以下属性添加至 main.tf
:
network_interface {
network = "${var.instance_network}"
access_config {
# Allocate a one-to-one NAT IP to the instance
}
}
此属性提供了网络名称(以输入变量的形式)和访问配置,以此来定义网络接口。将访问配置留空会生成一个临时的外部 IP 地址(本实验需要此 IP 地址)。如需创建仅具有内部 IP 地址的实例,请删除 access_config 部分。如需了解详情,请参阅 Terraform 文档 。
验证 main.tf
是否如下所示,包括括号 {}
resource "google_compute_instance" "vm_instance" {
name = "${var.instance_name}"
zone = "${var.instance_zone}"
machine_type = "${var.instance_type}"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
}
}
network_interface {
network = "${var.instance_network}"
access_config {
# Allocate a one-to-one NAT IP to the instance
}
}
}
依次点击文件 > 保存 ,以保存 main.tf。
右键点击
instance 文件夹,然后点击新建文件 ,以在 instance 文件夹内创建新文件。
将新文件命名为 variables.tf ,然后将其打开。
在 variables.tf
中定义 4 个输入变量。
variable "instance_name" {}
variable "instance_zone" {}
variable "instance_type" {
default = "e2-micro"
}
variable "instance_network" {}
为 instance_type 指定一个默认值会将其定义为可选变量。instance_name 、instance_zone 和 instance_network 是必需的变量,您需要在 mynetwork.tf
中定义它们。
依次点击文件 > 保存 ,以保存 variables.tf。
将以下虚拟机实例添加至 mynetwork.tf
:
# Create the mynet-vm-1 instance
module "mynet-vm-1" {
source = "./instance"
instance_name = "mynet-vm-1"
instance_zone = "{{{project_0.default_zone|Zone}}}"
instance_network = google_compute_network.mynetwork.self_link
}
# Create the mynet-vm-2" instance
module "mynet-vm-2" {
source = "./instance"
instance_name = "mynet-vm-2"
instance_zone = "{{{project_0.default_zone_2|Zone 2}}}"
instance_network = google_compute_network.mynetwork.self_link
}
这些资源将利用 instance 文件夹中的模块,并提供名称、可用区和网络作为输入。由于这些实例依赖于 VPC 网络,您要通过 google_compute_network.mynetwork.self_link 这一引用来指示 Terraform 按相关顺序解析这些资源。在这种情况下,网络先于实例创建。
注意 :编写 Terraform 模块的好处是它可以在多个配置中重复使用。您也可以利用 Terraform Module Registry 中的现有模块,而无需自己编写模块。
依次点击文件 > 保存 ,以保存 mynetwork.tf
。
验证 mynetwork.tf
是否如下所示,包括括号 {}
# Create the mynetwork network
resource "google_compute_network" "mynetwork" {
name = "mynetwork"
# RESOURCE properties go here
auto_create_subnetworks = "true"
}
# Add a firewall rule to allow HTTP, SSH, RDP and ICMP traffic on mynetwork
resource "google_compute_firewall" "mynetwork-allow-http-ssh-rdp-icmp" {
name = "mynetwork-allow-http-ssh-rdp-icmp"
# RESOURCE properties go here
network = google_compute_network.mynetwork.self_link
allow {
protocol = "tcp"
ports = ["22", "80", "3389"]
}
allow {
protocol = "icmp"
}
source_ranges = ["0.0.0.0/0"]
}
# Create the mynet-vm-1 instance
module "mynet-vm-1" {
source = "./instance"
instance_name = "mynet-vm-1"
instance_zone = "{{{project_0.default_zone|Zone}}}"
instance_network = google_compute_network.mynetwork.self_link
}
# Create the mynet-vm-2" instance
module "mynet-vm-2" {
source = "./instance"
instance_name = "mynet-vm-2"
instance_zone = "{{{project_0.default_zone_2|Zone 2}}}"
instance_network = google_compute_network.mynetwork.self_link
}
创建 mynetwork 及其资源
现在可以应用 mynetwork 配置了。
如需将 Terraform 配置文件重写为规范格式和样式,请运行以下命令:
terraform fmt
输出应如下所示:
mynetwork.tf
注意 :如果出现错误,请重新执行前面的步骤,以确保您的配置与实验说明一致。如果您无法解决配置问题,请下载并查看这些已完成的配置:
如需初始化 Terraform,请运行以下命令:
terraform init
输出应如下所示:
Initializing modules...
- mynet-vm-2 in instance
- mynet-vm-2 in instance
...
Terraform has been successfully initialized!
注意 :如果出现错误,请重新执行前面的步骤,以确保您的文件夹/文件结构正确。如果您无法解决配置问题,请参阅上述链接中已完成的配置。修复问题后,请重新运行上一个命令。
如需创建执行计划,请运行以下命令:
terraform plan
输出应如下所示:
...
Plan: 4 to add, 0 to change, 0 to destroy.
...
Terraform 确定了需要添加以下 4 项资源:
名称
说明
mynetwork
VPC 网络
mynetwork-allow-http-ssh-rdp-icmp
允许 HTTP、SSH、RDP 和 ICMP 的防火墙规则
mynet-vm-2
中的虚拟机实例
mynet-vm-2
中的虚拟机实例
如需应用所需的更改,请运行以下命令:
terraform apply
如需确认计划的操作,请输入:
yes
输出应如下所示:
...
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
点击检查我的进度 以验证是否完成了以下目标:
创建 mynetwork 及其资源
注意 :如果执行期间出现错误,请重新执行前面的步骤,以确保您的文件夹/文件结构正确。如果您无法解决配置问题,请参阅上述链接中已完成的配置。修复问题后,请重新运行上一个命令。
任务 3. 验证您的部署
在 Google Cloud 控制台中,验证是否创建了资源。
在 Cloud 控制台中验证您的网络
在 Google Cloud 控制台的导航菜单 ( ) 中,依次点击 VPC 网络 > VPC 网络 。
查看 mynetwork VPC 网络,该网络在每个区域中都有子网。
在导航菜单 中,依次点击 VPC 网络 > 防火墙 。
按照网络 对防火墙规则进行排序。
查看 mynetwork 的 mynetwork-allow-http-ssh-rdp-icmp 防火墙规则。
在 Cloud 控制台中验证您的虚拟机实例
在导航菜单 ( ) 中,点击 Compute Engine > 虚拟机实例 。
查看 mynet-vm-1 和 mynet-vm-2 实例。
记下 mynet-vm-2 的内部 IP 地址。
对于 mynet-vm-1 ,点击 SSH 以启动一个终端并进行连接。
如需测试能否连接到 mynet-vm-2 的内部 IP 地址,请在 SSH 终端中运行以下命令(将 mynet-vm-2 的内部 IP 地址替换为之前记下的值):
ping -c 3 <在此处输入 mynet-vm-2 的内部 IP 地址>
注意 :应该可以 ping 通,因为两个虚拟机实例在同一网络中,且防火墙规则允许 ICMP 流量!
任务 4. 回顾
在本实验中,您创建了包含自动部署 Google Cloud 基础架构的模块的 Terraform 配置。当您的配置发生变化时,Terraform 可以创建增量执行方案,让您逐步建立整体配置。
该实例模块让您可以将同一个资源配置重复用于多个资源,同时提供属性作为输入变量。您可以将创建的配置和模块用作未来部署的基础。
结束实验
完成实验后,请点击结束实验 。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。
系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交 。
星级数的含义如下:
1 颗星 = 非常不满意
2 颗星 = 不满意
3 颗星 = 一般
4 颗星 = 满意
5 颗星 = 非常满意
如果您不想提供反馈,可以关闭该对话框。
如果要留言反馈、提出建议或做出更正,请使用支持 标签页。
版权所有 2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。