附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱 Oracle Cloud Infrastructure Free Tier 入門。
- 它使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值取代為您雲端環境特定的值。
使用事件規則和 Python 函數,將 OCI Compute 執行處理的執行處理描述資料服務更新自動化至版本 2
簡介
對於現代企業而言,確保跨雲端環境的安全性和一致性是首要任務。在 Oracle Cloud Infrastructure (OCI) 中,執行處理描述資料服務 (IMDS) 提供重要的執行處理特定資訊,並強制使用版本 2 (IMDSv2) 透過需要階段作業式認證來增強安全性。在所有 OCI Compute 執行處理上將升級自動化至 IMDSv2 是維護此安全標準的有效方法,同時降低手動負荷。
本教學課程示範如何使用 OCI 事件服務規則和 OCI 函數建置自動化、事件導向的工作流程,以強制執行 IMDSv2 更新。透過運用以 Python 為基礎的自動化,您將建立和設定必要的 OCI 資源 (例如動態群組、事件規則和無伺服器函數),以無縫接軌的方式確保符合此增強的安全協定。
目標
- 將 IMDS 自動更新為 OCI 中的版本 2,確保更安全,並控制執行處理描述資料存取。透過使用事件規則和 Python 函數,您可以建立在每次啟動新例項時強制執行此更新的自動化工作流程。此方法可簡化執行處理描述資料設定值的管理,同時保持雲端環境的一致性。
必要條件
-
Oracle Cloud Infrastructure 命令行介面 (OCI CLI) 和 Python 軟體開發套件 (SDK):安裝並設定 OCI CLI 和 Python SDK 以進行程式設計存取。
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 原則:確保已制定必要的 OCI IAM 原則來管理動態群組、函數及事件規則。
-
區間 Oracle Cloud ID (OCID): 取得將部署資源之區間的 OCID。
-
Python 環境:在已安裝 OCI 程式庫 (
pip install oci
) 的情況下設定 Python。 -
OCI 函數設定:確定您的租用戶中已啟用 OCI 函數,且已設定 Docker 環境以進行部署。
-
使用者權限: 請確定您具備建立及管理 OCI 資源的權限。
工作 1:建立動態群組
定義允許函數存取目標執行處理的動態群組。若要使用其他 OCI 服務,您的函數必須是動態群組的一部分。
ALL {resource.type = 'fnfunc'}
指定比對規則時,建議比對區間中的所有函數:
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}
作業 2:定義 OCI IAM 原則
建立允許動態群組管理運算執行處理的新原則。我們將授予對特定區間中執行處理的管理存取權。
Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name
作業 3:建立及部署 OCI 函數
建立、部署及呼叫 IMDS 更新的函數。
-
在 OCI 主控台中建立應用程式。
登入 OCI 主控台,瀏覽至開發人員服務、函數,然後按一下應用程式。為 OCI 函數選取適當的區域,然後按一下建立應用程式。
-
設定函數部署的環境,請在您的 OCI Cloud Shell 或 OCI Compute 執行處理 (執行 Oracle Linux 8) 或計畫建立及部署此函數的任何系統上執行下列設定。
-
安裝下列資源: Installing the CLI 、 Install Fn Project CLI 以及 Install Oracle Cloud Infrastructure Python SDK 。
-
請遵循 OCI Compute 實例上的 OCI Functions QuickStart 中的詳細設定指南來準備環境。此準備可確保您的環境已準備好無縫建立、部署及管理 OCI 函數。
注意:請確認您的函數映像檔在 OCI 登錄中已建立儲存區域。
-
-
登入 OCI Cloud Shell 或 OCI Compute 執行處理,並存取您要在其中建立函數的 OCI Cloud Shell 或 OCI Compute 執行處理。設定 OCI Functions CLI 的相關資訊環境,以指定將部署函數的區域。
fn use context <region-name> Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
-
以區間 ID 更新相關資訊環境。執行下列命令以設定應用程式所在的區間。
fn update context oracle.compartment-id <compartment-ocid>
-
設定 OCI 登錄。輸入唯一的儲存區域名稱前置碼,以區分您的函數影像。請執行下列命令來更新登錄。
fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix> Example: ap-hyderabad-1.ocir.io/namespace/prefix.
-
從 OCI 主控台在您的使用者設定檔下產生認證權杖,然後執行下列命令以使用認證權杖登入容器登錄。
docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
-
列出應用程式以確認應用程式是否正確設定。執行下列命令以列出應用程式。
fn list apps
-
使用 Python 程式實際執行建立一個名為
imdsupdate
的新函數,然後起始函數。fn init --runtime python imdsupdate
-
執行下列命令以瀏覽至建立的目錄。
cd imdsupdate
-
執行
ls
命令以列出產生的檔案。ls
作業 4:更新 Python 函數代碼
-
開啟並編輯目錄中產生的 Python 檔案 (例如
func.py
),然後新增下列 python 程式碼至邏輯的函數檔案。import io import json import logging from fdk import response import oci def handler(ctx, data: io.BytesIO = None): try: # Authenticate using Instance Principals signer = oci.auth.signers.get_resource_principals_signer() body = json.loads(data.getvalue()) logging.getLogger().info("Event body: " + str(body)) # Extract Required Details From Event Rule instance_id = body["data"]["resourceId"] # Instance OCID action_type = body["eventType"] logging.getLogger().info("Action type: " + action_type) # Proceed only if instance creation event if action_type == "com.oraclecloud.computeapi.launchinstance.end": compute_client = oci.core.ComputeClient(config={}, signer=signer) update_instance_imds(compute_client, instance_id) except (Exception, ValueError) as ex: logging.getLogger().error("Error: " + str(ex)) return response.Response( ctx, response_data=json.dumps({"message": "Error: " + str(ex)}), headers={"Content-Type": "application/json"}, ) return response.Response( ctx, response_data=json.dumps({"message": "Function executed successfully"}), headers={"Content-Type": "application/json"}, ) def update_instance_imds(compute_client, instance_id): """ Updates the instance metadata service (IMDS) configuration to disable legacy endpoints. """ try: # Fetch instance details instance_details = compute_client.get_instance(instance_id).data # Update instance configuration update_details = oci.core.models.UpdateInstanceDetails( instance_options=oci.core.models.InstanceOptions( are_legacy_imds_endpoints_disabled=True # Disable legacy endpoints ) ) response = compute_client.update_instance(instance_id, update_details) logging.getLogger().info( f"Successfully updated IMDS for instance {instance_id}: {response.data}" ) except Exception as ex: logging.getLogger().error("Failed to update IMDS: " + str(ex)) raise
-
更新
requirements.txt
檔案。fdk>=0.1.86 oci==2.138.0
-
執行下列命令,將函數部署至建立的應用程式。
fn -v deploy --app <application-name> Example: fn -v deploy --app functionpyth.
這些步驟可確保在 OCI 中建立、部署及呼叫函數,以便自動執行 IMDS 版本更新。
作業 5:定義事件規則
您可以使用 OCI 事件服務來偵測何時建立新的 OCI Compute 執行處理。
若要設定事件規則,請輸入下列資訊。
- 事件來源:選取運算執行處理。
- 條件:選取事件類型為實例 – 啟動結束。
- 動作:選取觸發函數,輸入函數、函數區間、函數應用程式,以及您在「工作 4」中建立的觸發函數。
作業 6:驗證執行處理 IMDS 值
啟動新的執行處理以觸發事件規則並驗證執行處理描述資料服務組態。虛擬機器 (VM) 建立完成後,只會將 IMDS 值設為版本 2。
這些組態都是區域和區間特定的組態。若要呼叫其他區間中的相同函數,請在該區間中建立一個事件規則,然後設定觸發此函數的規則。
完成這些作業後,您將自動將特定區間中 OCI Compute 執行處理的 IMDS 版本更新為 v2。
相關連結
認可
- 作者 - Akarsha I K (雲端架構師)
其他學習資源
探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Automate the Instance Metadata Service update to version 2 only for OCI Compute Instances using Event Rules and Python Functions
G24783-01
January 2025