附註:

使用事件規則和 Python 函數,將 OCI Compute 執行處理的執行處理描述資料服務更新自動化至版本 2

簡介

對於現代企業而言,確保跨雲端環境的安全性和一致性是首要任務。在 Oracle Cloud Infrastructure (OCI) 中,執行處理描述資料服務 (IMDS) 提供重要的執行處理特定資訊,並強制使用版本 2 (IMDSv2) 透過需要階段作業式認證來增強安全性。在所有 OCI Compute 執行處理上將升級自動化至 IMDSv2 是維護此安全標準的有效方法,同時降低手動負荷。

本教學課程示範如何使用 OCI 事件服務規則和 OCI 函數建置自動化、事件導向的工作流程,以強制執行 IMDSv2 更新。透過運用以 Python 為基礎的自動化,您將建立和設定必要的 OCI 資源 (例如動態群組、事件規則和無伺服器函數),以無縫接軌的方式確保符合此增強的安全協定。

目標

執行處理 IMDS 更新

必要條件

工作 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 更新的函數。

  1. 在 OCI 主控台中建立應用程式。

    登入 OCI 主控台,瀏覽至開發人員服務函數,然後按一下應用程式。為 OCI 函數選取適當的區域,然後按一下建立應用程式

    OCI Functions

  2. 設定函數部署的環境,請在您的 OCI Cloud Shell 或 OCI Compute 執行處理 (執行 Oracle Linux 8) 或計畫建立及部署此函數的任何系統上執行下列設定。

  3. 登入 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).
    
  4. 以區間 ID 更新相關資訊環境。執行下列命令以設定應用程式所在的區間。

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. 設定 OCI 登錄。輸入唯一的儲存區域名稱前置碼,以區分您的函數影像。請執行下列命令來更新登錄。

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. 從 OCI 主控台在您的使用者設定檔下產生認證權杖,然後執行下列命令以使用認證權杖登入容器登錄。

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. 列出應用程式以確認應用程式是否正確設定。執行下列命令以列出應用程式。

    fn list apps
    
  8. 使用 Python 程式實際執行建立一個名為 imdsupdate 的新函數,然後起始函數。

    fn init --runtime python imdsupdate
    
  9. 執行下列命令以瀏覽至建立的目錄。

    cd imdsupdate
    
  10. 執行 ls 命令以列出產生的檔案。

    ls
    

作業 4:更新 Python 函數代碼

  1. 開啟並編輯目錄中產生的 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
    
  2. 更新 requirements.txt 檔案。

    fdk>=0.1.86
    oci==2.138.0
    
  3. 執行下列命令,將函數部署至建立的應用程式。

    fn -v deploy --app <application-name>
    Example: fn -v deploy --app functionpyth.
    

這些步驟可確保在 OCI 中建立、部署及呼叫函數,以便自動執行 IMDS 版本更新。

功能代碼更新

作業 5:定義事件規則

您可以使用 OCI 事件服務來偵測何時建立新的 OCI Compute 執行處理。

若要設定事件規則,請輸入下列資訊。

事件規則

作業 6:驗證執行處理 IMDS 值

啟動新的執行處理以觸發事件規則並驗證執行處理描述資料服務組態。虛擬機器 (VM) 建立完成後,只會將 IMDS 值設為版本 2。

這些組態都是區域和區間特定的組態。若要呼叫其他區間中的相同函數,請在該區間中建立一個事件規則,然後設定觸發此函數的規則。

完成這些作業後,您將自動將特定區間中 OCI Compute 執行處理的 IMDS 版本更新為 v2。

認可

其他學習資源

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

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