arrow_back

使用 Terraform 自动部署基础架构

登录 加入
访问 700 多个实验和课程

使用 Terraform 自动部署基础架构

实验 1 小时 universal_currency_alt 5 个积分 show_chart 入门级
info 此实验可能会提供 AI 工具来支持您学习。
访问 700 多个实验和课程

概览

Terraform 可让您以安全、可预测的方式创建、更改和改进基础架构。它是一个开源工具,可将 API 编码为声明式配置文件。您可以将这些文件分享给团队成员,将它们作为代码进行处理、修改、审核和版本控制。

在本实验中,您将创建一项包含模块的 Terraform 配置,实现 Google Cloud 基础设施的自动部署。具体而言,您需要部署一个设有防火墙规则的自动模式网络和两个虚拟机实例,如下图所示:

Terraform 配置图表

目标

在本实验中,您将学习如何执行以下任务:

  • 为自动模式网络创建配置
  • 为防火墙规则创建配置
  • 为虚拟机实例创建模块
  • 创建和部署配置
  • 验证配置的部署情况

设置

对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:

    • 打开 Google Cloud 控制台按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭据
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示登录页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在实验详细信息面板中找到用户名

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在实验详细信息面板中找到密码

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标

任务 1. 设置 Terraform 和 Cloud Shell

在此任务中,您需要将 Cloud Shell 环境配置为使用 Terraform。

安装 Terraform

Terraform 现已集成至 Cloud Shell 中。验证安装的版本。

  1. 在 Google Cloud 控制台中,点击激活 Cloud Shell (“激活 Cloud Shell”图标)。
  2. 如果出现提示,点击继续
  3. 如需验证 Terraform 是否已安装,请运行以下命令:
terraform --version

输出应如下所示:

Terraform v1.5.7

注意:如果系统发出 Terraform 版本过旧的警告,请不要担心,因为实验说明适用于 Terraform v1.5.7 及更高版本。最新版本的 Terraform 可在 Terraform 网站中下载。对于所有支持的平台和架构,会以二进制软件包形式分发 Terraform;Cloud Shell 使用 Linux 64 位。

  1. 如需创建用于存储 Terraform 配置的目录,请运行以下命令:
mkdir tfinfra
  1. 在 Cloud Shell 中,点击打开编辑器 (Cloud Shell 编辑器图标)。

注意:如果显示“由于第三方 Cookie 已停用,无法加载代码编辑器”,请点击在新窗口中打开。代码编辑器将在新标签页中打开。返回原标签页,点击打开终端,然后切换回代码编辑器标签页。在本实验中,您将需要定期切换回 Cloud Shell 终端。

  1. 在代码编辑器窗口的左侧窗格中,展开 tfinfra 文件夹。

初始化 Terraform

Terraform 使用基于插件的架构来支持众多可用的基础架构和服务提供程序。每个“提供程序”均为各自封装的二进制程序,与 Terraform 本身分开分发。通过将 Google 设为提供程序来初始化 Terraform。

  1. 右键点击 tfinfra 文件夹,然后点击新建文件,以在 tfinfra 文件夹内创建新文件。
  2. 将新文件命名为 provider.tf,然后将其打开。
  3. 将以下代码复制到 provider.tf 中:
provider "google" {}
  1. 依次点击文件 > 保存,以保存 provider.tf

  2. 如需初始化 Terraform,请运行以下命令:

cd tfinfra terraform init

现在,您可以在 Cloud Shell 中使用 Terraform 了。

任务 2. 创建 mynetwork 及其资源

在此任务中,您将创建自动模式网络 mynetwork 及其防火墙规则,以及两个虚拟机实例(mynet_vm_1mynet_vm_2)。

配置 mynetwork

创建新配置,并定义 mynetwork

  1. 右键点击 tfinfra 文件夹,然后点击新建文件,以在 tfinfra 文件夹内创建新文件。
  2. 将新文件命名为 mynetwork.tf,然后将其打开。
  3. 将以下基础代码复制到 mynetwork.tf 中:
# Create the mynetwork network resource [RESOURCE_TYPE] "mynetwork" { name = [RESOURCE_NAME] # RESOURCE properties go here }

此基础模板适合用来创建任何 Google Cloud 资源。您可在名称字段中为资源命名,在类型字段中指定要创建的 Google Cloud 资源。您还可以定义属性,但对于有些资源来说,这些不是必需的信息。

  1. mynetwork.tf 中,将 [RESOURCE_TYPE] 替换为 "google_compute_network"(带引号)。

注意google_compute_network 资源是一个 VPC 网络。Google Cloud 提供程序文档中介绍了可用的资源。您可以在 Terraform 文档中了解有关此特定资源的更多信息。

  1. mynetwork.tf 中,将 [RESOURCE_NAME] 替换为 "mynetwork"(带引号)。
  2. 将以下属性添加至 mynetwork.tf
auto_create_subnetworks = "true"

根据定义,自动模式网络会自动在每个区域中创建一个子网。因此,您要将 auto_create_subnetworks 设置为 true

  1. 验证 mynetwork.tf 文件是否如下所示:
# Create the mynetwork network resource "google_compute_network" "mynetwork" { name = "mynetwork" # RESOURCE properties go here auto_create_subnetworks = "true" }
  1. 依次点击文件 > 保存,以保存 mynetwork.tf

配置防火墙规则

定义一条防火墙规则以允许 HTTP、SSH、RDP 和 ICMP 流量通过 mynetwork。

  1. 将以下基础代码添加至 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 }
  1. mynetwork.tf 中,将 [RESOURCE_TYPE] 替换为 "google_compute_firewall"(带引号)。

注意google_compute_firewall 资源是一条防火墙规则。您可在 Terraform 文档中了解有关此特定资源的更多信息。

  1. mynetwork.tf 中,将 [RESOURCE_NAME] 替换为 "mynetwork-allow-http-ssh-rdp-icmp"(带引号)。
  2. 将以下属性添加至 mynetwork.tf
network = google_compute_network.mynetwork.self_link

注意:由于此防火墙规则取决于其网络,您要通过 google_compute_network.mynetwork.self_link 这一引用来指示 Terraform 按相关顺序解析这些资源。在这种情况下,网络先于防火墙规则创建。

  1. 将以下属性添加至 mynetwork.tf
allow { protocol = "tcp" ports = ["22", "80", "3389"] } allow { protocol = "icmp" } source_ranges = ["0.0.0.0/0"]

allow 规则列表指定允许的协议和端口。

  1. 验证您的 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"] }
  1. 依次点击文件 > 保存,以保存 mynetwork.tf

配置虚拟机实例

通过创建虚拟机实例模块来定义虚拟机实例。模块是文件夹内可重复使用的配置。本实验的两个虚拟机实例均使用该模块。

  1. 选中 tfinfra 文件夹,然后依次点击文件 > 新建文件夹,以在 tfinfra 中创建新文件夹。
  2. 将新文件夹命名为 instance
  3. 右键点击 instance 文件夹,然后点击新建文件,以在 instance 文件夹内创建新文件。
  4. 将新文件命名为 main.tf,然后将其打开。

Cloud Shell 中的文件夹结构应如下所示:

文件夹结构

  1. 将以下基础代码复制到 main.tf 中:
resource [RESOURCE_TYPE] "vm_instance" { name = [RESOURCE_NAME] # RESOURCE properties go here }
  1. main.tf 中,将 [RESOURCE_TYPE] 替换为 "google_compute_instance"(带引号)。

注意google_compute_instance 资源是一个 Compute Engine 实例。您可以在 Terraform 文档中了解有关此特定资源的更多信息。

  1. main.tf 中,将 [RESOURCE_NAME] 替换为 "${var.instance_name}"(带引号)。

由于两个虚拟机实例均使用该模块,您要将实例名称定义为输入变量。这样您就可以控制 mynetwork.tf 中变量的名称。您可在 Terraform:输入变量定义指南中了解有关输入变量的更多信息。

  1. 将以下属性添加至 main.tf
zone = "${var.instance_zone}" machine_type = "${var.instance_type}"

这些属性会将实例的可用区和机器类型定义为输入变量。

  1. 将以下属性添加至 main.tf
boot_disk { initialize_params { image = "debian-cloud/debian-11" } }

此属性将启动磁盘定义为使用 Debian 11 操作系统映像。由于两个虚拟机实例将使用相同的映像,您可以在模块中对该属性进行硬编码。

  1. 将以下属性添加至 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 文档

  1. 验证 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 } } }
  1. 依次点击文件 > 保存,以保存 main.tf。
  2. 右键点击 instance 文件夹,然后点击新建文件,以在 instance 文件夹内创建新文件。
  3. 将新文件命名为 variables.tf,然后将其打开。
  4. variables.tf 中定义 4 个输入变量。
variable "instance_name" {} variable "instance_zone" {} variable "instance_type" { default = "e2-micro" } variable "instance_network" {}

instance_type 指定一个默认值会将其定义为可选变量。instance_nameinstance_zoneinstance_network 是必需的变量,您需要在 mynetwork.tf 中定义它们。

  1. 依次点击文件 > 保存,以保存 variables.tf。
  2. 将以下虚拟机实例添加至 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 中的现有模块,而无需自己编写模块。

  1. 依次点击文件 > 保存,以保存 mynetwork.tf

  2. 验证 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 配置了。

  1. 如需将 Terraform 配置文件重写为规范格式和样式,请运行以下命令:
terraform fmt

输出应如下所示:

mynetwork.tf

注意:如果出现错误,请重新执行前面的步骤,以确保您的配置与实验说明一致。如果您无法解决配置问题,请下载并查看这些已完成的配置:

  1. 如需初始化 Terraform,请运行以下命令:
terraform init

输出应如下所示:

Initializing modules... - mynet-vm-2 in instance - mynet-vm-2 in instance ... Terraform has been successfully initialized!

注意:如果出现错误,请重新执行前面的步骤,以确保您的文件夹/文件结构正确。如果您无法解决配置问题,请参阅上述链接中已完成的配置。修复问题后,请重新运行上一个命令。

  1. 如需创建执行计划,请运行以下命令:
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 中的虚拟机实例
  1. 如需应用所需的更改,请运行以下命令:
terraform apply
  1. 如需确认计划的操作,请输入:
yes

输出应如下所示:

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

点击检查我的进度以验证是否完成了以下目标: 创建 mynetwork 及其资源

注意:如果执行期间出现错误,请重新执行前面的步骤,以确保您的文件夹/文件结构正确。如果您无法解决配置问题,请参阅上述链接中已完成的配置。修复问题后,请重新运行上一个命令。

任务 3. 验证您的部署

在 Google Cloud 控制台中,验证是否创建了资源。

在 Cloud 控制台中验证您的网络

  1. 在 Google Cloud 控制台的导航菜单 (“导航菜单”图标) 中,依次点击 VPC 网络 > VPC 网络
  2. 查看 mynetwork VPC 网络,该网络在每个区域中都有子网。
  3. 导航菜单中,依次点击 VPC 网络 > 防火墙
  4. 按照网络对防火墙规则进行排序。
  5. 查看 mynetworkmynetwork-allow-http-ssh-rdp-icmp 防火墙规则。

在 Cloud 控制台中验证您的虚拟机实例

  1. 导航菜单 (“导航菜单”图标) 中,点击 Compute Engine > 虚拟机实例
  2. 查看 mynet-vm-1mynet-vm-2 实例。
  3. 记下 mynet-vm-2 的内部 IP 地址。
  4. 对于 mynet-vm-1,点击 SSH 以启动一个终端并进行连接。
  5. 如需测试能否连接到 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 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

请使用无痕模式或无痕式浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。