Hinweis:

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

Voraussetzungen

Aufgabe 1: Erforderliche OCI-IAM-Policys und dynamische Gruppen einrichten

  1. Melden Sie sich in der OCI-Konsole an, gehen Sie zu Dynamische Gruppe, und erstellen Sie eine neue dynamische Gruppe.

    Dynamische Gruppe erstellen

  2. Geben Sie die Compartment-OCID in Regel 1 ein. Ihre OCI-Funktionen müssen im selben Compartment vorhanden sein.

    Dynamische Gruppen einrichten

  3. 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

  1. 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.

    Bucket erstellen

  2. Gehen Sie zu Kostenmanagement, Geplante Berichte, und erstellen Sie einen geplanten Bericht. Geben Sie Name, Beschreibung, Startdatum und Wiederholung ein.

    Terminierten Bericht erstellen

    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.

    Terminierten Bericht erstellen

  3. 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.

    Historie geplanter Bericht

Aufgabe 3: OCI-Benachrichtigungsthema erstellen und Abonnement hinzufügen

  1. Erstellen Sie ein OCI-Benachrichtigungsthema, das zum Senden der E-Mail-Benachrichtigung erforderlich ist. Gehen Sie zu Notifications, Thema, und erstellen Sie ein Thema.

    Thema erstellen

  2. Erstellen Sie ein Abonnement in demselben Thema, und fügen Sie eine E-Mail hinzu, an die die Benachrichtigung gesendet wird.

    Abonnement erstellen

    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.

  1. Um den Code zu schreiben, öffnen Sie die Datei requirement.txt und func.py in der OCI Cloud Shell.

    Funktion bereitstellen

  2. 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...")
      
  3. 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
    
  4. 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

  1. 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.

  2. Geben Sie Anzeigename und Beschreibung ein.

    Ereignisregel erstellen

  3. Wählen Sie im Abschnitt Regelbedingung als erste Bedingung Ereignistyp, Object Storage, Objekt - Erstellen und als weitere Bedingung Attribut, bucketName, demoBucket aus.

    Ereignisregel definieren

  4. 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.

    Ereignisregelziel

  5. 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.

Danksagungen

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.