注意:

利用 Terraform 加速 Oracle Cloud Infrastructure Architect 专业认证

简介

要获得 Oracle Cloud Infrastructure (OCI) Architect Professional 认证,您需要深入了解 Oracle Cloud 和实际操作体验。此教程利用 Terraform 的基础设施即代码 (IaC) 来加快您的旅程。

图 0

下图 1 描述了要部署的目标 OCI 体系结构。右侧概述了 OCI Architect Professional Certification (2024) 实验室的结构化方法,分为七个连续步骤。通过利用针对认证考试实验室量身定制的预构建 Terraform 代码片段,可自动执行重复性任务,从而腾出宝贵的时间专注于掌握基本的 OCI 概念。这种方法不仅可以加速实验室的完成,还可以促进对平台的更深入了解。

图 1 图 1:OCI Architecture Professional 认证实验室 1 —架构和手动流程与自动化流程

手动方法的缺点

OCI 认证考试动手实验室的手动方法可能是一个重大障碍。一些缺点是:

更快掌握 OCI 技能:自动化的强大功能

此教程演示如何通过自动执行任务、重点关注核心技能和缩短练习时间来加速 OCI 认证。

主要优点:

其他福利:

为了加快您的 OCI Architect Professional Certification (2024) 旅程,我们将使用 Terraform 自动完成图 1 中所示的练习 1:Oracle Cloud Infrastructure Architect Professional 。这种自动化方法可以扩展到其他认证实验室和现实世界的云部署。

网络安全组 (Network Security Group,NSG) 作为另一 NSG(而非 CIDR 块)的入站源

此教程探讨 OCI 中的网络安全组及其如何对虚拟云网络 (VCN) 中的网络流量进行细粒度控制。网络安全组充当虚拟防火墙,用于控制对 VCN 内资源的网络访问。例如 OCI Compute 实例、Kubernetes 集群或数据库。通过启用资源之间的控制而不是子网之间的控制,网络安全组提供了比安全列表更大的灵活性。

通过 7 个步骤实现半自动化混合方法

OCI Architect Professional 认证动手实验室虽然全面,但非常耗时。请考虑练习 1:Oracle Cloud Infrastructure Architect Professional ,至少需要 25 分钟才能完成。通过使用 Terraform 自动执行 VCN、NSG 和虚拟机 (Virtual Machine,VM) 创建等重复性任务,您这次可以大幅减少多达 80%,重点关注核心安全概念,而不是繁琐的手动步骤。建议的半自动化方法提供了灵活性,允许您选择要自动执行的任务。

目标

先决条件

任务 1:创建虚拟云网络 (VCN)

手动选项:

使用 OCI VCN 向导创建核心网络资源:VCN、互联网网关、路由表、安全列表、公共和专用子网。有关更多信息,请参见 Virtual Networking Quickstart

  1. 转到 OCI 控制台,导航到网络虚拟云网络并创建新的 VCN。

  2. 单击 VCN 信息并记下 VCN专用子网公共子网 OCID(图 2)。

  3. 将 OCID 添加到 input.auto.tfvars(或 terraform.tfvars)文件中,如部署选项部分中所示。

默认情况下,create_vcn 标志处于关闭状态(从 OCI 控制台手动创建 VCN)。收集 VCN OCID子网 OCID 并将其添加到 input.auto.tfvars 文件。

# Step 1a - Create VCN using VCN Wizard (create_vcn flag off)
create_vcn = false

# Copy from the console the VCN OCIDs and subnets (public, Private) OCIDs.
vcn_id            = "REPLACE_CREATED_VCN_OCID_HERE"
private_subnet_id = "REPLACE_CREATED_PRIVATE_SUBNET_OCID_HERE"
public_subnet_id  = "REPLACE_CREATED_PUBLIC_SUBNET_OCID_HERE"

图像 图 2:用于收集 VCN OCID、公共子网 OCID 和专用子网 OCID 的控制台 VCN 视图

自动选项:

使用以下步骤创建 VCN。

  1. 要自动创建 VCN 和所有网络资源,请在 input.auto.tfvars 文件中将 create_vcn 标志设置为 true

  2. 指定 VCN、公共子网、专用子网 CIDR 块和主机名前缀。

    # Step 1b - Create VCN using Terraform. Provided the CIDR Blocks for the
    #           VCN, Subnets and all other required input (host_name_prefix).
    create_vcn = true
    
    # Provide the VCN & Subnet CIDR Blocks as well as host name prefix
    vcn_cidr_block            = "10.0.0.0/16"
    public_subnet_cidr_block  = "10.0.0.0/24"
    private_subnet_cidr_block = "10.0.1.0/24"
    host_name_prefix          = "phxapl4"
    

任务 2:创建两个 NSG(NSG-01 和 NSG-02)

手动选项:

使用以下步骤创建两个 NSG(NSG-01 和 NSG-02):

  1. 选择在任务 1 中创建的 VCN。

  2. 资源下,单击网络安全组

  3. 单击创建网络安全组并输入以下信息。

    • 名称:输入一个名称。例如,<REGION-KEY>-AP-LAB01-NSG-01
    • 创建区间:输入工作区间。
    • 单击创建
  4. 对第二个名为 <REGION-KEY>-AP-LAB01-NSG-02 的 NSG 重复步骤 1 到 3。

自动选项:

以下 Terraform 代码将创建两个 NSG(NSG-01 和 NSG-02)。

resource "oci_core_network_security_group" "nsg-01" {
  count = (var.create_vcn && var.create_nsg_1) ? 1 : 0

  #Required
  compartment_id = var.compartment_id
  vcn_id         = var.create_vcn ? oci_core_vcn.this.*.id[0] : var.vcn_id
  display_name   = "${var.display_name_prefix}-TF-NSG-01"
}

resource "oci_core_network_security_group" "nsg-02" {
  count = (var.create_vcn && var.create_nsg_2) ? 1 : 0

  #Required
  compartment_id = var.compartment_id
  vcn_id         = var.create_vcn ? oci_core_vcn.this.*.id[0] : var.vcn_id
  display_name   = "${var.display_name_prefix}-TF-1-NSG-02"
}

要创建两个 NSG,请将 create_nsg_1create_nsg_2 标志设置为 true

# Step 2: Create two(2) empty Network Security Groups (NSG-01 & NSG-02).
create_nsg_1 = true
create_nsg_2 = true

任务 3:使用 Terraform 启动四个 VM 并运行 Internet 控制消息协议 (Internet Control Message Protocol,ICMP) 试通测试

假设您熟悉从 OCI 控制台手动启动 VM。有关详细信息,请参阅创建实例

注:我们仅提供了 Terraform 自动化选项来创建 4 个 VM(公共子网中 3 个 VM,专用子网中 1 个 VM)。

启用 create_vm_1_3 标志以指示 Terraform 创建三个 VM(VM-01、VM-02 和 VM-03)。

# Step 3a: Launch three(3) VMs(VM-01, VM-02, VM-03) in the public subnet.
create_vm_1_3 = true

要在公共子网中创建三个计算实例,我们在下面的 Terraform 代码中使用了 count 元参数。与更复杂的 for_each 元参数相比,这种简洁的方法简化了创建过程。将 count 设置为 3 会自动生成索引为 0、1 和 2 的实例,从而提高代码的可读性和效率。

resource "oci_core_instance" "VM1-3" {
  count = (var.create_vm_1_3) ? 3 : 0

  availability_domain         = "GqIF:PHX-AD-1"
  compartment_id              = var.compartment_id
  create_vnic_details {
    assign_ipv6ip             = "false"
    assign_private_dns_record = "true"
    assign_public_ip          = "true"
    subnet_id                 = var.create_vcn ? oci_core_subnet.My-Public-Subnet.*.id[0] : var.public_subnet_id
    #nsg_ids                   = (var.create_vcn && var.create_nsg_1) && (count.index == 2) ? [oci_core_network_security_group.nsg-1.*.id[0]] : []
    nsg_ids = (var.automate_step_4 && var.create_nsg_1) ? (var.create_vcn ? [oci_core_network_security_group.nsg-1.*.id[0]] : [oci_core_network_security_group.nsg-01.*.id[0]]) : [] 

  }

  display_name  = "${var.display_name_prefix}-VM-0${count.index + 1}"
  metadata = {
    "ssh_authorized_keys"     = "${file(var.ssh_public_key)}"
  }

  shape                       = "VM.Standard.A1.Flex"
  shape_config {
    memory_in_gbs             = "6"
    ocpus                     = "1"
  }

  source_details {
    source_id                = var.amper_image_id
    source_type              = "image"
  }
}

注:要通过 SSH 访问公共 VM,请生成您自己的 SSH 密钥对。有关更多信息,请参见 Generate SSH keys

接下来,启用 create_vm_4 标志以指示 Terraform 在专用网络中创建 VM-04。

# Step 3b: Launch the fourth VM (VM-04) in the private subnet.
create_vm_4   = true

这是在专用子网中创建第四个实例 (VM-04) 的 Terraform 代码的一部分。

resource "oci_core_instance" "vm-4" {
  count = (var.create_vm_4) ? 1 : 0

  availability_domain         = "GqIF:PHX-AD-1"
  compartment_id              = var.compartment_id

  create_vnic_details {
    #assign_ipv6ip            = "false"
    assign_private_dns_record = "true"
    assign_public_ip          = "false"
    subnet_id                 = var.create_vcn ? oci_core_subnet.My-Private-Subnet.*.id[0] : var.private_subnet_id
    #nsg_ids                   = (var.create_vcn && var.create_nsg_1) ? [oci_core_network_security_group.nsg-2.*.id[0]] : []
    nsg_ids = (var.automate_step_6 && var.create_nsg_2) ? (var.create_vcn ? [oci_core_network_security_group.nsg-2.*.id[0]] : [oci_core_network_security_group.nsg-02.*.id[0]]) : []                                    
  }

  display_name                = "${var.display_name_prefix}-VM-04"
  shape                       = "VM.Standard.A1.Flex"
  shape_config {
    memory_in_gbs             = "6"
    ocpus                     = "1"
  }

  source_details {
    source_id                = var.amper_image_id
    source_type              = "image"
  }
}

手动 ICMP 回显测试:观察 NSG 对流量的影响。

  1. 转到 OCI 控制台,导航到计算实例。将列出所有四个实例。

  2. 请注意这三个实例的公共 IP 地址(VM-01、VM-02、VM-03)。

  3. 在您的计算机上,对每个 VM 实例的公共 IP 地址执行 ping 操作。

预期结果:

Automated ICMP Echo Testing:此测试使用 Terraform local-exec 预配器自动执行。

编辑 input.auto.tfvars 文件以设置 icmp_ping_count 变量的值。要允许从本地计算机对三个公共 VM 中的每个 VM 执行 ping 操作,请将 icmp_pingvm?_fromlocal 标志设置为 true(其中 1、2 或 3 表示特定 VM)。

# ICMP ping from Local Computer (First Attempt)
icmp_pingvm1_fromlocal = true
icmp_pingvm2_fromlocal = true
icmp_pingvm3_fromlocal = true

任务 4:配置 ICMP 入站流量并将 vNICs 连接到 NSG-01

手动选项:

配置 VM-03 与 NSG-01 之间的通信所需的以下子任务。

任务 4.1:在联网中添加新的入站规则

要更新第一个 NSG (NSG-01),请按照图 3 中概述的步骤操作。

  1. 选择 VCN。

  2. 网络安全组下,选择 NSG-01,然后单击添加规则

  3. 输入以下信息,然后单击添加

    • 源类型:输入 CIDR
    • 源 CIDR:输入 0.0.0.0/0
    • IP 协议:选择 ICMP
    • 类型:输入 8
    • 代码:选择全部

    图像 图 3:将入站规则添加到 NSG-01 以允许从 Internet 进行 ICMP Ping

任务 4.2:将第三个 VM (VM-03) 配置为指向 NSG-01

要将 NSG-01 连接到 VM-03 虚拟网络接口 (virtual network interface,VNIC),请按照图 4 中概述的步骤操作。

  1. 计算下,单击实例VM-03查看详细信息

  2. 选择连接的 vNICs,然后单击 Primary vNIC(主 vNIC)

  3. vNIC 信息下,单击 Network Security Group(网络安全组)旁边的 Edit(编辑)链接,然后选择 NSG-01。

  4. 单击 Save Changes(保存更改)。

图像 图 4:将 NSG-01 连接到 VM-03 vNIC

自动选项:

转到 input.auto.tfvars 文件并打开 automate_step_4 标志。

# Step 4: Add CIDR ingress rule in Network, attach VM-03 vNIC with NSG-01.
automate_step_4 = true

注:

手动检查:从本地计算机对 VM-01、VM-02 和 VM-03 的公共 IP 地址执行第二次 ICMP 回显测试 (ping)。

结果

自动检查:导航到 input.auto.tfvars 文件并将所有 icmp_pingvm?_fromlocal 标志设置为 true(其中 1、2 或 3 表示特定 VM)。

# ICMP ping from Local Computer (Second Attempt)
icmp_pingvm1_fromlocal = true
icmp_pingvm2_fromlocal = true
icmp_pingvm3_fromlocal = true

任务 5:在嵌套两个 NSG 之前运行 ICMP Ping

手动选项:

最初尝试从三个公共 VM ping VM-04 的专用 IP 地址。

预期结果:所有 ping 尝试都将失败。要启用连接,需要嵌套 NSG 体系结构。

自动选项:

将每个公共 VM(VM-01、VM-02 和 VM-03)的 icmp_test_from_vm? 标志设置为 true。替换为每个标志名称中的特定 VM 编号(1、2 或 3)。

# Step 5: SSH to VM-01, VM-02, VM-03 and ping VM-04 (First Attempt).
icmp_test_from_vm1 = true
icmp_test_from_vm2 = true
icmp_test_from_vm3 = true

此选项利用 Terraform remote-exec 预配器自动执行 ICMP 测试。您需要指定与创建 VM 期间使用的公共密钥相对应的专用 SSH 密钥。shell 脚本 ping_script.sh 迭代通过 icmp_ping_count 定义的试通次数。

resource "null_resource" "icmp_ping_vm4_from_vm1" {
  depends_on = [oci_core_instance.VM1-3[0]]
  count      = (var.icmp_test_from_vm1) ? 1 : 0

  connection {
    agent       = false
    host        = oci_core_instance.VM1-3[0].public_ip
    user        = "opc"
    private_key = file(var.ssh_private_key)
  }

  # At this stage we assume that the ping_script.sh is copied under /home/opc
  provisioner "remote-exec" {
    inline = [
      "echo \" PING PRIVATE IP ${oci_core_instance.vm-4[0].private_ip}\"",
      "chmod +x ping_script.sh",
      "export TARGET_IP=${oci_core_instance.vm-4[0].private_ip}",
      "export PING_COUNT=${var.icmp_ping_count}",
      "sh ping_script.sh",
    ]
  }
}

任务 6:配置嵌套 NSG(NSG-01 和 NSG-02)

手动选项:

使用指定 NSG-01 作为源的入站规则配置第二个 NSG (NSG-02),从而启用两个 NSG 之间的 ICMP 流量流。

任务 6.1:在网络(虚拟云网络)中添加入站规则

  1. 在 VCN (VCN-01) 下,单击安全规则

  2. 选择 NSG-02 ,然后单击添加规则

  3. 输入以下信息,然后单击添加

    • 源类型:选择 Network Security Group(网络安全组)
    • 来源:输入 NSG-01
    • IP 协议:选择 ICMP
    • 类型:输入 8
    • 代码:选择全部

    图像 图 5:将 NSG-01 作为源添加到 NSG-02 入站规则

任务 6.2:将第四个 VM (VM-04) 配置为指向 NSG-02

  1. 在 VM-04 的 vNIC 信息(图 6)下,单击 NSG 旁边的 Edit(编辑)链接,然后选择 NSG-02

  2. 单击保存更改

图像 图 6:将 NSG-02 连接到 VM-04 vNIC

自动选项:

要自动执行此任务,请在 input.auto.tfvars 文件中将 automate_step_6 设置为 true。

# Step 6: Add NSG-01 as ingress rule source, attach NSG-02 to VM04 vNIC.
automate_step_6 = true

任务 7:为嵌套 NSG 运行最终 ICMP 回显测试

手动端到端测试:

重新尝试从公共 VM 对 VM-04 的专用 IP 地址执行 ping 操作。

  1. 通过 SSH 访问公共子网中的三个实例(VM-01、VM-02、VM-03)。

  2. 从每个 IP 对 VM-04 的专用 IP 执行 ping 操作。只有 VM-03 成功,如图 1 所示。

解释: VM-04 的 vNIC 现在受 NSG-02 内的规则和缺省安全列表的规则约束。NSG-01 配置为 NSG-02 的入站规则源,允许来自 Internet 的流量。

自动化端到端测试:

使 Terraform 自动执行 ICMP 回显试通测试。

  1. 对于 3 个 VM(VM-01、VM-02 和 VM-03),将 icmp_test_from_vm? 标志设置为 true

  2. 如图 1 的左侧部分所示,只有 VM-03 成功 ping VM-04。

# Step 7: SSH to VM-01, VM-02, VM-03 and ping VM-04 (Second Attempt).
icmp_test_from_vm1 = true
icmp_test_from_vm2 = true
icmp_test_from_vm3 = true

图 7 显示在建立到 VM-03 的 SSH 连接后执行的多次 ICMP ping 尝试的结果。此图比较了实施嵌套 NSG 之前和之后的 ping 结果。

图像 图 7:将 NSG-02 嵌套到 NSG-01 并将 vNICs 连接到 VM 之前和之后的 Ping 结果

注:使用 Terraform 时,在从手动配置切换后重新创建 VM,以确保将 NSG-02 正确链接到 VM-04 vNIC。

部署选项

选项 1:使用 Terraform 命令行界面 (Community Edition,CLI)

在使用 Terraform CLI 运行 Terrafrom 命令来规划和部署基础设施之前,您需要使用本地计算机或 OCI Cloud Shell 上的特定环境详细信息更新提供的 Terraform 配置。请从此处下载完整的 Terraform 源代码: oci-blog-fast-tracking-apcertif-main.zip 。您需要为环境定制的唯一文件是 input.auto.tfvars 文件(同样命名的文件是 terraform.tfvars)。例如,您可以指定已用计算机映像 (amper_image_id) 的 OCID 以及将在其中创建实验室资源的区间 (compartment_id) 的 OCID(仅在需要时修改默认值)。该软件包提供了有关设置环境、执行实验以及了解网络和安全概念的全面说明。它包含详细的指南、提示和优秀实践,可帮助您增强 OCI 高级学习体验。

##########################################################################
# Terraform module: Nested NSGs - NSG-01 as Ingress source to NSG-02.    #
#                                                                        #
# Copyright (c) 2024 Oracle        Author: Mahamat Hissein Guiagoussou   #
##########################################################################

# Working Compartment
compartment_id = "REPLACE_WORKING_COMPARTMENT_OCID_HERE"

# Image OCID - https://docs.oracle.com/en-us/iaas/images/
amper_image_id = "REPLACE_INSTANCE_REGIONAL_IMAGE_OCID_HERE"

# Region based display name prefix
display_name_prefix = "AP-LAB01-1" # Replace with your own prefix

##########################################################################
# Step 1a - Create VCN using VCN Wizard (turn off the create_vcn flag),  #
##########################################################################
create_vcn        = false
vcn_id            = "REPLACE_VCN_OCID_HERE"
private_subnet_id = "REPLACE_PRIVATE_SUBNET_OCID_HERE"
public_subnet_id  = "REPLACE_PUBLIC_SUBNET_OCID_HERE"

##########################################################################
# Step 1b - Create VCN using Terraform. Provide the CIDR Blocks for the  #
#           VCN, Subnets and other required input (host_name_prefix).    #
##########################################################################
cvcn_cidr_block           = "10.0.0.0/16"
public_subnet_cidr_block  = "10.0.0.0/24"
private_subnet_cidr_block = "10.0.1.0/24"
host_name_prefix          = "phxapl4"

##########################################################################
# Step 2: Create two(2) empty Network Security Groups: NSG-01 & NSG-02.  #
##########################################################################
create_nsg_1 = false
create_nsg_2 = false

##########################################################################
# Step 3a: Launch three VMs(VM-01, VM-02, VM-03) in the public subnet.   #
##########################################################################
create_vm_1_3 = false

##########################################################################
# Step 3b: Launch the fouth VM (VM-04) in the private subnet.            #
##########################################################################
create_vm_4 = false

# Shape Definition
shape_name  = "VM.Standard.A1.Flex"
shape_memory_in_gbs = "6"
shape_numberof_ocpus = "1"

# Ping all public VM from Local Computer
icmp_pingvm1_fromlocal = false
icmp_pingvm2_fromlocal = false
icmp_pingvm3_fromlocal = false

# Compute Instance SSH keys
ssh_public_key  = "~/cloudshellkey.pub"
ssh_private_key = "~/cloudshellkey"

# Ping VM-04 from Public VMs (VM-02, VM-02, and VM-03) via SSH
icmp_test_from_vm1 = false
icmp_test_from_vm2 = false
icmp_test_from_vm3 = false

##########################################################################
# Step 4: Add CIDR ingress rule in Network & Attach VM3 vNIC with NSG-01 #
##########################################################################
automate_step_4 = false

##########################################################################
# Step 5: SSH to VM-01, VM-02, VM-03 and ping VM-04 (First Attempt).     #
##########################################################################

##########################################################################
# Step 6: Add NSG-01 as ingress rule source, Attach VM4 vNIC with NSG-02 #
##########################################################################
automate_step_6 = false

##########################################################################
# Step 7: SSH to VM-01, VM-02, VM-03 and ping VM-04 (Second Attempt).    #
##########################################################################

# Number of time ping is executed
icmp_ping_count =  "REPLACE_NUMBER_OF_PING_ATTEMPTS_HERE"

选项 2:使用 Oracle Resource Manager(变量输入样例)

通过定义变量(例如 amper_image_idcompartment_id)、预配网络资源 (create_vcncreate_msg_1/2)、创建 VM (create_vm_1_3create_vm_4shape_name)、ICMP ping(icmp_pingvm1_fromlocalicmp_test_from_vm1) 以及执行部署基础结构的计划来创建 Oracle 资源管理器堆栈。

图像

后续步骤

使用 Terraform 的基础设施即代码 (IaC) 原则通过加速部署和增强安全性显著增强了基础设施管理。例如,在 OCI Architect Professional Certification (2024) 练习 1:成为 OCI Architect Professional (2024) 中手动配置嵌套 NSG 通常需要大约 25 分钟。

利用 Terraform,我们显著缩短了供应和配置复杂 OCI 资源所需的时间,显著提高了效率。这为管理复杂网络安全配置的 OCI 用户带来了可衡量的时间和成本节省。此外,IaC 还可以提高一致性并降低人为错误的风险,使其成为学习和实际客户实施的有价值的模型。要了解有关将 IaC 与 Terraform 或其他类似工具结合使用以满足 OCI 自动化需求的更多信息,请考虑在剩余的 OCI Architect Professional 认证实验室中应用学到的原则,同时了解 OCI 参考架构和优秀实践。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心