附註:

使用 Terraform 加速 Oracle Cloud Infrastructure 專業架構師認證

簡介

獲得 Oracle Cloud Infrastructure (OCI) 專業架構師認證需要對 Oracle Cloud 和實作體驗有深入的瞭解。本教學課程運用基礎架構即程式碼 (IaC) 與 Terraform 加速您的旅程。

圖 0

下圖 1 說明要部署的目標 OCI 架構。右側概述了 OCI Architect Professional 認證 (2024) 實驗室的結構化方法,分為七個循序步驟。藉由運用專為認證考試實驗室量身打造的預先建置 Terraform 程式碼片段,重複性工作會自動執行,讓您有寶貴的時間專心掌握重要的 OCI 概念。此方法不僅加快實驗室完成速度,還能更深入瞭解平台。

圖 1 圖 1:OCI Architecture Professional 認證實驗室 1 - 架構與手動與自動化流程

運用手動方法

OCI 認證考試實際操作實驗室的手動方法很困難。部分缺點為:

更快速掌握 OCI 技能:自動化的強大功能

本教學課程說明如何藉由自動化作業、專注於核心技能及縮短實務時間,來加速 OCI 認證。

主要優點:

其他福利:

為了加快您的 OCI 專業架構師認證 (2024) 旅程,我們將使用 Terraform 將圖 1 所示的實驗室 1:Oracle Cloud Infrastructure 專業架構師自動化。此自動化方法可以擴展到其他認證實驗室和實際的雲端部署。

網路安全群組 (NSG) 作為另一個 NSG 的傳入來源,而非 CIDR 區塊

本教學課程探索 OCI 中的網路安全群組,以及如何對虛擬雲端網路 (VCN) 中的網路流量提供精細的控制。網路安全群組的作用就像是虛擬防火牆,可控制對 VCN 內資源的網路存取。這包括 OCI Compute 執行處理、Kubernetes 叢集或資料庫等。「網路安全群組」在資源之間啟用控制,而非只在子網路之間啟用,因此提供比安全清單更大的彈性。

7 個步驟中的半自動化混合方法

OCI Architect Professional 認證實作實驗室雖然全面,但可能相當耗時。考慮實驗室 1:Oracle Cloud Infrastructure 專業架構師,至少需要 25 分鐘才能完成。透過使用 Terraform 自動建立 VCN、NSG 和虛擬機器 (VM) 等重複性作業,您現在可以將此時間減少多達 80%,專注於核心安全概念,而非繁瑣的手動步驟。建議的半自動方法提供彈性,讓您選擇要自動執行的工作。

目標

必要條件

作業 1:建立虛擬雲端網路 (VCN)

手動選項:

使用 OCI VCN 精靈可建立核心網路資源:VCN、網際網路閘道、路由表、安全清單、公用和專用子網路。如需詳細資訊,請參閱虛擬網路快速啟動

  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,並執行網際網路控制訊息協定 (ICMP) 偵測測試

假設您熟悉從 OCI 主控台手動啟動 VM。如需詳細資訊,請參閱建立執行處理

注意:我們只涵蓋建立 4 個 VM 的 Terraform 自動化選項 (公用子網路中有 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

這是 Terraform 程式碼的一部分,可在專用子網路中建立第四個執行處理 (VM-04)。

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 位址。

預期的結果:

自動 ICMP 回應測試:此測試使用 Terraform local-exec 啟動設定器自動執行。

編輯 input.auto.tfvars 檔案以設定 icmp_ping_count 變數的值。若要啟用從本機電腦偵測這三個公用 VM 中的每個項目,請將 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 以允許從網際網路進行 ICMP 偵測

作業 4.2:設定要指向 NSG-01 的第三個 VM (VM-03)

若要將 NSG-01 連附至 VM-03 虛擬網路介面 (VNIC),請依照圖 4 中所述的步驟進行。

  1. 運算下,按一下執行處理VM-03 以及檢視詳細資訊

  2. 選取附加的 vNICs,然後按一下主要 vNIC

  3. vNIC 資訊底下,按一下網路安全群組旁的編輯連結,然後選取 NSG-01。

  4. 按一下儲存變更

圖像 圖 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 VM-01、VM-02 和 VM-03 的公用 IP 位址執行第二個 ICMP 回應測試 (偵測)。

結果:

自動檢查:瀏覽至 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 偵測

手動選項:

最初嘗試從三個公用 VM 偵測 VM-04 的專用 IP 位址。

預期結果:所有偵測嘗試都會失敗。若要啟用連線,需要使用巢狀 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. 輸入下列資訊,然後按一下新增

    • 來源類型:選取網路安全群組
    • 來源:輸入 NSG-01
    • IP 協定:選取 ICMP
    • 類型:輸入 8
    • 代碼:選取全部

    圖像 圖 5:將 NSG-01 新增為 NSG-02 傳入規則的來源

作業 6.2:設定第四部 VM (VM-04) 以指向 NSG-02

  1. 在 VM-04 的 vNIC 資訊底下 (圖 6),按一下 NSG 旁的編輯連結,然後選取 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 位址。

  1. SSH 至公用子網路 (VM-01、VM-02、VM-03) 中的三個執行處理。

  2. 從每個 IP ping VM-04 的專用 IP。如圖 1 所示,只有 VM-03 成功。

說明: VM-04 的 vNIC 現在受 NSG-02 內的規則和預設安全清單的規則控制。NSG-01 設定為 NSG-02 的傳入規則來源,允許來自網際網路的流量。

自動化端對端測試:

啟用 Terraform 以自動執行 ICMP 回應偵測測試。

  1. 將每個 3 個 VM (VM-01、VM-02 和 VM-03) 的 icmp_test_from_vm? 旗標設為 true

  2. 如圖 1 的左側部分所述,只有 VM-03 成功偵測 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 偵測嘗試的結果。此圖比較實行巢狀 NSG 之前和之後的 ping 結果。

圖像 圖 7:將 NSG-02 巢狀至 NSG-01 並將 vNICs 連附至 VM 之前和之後的偵測結果

注意:使用 Terraform 時,請在從手動組態切換之後重新建立 VM,以確保將 NSG-02 正確連結至 VM-04 vNIC。

部署選項

選項 1:使用 Terraform 指令行介面 (CLI) (Community Edition)

使用 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 資源管理程式」堆疊。

圖像

接下來的步驟

基礎架構即程式碼 (IaC) 原則 (使用 Terraform) 可透過加速的部署和改進的安全性,大幅強化基礎架構管理。例如,在 OCI Architect Professional 認證 (2024) 中手動設定巢狀 NSG 實驗室 1:成為 OCI Architect Professional (2024) 通常耗用大約 25 分鐘。

藉由運用 Terraform,大幅縮短佈建及設定複雜 OCI 資源所需的時間,大幅提升效率。這代表管理複雜網路安全組態的 OCI 使用者可節省大量時間和成本。此外,IaC 可提升一致性並降低人為錯誤的風險,使其成為學習和實際客戶導入的寶貴模型。若要深入瞭解如何將 IaC 與 Terraform 或其他類似工具套用至您的 OCI 自動化需求,請考慮在其餘的 OCI Architect 專業認證實驗室中套用學習原則,同時探索 OCI 參考架構和最佳實務。

認可

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center