正在加载…
未找到任何结果。

在 Google Cloud 控制台中运用您的技能

06

Google Cloud 弹性基础设施:扩缩和自动化

访问 700 多个实验和课程

使用 Terraform 自动部署基础架构

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

概览

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

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

目标

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

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

设置

对于每个实验,您都会免费获得一个新的 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 ()。
  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 中,点击打开编辑器 ()。

注意:如果显示“由于第三方 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. 在屏幕左上角,点击开始实验即可开始

此内容目前不可用

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

太好了!

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

一次一个实验

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

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

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