Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Registrieren eines kostenlosen Accounts finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Wenn Sie Ihre Übung abgeschlossen haben, ersetzen Sie diese Werte durch spezifische Werte für Ihre Cloud-Umgebung.
Ereignisbasierte automatische E-Mail-Benachrichtigungen für Kostenanalyseberichte mit Oracle Cloud Native Framework einrichten
Einführung
Jedes Unternehmen, das seine Workloads in der Cloud ausführt, ist sehr daran interessiert, seine Kostenaufwendungen für die Cloud zu verstehen und möchte sie auf sinnvolle Weise melden. Dazu bietet Oracle Cloud Infrastructure (OCI) eine Funktionalität, mit der Sie automatisierte Berichte basierend auf Kosten erstellen und diese dann in OCI Object Storage abrufen können.
Für diese Kostenberichte möchten Teams auch die Automatisierung so einrichten, dass das entsprechende Team die Benachrichtigung erhält, sobald der Bericht generiert wird. Damit möchten sie auch den Link zu den Berichten als Teil der Benachrichtigung haben. Sie können diese Automatisierung mit Oracle Cloud Native Framework einrichten.
Ziele
-
Richten Sie die Berichtsgenerierung für OCI-Kosten ein, und generieren Sie Ereignisse basierend auf der Berichtsgenerierung.
-
Konfigurieren Sie die gesamte Automatisierung mit cloudnativen verwalteten Services auf OCI.
Voraussetzungen
-
Erforderliche Berechtigungen in Oracle Cloud Infrastructure Identity and Access Management (OCI IAM), um dynamische Gruppen, Policys, Buckets, Funktionen, Ereignisse und Benachrichtigungsservice einzurichten.
-
Zugriff auf alle erforderlichen Komponenten, um ihre Oracle Cloud-IDs (OCIDs) und andere Informationen anzuzeigen.
-
Zugriff auf OCI Cloud Shell zum Erstellen, Bereitstellen und Aufrufen von Funktionen.
Aufgabe 1: Erforderliche OCI-IAM-Policys und dynamische Gruppen einrichten
-
Melden Sie sich in der OCI-Konsole an, gehen Sie zu Dynamische Gruppe, und erstellen Sie eine neue dynamische Gruppe.
-
Geben Sie die Compartment-OCID in Regel 1 ein. Ihre OCI-Funktionen müssen im selben Compartment vorhanden sein.
-
Gehen Sie zu OCI-IAM-Policys, und erstellen Sie eine Policy mit der folgenden Anweisung.
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
Hinweis:
-
Verwenden Sie eine spezifischere IAM-Policy entsprechend Ihrem Anwendungsfall. Siehe das Beispiel wie folgt:
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'}
-
Aufgabe 2: OCI Object Storage-Bucket einrichten und geplanten Bericht erstellen
-
Erstellen Sie einen Bucket mit der OCI-Konsole. Wir verwenden diesen Bucket, um unsere Berichte zu pushen. Stellen Sie sicher, dass der von Ihnen erstellte Bucket privat ist, da dadurch sichergestellt wird, dass Ihr Inhalt vor öffentlichem Zugriff geschützt ist und die Objektereignisse ausgeben für diesen Bucket aktiviert ist. Dadurch können Ereignisse ausgegeben werden, wenn ein neues Objekt übertragen wird.
-
Gehen Sie zu Kostenmanagement, Geplante Berichte, und erstellen Sie einen geplanten Bericht. Geben Sie Name, Beschreibung, Startdatum und Wiederholung ein.
Wählen Sie den Bucket aus, in dem Sie Ihre Berichte veröffentlichen möchten. Um den Bucket aus dem Dropdown-Menü auszuwählen, müssen Sie die Policy wie in der folgenden Abbildung dargestellt hinzufügen, damit der Meterservice Zugriff auf den erstellten Bucket hat.
-
Nachdem der Bucket und der geplante Bericht erstellt wurden, können Sie die Historie der ausgeführten Berichte prüfen. Außerdem werden die Berichte im ausgewählten OCI Object Storage-Bucket veröffentlicht.
Aufgabe 3: OCI-Benachrichtigungsthema erstellen und Abonnement hinzufügen
-
Erstellen Sie ein OCI-Benachrichtigungsthema, das zum Senden der E-Mail-Benachrichtigung erforderlich ist. Gehen Sie zu Notifications, Thema, und erstellen Sie ein Thema.
-
Erstellen Sie ein Abonnement in demselben Thema, und fügen Sie eine E-Mail hinzu, an die die Benachrichtigung gesendet wird.
Jetzt ist das OCI Notifications-Thema konfiguriert.
Aufgabe 4: Funktionscode erstellen und bereitstellen
Gehen Sie zu Funktionen/Anwendungen, und erstellen Sie eine Funktion. Diese Funktion verwendet die dynamische OCI-IAM-Gruppe und -Policy, um auf den OCI Object Storage-Bucket zuzugreifen und den erforderlichen Vorgang auszuführen (PAR-URL für die geplante Berichtsdatei erstellen und Benachrichtigungen damit senden), wenn die Funktion durch das ausgegebene Ereignis ausgelöst wird.
Es gibt eine Vielzahl von Ansätzen, die zur Entwicklung von OCI Functions verwendet werden können, mit Schnellstartanleitungen, die Sie durch die Einrichtung einer Entwicklungsumgebung mit OCI Cloud Shell, einer virtuellen OCI-Maschine oder lokal ausführen. Die Bilder im Rest dieser Dokumentation zeigen OCI Cloud Shell, aber alle diese Ansätze sind gültig. Wir haben Python verwendet, um die erforderliche Logik zu codieren, aber Sie können eine andere Sprache verwenden und die Logik nach Bedarf ändern.
-
Um den Code zu schreiben, öffnen Sie die Datei
requirement.txt
undfunc.py
in der OCI Cloud Shell. -
Der folgende Funktionscode verwendet die OCI-Ressourcen-Principals, sodass Sie Ihre OCI-Zugangsdaten nicht beibehalten müssen. Denken Sie daran, die Variablen für Ihre Kreationen zu ersetzen, wie Bucket-Name, Topic-OCID usw.
-
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...")
-
-
Aktualisieren Sie die Funktion in der Registry, und stellen Sie den neuesten Code mit dem folgenden Befehl in der OCI Cloud Shell bereit.
fn -v deploy — app reportsauto
-
Nach dem Deployment kann Ihre Funktion aufgerufen werden. Sie können versuchen, den Funktionsaufrufbefehl zu testen und sicherzustellen, dass die Funktion nach Bedarf funktioniert.
DEBUG=1 fn invoke reportsauto your_app_name
Hinweis:
-
OCI unterstützt Resource/Instance Principals, um zu vermeiden, dass beim Ausführen der Funktion benutzerbezogene Informationen angegeben werden. Daher ist diese Aufgabe erforderlich, um sicherzustellen, dass die Funktion über die richtige Berechtigung zum Aufrufen der APIs verfügt. Andernfalls funktioniert die Funktion nicht ordnungsgemäß.
-
(Optional ) Sie können auch den Debug-Modus zur Fehlerbehebung prüfen. Beispiel: Führen Sie den folgenden Befehl aus OCI Cloud Shell aus, um die Funktion aufzurufen und zu testen, wenn sie wie erwartet funktioniert.
DEBUG=1 fn invoke e2e-function-demo e2e-fn-streaming
-
Aufgabe 5: OCI-Ereignisregeln einrichten
-
Gehen Sie zur OCI-Konsole, und klicken Sie auf Anwendungsintegration, Events-Service, Regeln und Ereignisregel erstellen. Geben Sie eine Regelbedingung ein, und fügen Sie eine Funktion hinzu, die in Aufgabe 4 als Triggeraktion erstellt wurde.
-
Geben Sie Anzeigename und Beschreibung ein.
-
Wählen Sie im Abschnitt Regelbedingung als erste Bedingung Ereignistyp, Object Storage, Objekt - Erstellen und als weitere Bedingung Attribut, bucketName, demoBucket aus.
-
Verbinden Sie das Ereignis über den Abschnitt Aktionen mit der Funktion. Wählen Sie Funktions-Compartment, Funktionsanwendung und die in Aufgabe 4 bereitgestellte Funktion aus.
-
Klicken Sie auf Änderungen speichern, um die Ereignisregel zu speichern. Dadurch wird die Funktion aufgerufen, wenn die Bedingung mit dem ausgegebenen Ereignis aus dem OCI Object Storage-Bucket übereinstimmt.
Verwandte Links
Danksagungen
- Autoren - Lovelesh Saxena (Principal Software Engineering Architect), Mike Fung (Master Principal Cloud Architect), Tim Lee (Staff Cloud Engineer)
Weitere Lernressourcen
Lernen Sie andere Übungen auf docs.oracle.com/learn kennen, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube Channel zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Produktdokumentation finden Sie im Oracle Help Center.
Set Up Events Based Automated Email Notifications for Cost Analysis Reports Using Oracle Cloud Native Framework
F99113-01
May 2024