附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 憑證、租用戶及區間的範例值。完成實驗室時,請以雲端環境特有的值取代這些值。
使用 Oracle Cloud Native Framework 設定成本分析報表的事件型自動化電子郵件通知
簡介
每個在雲端執行工作負載的組織都非常熱衷於瞭解其在雲端的成本支出,並希望以有意義的方式報告。因此,Oracle Cloud Infrastructure (OCI) 提供一種功能,您可以根據成本建立自動化報表,然後在 OCI Object Storage 中取得這些報表。
對於這些成本報表,團隊也想要設定自動化,讓對應團隊在產生報表後立即收到通知。因此,他們也希望在通知中包含報表的連結。您可以使用 Oracle Cloud Native Framework 設定所有自動化。
目標
-
設定產生 OCI 成本的報表,並根據報表產生產生事件。
-
使用 OCI 上的雲端原生託管服務設定所有自動化。
必要條件
-
Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 中建立動態群組、原則、儲存桶、函數、設定事件和通知服務的必要權限。
-
存取所有必要元件以檢視其 Oracle Cloud ID (OCID) 和其他資訊。
-
存取 OCI Cloud Shell 以建立、部署及呼叫函數。
作業 1:設定必要的 OCI IAM 原則和動態群組
-
登入 OCI 主控台,請前往動態群組並建立新的動態群組。
-
在規則 1 中輸入區間 OCID。您的 OCI 函數應存在於相同的區間中。
-
請前往 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 物件儲存的儲存桶並建立排定的報表
-
使用 OCI 主控台建立儲存桶。我們將使用此儲存桶推送報表。請確定您建立的儲存桶是私密的,因為這將確保您的內容不受公用存取以及此儲存桶上已啟用允許物件事件的保護,因為這將允許事件在植入新物件時發出。
-
前往成本管理、排定的報表,然後建立排定的報表。輸入名稱、描述、開始日期和週期。
選取要發布報表的儲存桶。若要從下拉式功能表中選取儲存桶,您必須新增原則 (如下圖所示),計量服務才能存取建立的儲存桶。
-
儲存桶和排定的報表建立後,您可以查看已執行報表的歷史記錄,也可以查看報表發布到選取的 OCI 物件儲存的儲存桶。
作業 3:建立 OCI 通知主題並新增訂閱
-
建立傳送電子郵件通知所需的 OCI 通知主題。請前往通知、主題,然後建立主題。
-
在同一個主題中建立訂閱,然後新增要傳送通知的電子郵件。
現在已設定 OCI Notifications 主題。
作業 4:建立與部署功能代碼
前往函數 / 應用程式並建立函數。此函數將使用 OCI IAM 動態群組和原則存取 OCI 物件儲存的儲存桶,並在發出的事件觸發函數時執行所需的作業 (建立排定的報表檔案的 PAR URL,並與其傳送通知)。
有多種方法可用來開發 OCI 函數,並提供快速入門指南,讓您瞭解如何使用 OCI Cloud Shell、OCI 虛擬機器或本機執行來設定開發環境。本指南其餘部分中的映像檔將顯示 OCI Cloud Shell,但上述任何一種方法均有效。我們使用 Python 編寫必要的邏輯程式碼,但您可以使用其他語言,並視需要變更邏輯。
-
若要撰寫程式碼,請開啟 OCI Cloud Shell 中的
requirement.txt
和func.py
檔案。 -
以下是函數代碼,它會使用 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...")
-
-
使用 OCI Cloud Shell 上的下列命令,更新登錄中的功能並部署最新的程式碼。
fn -v deploy — app reportsauto
-
部署之後,即可呼叫您的函數。您可以嘗試使用函數呼叫命令來測試,並確保函數可視需要運作。
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 事件規則
-
移至「OCI 主控台」,按一下應用程式整合、事件服務、規則以及建立事件規則。輸入規則條件並新增在「任務 4」中建立的函數作為觸發動作。
-
輸入顯示名稱和描述。
-
在規則條件區段中,選取第一個條件作為事件類型、物件儲存、物件 - 建立,以及另一個條件作為屬性、bucketName 、demoBucket 。
-
透過動作區段以函數連接事件。選取函數區間、函數應用程式,以及部署在「工作 4」中的函數。
-
按一下儲存變更,以儲存事件規則。這會在條件符合 OCI 物件儲存的儲存桶所發出事件時呼叫函數。
相關連結
認可
- 作者 - Lovelesh Saxena (首席軟體工程架構師)、Mike Fung (首席雲端架構師)、Tim Lee (員工雲端工程師)
其他學習資源
瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Set Up Events Based Automated Email Notifications for Cost Analysis Reports Using Oracle Cloud Native Framework
F99122-01
May 2024