附註:

使用 Oracle Cloud Native Framework 設定成本分析報表的事件型自動化電子郵件通知

簡介

每個在雲端執行工作負載的組織都非常熱衷於瞭解其在雲端的成本支出,並希望以有意義的方式報告。因此,Oracle Cloud Infrastructure (OCI) 提供一種功能,您可以根據成本建立自動化報表,然後在 OCI Object Storage 中取得這些報表。

對於這些成本報表,團隊也想要設定自動化,讓對應團隊在產生報表後立即收到通知。因此,他們也希望在通知中包含報表的連結。您可以使用 Oracle Cloud Native Framework 設定所有自動化。

目標

必要條件

作業 1:設定必要的 OCI IAM 原則和動態群組

  1. 登入 OCI 主控台,請前往動態群組並建立新的動態群組。

    建立動態群組

  2. 在規則 1 中輸入區間 OCID。您的 OCI 函數應存在於相同的區間中。

    設定動態群組

  3. 請前往 OCI IAM 原則並使用下列敘述句建立原則。

    allow dynamic-group dynamic_group_name to manage ons-family in compartment compartment_name
    
    allow dynamic-group dynamic_group_name to manage object-family in compartment compartment_name
    

    注意:

    • 請使用符合使用案例的特定 IAM 原則。請參閱以下範例:

      • allow dynamic-group dynamic_group_name to use ons-topics in compartment compartment_name where request.operation = 'PublishMessage'
      • allow dynamic-group dynamic_group_name to manage buckets in compartment compartment_name where all {request.operation = 'CreatePreauthenticatedRequest', target.bucket.name = 'bucket_name'}

作業 2:設定 OCI 物件儲存的儲存桶並建立排定的報表

  1. 使用 OCI 主控台建立儲存桶。我們將使用此儲存桶推送報表。請確定您建立的儲存桶是私密的,因為這將確保您的內容不受公用存取以及此儲存桶上已啟用允許物件事件的保護,因為這將允許事件在植入新物件時發出。

    建立儲存桶

  2. 前往成本管理、排定的報表,然後建立排定的報表。輸入名稱、描述、開始日期和週期。

    建立排定的報表

    選取要發布報表的儲存桶。若要從下拉式功能表中選取儲存桶,您必須新增原則 (如下圖所示),計量服務才能存取建立的儲存桶。

    建立排定的報表

  3. 儲存桶和排定的報表建立後,您可以查看已執行報表的歷史記錄,也可以查看報表發布到選取的 OCI 物件儲存的儲存桶。

    歷史記錄排定報表

作業 3:建立 OCI 通知主題並新增訂閱

  1. 建立傳送電子郵件通知所需的 OCI 通知主題。請前往通知、主題,然後建立主題。

    建立主題

  2. 在同一個主題中建立訂閱,然後新增要傳送通知的電子郵件。

    建立訂閱

    現在已設定 OCI Notifications 主題。

作業 4:建立與部署功能代碼

前往函數 / 應用程式並建立函數。此函數將使用 OCI IAM 動態群組和原則存取 OCI 物件儲存的儲存桶,並在發出的事件觸發函數時執行所需的作業 (建立排定的報表檔案的 PAR URL,並與其傳送通知)。

有多種方法可用來開發 OCI 函數,並提供快速入門指南,讓您瞭解如何使用 OCI Cloud Shell、OCI 虛擬機器或本機執行來設定開發環境。本指南其餘部分中的映像檔將顯示 OCI Cloud Shell,但上述任何一種方法均有效。我們使用 Python 編寫必要的邏輯程式碼,但您可以使用其他語言,並視需要變更邏輯。

  1. 若要撰寫程式碼,請開啟 OCI Cloud Shell 中的 requirement.txt 和 func.py 檔案。

    部署函數

  2. 以下是函數代碼,它會使用 OCI 資源主體,因此您不需要保留 OCI 證明資料。請記得取代您建立的變數,例如儲存桶名稱、主題 OCID 等等。

    • requirements.txt.

      fdk>=0.1.71
      oci>=2.112.0
      
    • func.yaml.

      schema_version: 20180708
      name: reportsauto
      version: 0.0.6
      runtime: python
      build_image: fnproject/python:3.11-dev
      run_image: fnproject/python:3.11
      entrypoint: /python/bin/fdk /function/func.py handler
      memory: 256
      
    • func.py.

      import io
      import json
      import logging
      import oci
      from datetime import datetime
      
      from fdk import response
      
      
      def handler(ctx, data: io.BytesIO = None):
          try:
              body = json.loads(data.getvalue())
              logging.getLogger().info(body.get("eventType"))
              logging.getLogger().info(body.get("data").get("resourceName"))
          except (Exception, ValueError) as ex:
              logging.getLogger().info('error parsing json payload: ' + str(ex))
      
          logging.getLogger().info("Inside Python Hello World function")
          initiateFn(body.get("data").get("resourceName"))
          return response.Response(
              ctx, response_data=json.dumps(
                  {"message": "Function Executed!"}),
              headers={"Content-Type": "application/json"}
          )
      
      def initiateFn(uploaded_file):
          logging.getLogger().info("Reached initiate function...")
      
          signer = oci.auth.signers.get_resource_principals_signer()
          object_storage_client = oci.object_storage.ObjectStorageClient(config={}, signer=signer)
          namespace_name="orasenatdplt01"
          bucket_name="demobucket"
      
          now = datetime.now()
          par_name = "PAR_Request_" + str(now).split('.')[0].replace(" ", "_").replace(":", "_").replace("-", "_")
          create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name=namespace_name,
              bucket_name=bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                  name=par_name,
                  access_type="ObjectRead",
                  time_expires=datetime.strptime(
                      "2037-06-05T04:25:22.344Z",
                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                  object_name=uploaded_file))
      
          callNotificationAPI(create_preauthenticated_request_response.data)
      
      # Function to call Notification API as soon as an object push is detected
      def callNotificationAPI(parData):
          logging.getLogger().info("Trigger notification as object push is detected...")
          topicOcid = "ocid1.onstopic.oc1.iad.amaaaaxxxxxxxxxamn4"
          signer = oci.auth.signers.get_resource_principals_signer()
          ons_client = oci.ons.NotificationDataPlaneClient(config={}, signer=signer)
          publish_message_response = ons_client.publish_message(
              topic_id=topicOcid,
              message_details=oci.ons.models.MessageDetails(
                  body="OCI Notification Service - Cost Report File is created: " + str(parData.full_path),
                  title="OCI Notification Service - Cost Report File is created"),
              message_type="RAW_TEXT")
          logging.getLogger().info("Triggered notification as object push is detected...")
      
  3. 使用 OCI Cloud Shell 上的下列命令,更新登錄中的功能並部署最新的程式碼。

    fn -v deploy — app reportsauto
    
  4. 部署之後,即可呼叫您的函數。您可以嘗試使用函數呼叫命令來測試,並確保函數可視需要運作。

    DEBUG=1 fn invoke reportsauto your_app_name
    

    注意:

    • OCI 支援資源 / 執行處理主體,以避免在執行函數時提供任何使用者相關資訊。因此,需要此工作來確定函數具有呼叫 API 的正確權限集,失敗函數將無法正常運作。

    • ( 選擇性 ) 您也可以檢查除錯模式以進行疑難排解。例如:從 OCI Cloud Shell 執行下列命令,以呼叫並測試函數是否如預期般運作。

      DEBUG=1 fn invoke e2e-function-demo e2e-fn-streaming
      

作業 5:設定 OCI 事件規則

  1. 移至「OCI 主控台」,按一下應用程式整合、事件服務、規則以及建立事件規則。輸入規則條件並新增在「任務 4」中建立的函數作為觸發動作。

  2. 輸入顯示名稱和描述。

    建立事件規則

  3. 在規則條件區段中,選取第一個條件作為事件類型、物件儲存、物件 - 建立,以及另一個條件作為屬性、bucketName 、demoBucket 。

    定義事件規則

  4. 透過動作區段以函數連接事件。選取函數區間、函數應用程式,以及部署在「工作 4」中的函數。

    事件規則目標

  5. 按一下儲存變更,以儲存事件規則。這會在條件符合 OCI 物件儲存的儲存桶所發出事件時呼叫函數。

認可

其他學習資源

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

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