Hinweis:

Oracle Cloud Infrastructure Functions so einrichten, dass der Kostenverwendungsbericht per E-Mail gesendet wird

Einführung

Der Kostenverwendungsbericht kann je nach Anforderung angepasst werden, und wir können den geplanten Kostenverwendungsbericht erstellen. Gemäß dem Zeitplan wird der Bericht abgerufen und im ausgewählten Oracle Cloud Infrastructure-(OCI-)Objektspeicher-Bucket gespeichert.

Um diesen Bericht per E-Mail zu senden, müssen wir OCI Functions bereitstellen. OCI Functions wird basierend auf der in OCI erstellten Ereignisregel ausgelöst. Wenn die Datei im Bucket gespeichert wird, löst das Objektuploadereignis die Funktion aus, und OCI Functions verfügt über die Automatisierung, um eine vorab authentifizierte Anforderungs-URL für das Objekt zu erstellen. Diese URL wird per E-Mail gesendet.

E-Mails können entweder vom OCI Email Delivery-Service oder von OCI Notifications-Services empfangen werden. Beide Konfigurationen werden in diesem Tutorial erläutert.

Ziele

Voraussetzungen

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

  1. Melden Sie sich bei der OCI-Konsole an. Weitere Informationen finden Sie unter Bei Oracle Cloud anmelden.

  2. Gehen Sie zu der dynamischen Gruppe von OCI IAM, und erstellen Sie eine neue dynamische Gruppe mit der folgenden Regel.

    Dynamische Gruppe erstellen

  3. Gehen Sie zu OCI-IAM-Policys, und erstellen Sie eine OCI-IAM-Policy mit den folgenden Anweisungen.

    allow dynamic-group dynamicgroup_name to manage buckets in compartment CompartmentName where all {target.bucket.name='bucket_name'}
    
    allow dynamic-group dynamicgroup_name to manage objects in compartment CompartmentName where all {target.bucket.name='bucket_name'}
    
    Allow service metering_overlay to manage objects in compartment CompartmentName where all {target.bucket.name='bucket_name', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_DELETE', request.permission='OBJECT_READ'}}
    

    Um E-Mails mit dem OCI Notifications-Service zu senden, muss die folgende Anweisung der OCI-IAM-Policy hinzugefügt werden, um auf das OCI-Benachrichtigungsthema zuzugreifen.

    allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
    

Aufgabe 2: Auswertung "Geplante Kosten - Verwendung" erstellen

  1. Gehen Sie zu Abrechnung und Kostenmanagement, und wählen Sie Kostenmanagement aus. Erstellen Sie Ihren eigenen benutzerdefinierten Kostenverwendungsbericht unter Kostenanalyse, und klicken Sie auf Anwenden, um den Bericht zu speichern.

    Kostenbericht erstellen

  2. Klicken Sie auf Geplante Berichte, und erstellen Sie einen neuen geplanten Bericht mit Ihren Bucket-Informationen. Sie können dies entsprechend Ihrer Anforderung planen.

    Geplanten Bericht erstellen

    Entsprechend dem Zeitplan wird der Bericht automatisch im angegebenen OCI Object Storage-Bucket gespeichert.

Aufgabe 3: Funktionscode erstellen und bereitstellen

  1. Um eine Anwendung zu erstellen, gehen Sie zu Entwicklerservices, klicken Sie auf Anwendung, und erstellen Sie eine Anwendung im verfügbaren Netzwerk.

  2. Gehen Sie zu Funktionen/Anwendungen, und erstellen Sie eine Funktion. Diese Funktion verwendet die dynamische OCI-IAM-Gruppe und -Policy für den Zugriff auf das Ereignis. Führen Sie die Schritte auf dem Bildschirm aus, um die Funktion zu erstellen. Wir haben Python verwendet, um die erforderliche Logik zu codieren, aber Sie können Ihre eigene Sprache verwenden und die Logik nach Bedarf ändern. Um den Code zu schreiben, öffnen Sie die Datei requirement.txt der Funktion und die Datei func.py in OCI Cloud Shell, und schreiben Sie den Code.

    Funktion in cloud shell und Codeeditor erstellen

  3. Kopieren Sie den folgenden Python-Code in func.py und die Textdatei in der Datei requirement.txt.

    • func.py:

      • OCI Email Delivery verwenden:

        Hinweis: Fügen Sie die entsprechende E-Mail-ID und SMTP-Details (Simple Mail Transfer Protocol) hinzu.

        import oci
        import json
        import io
        import logging
        import smtplib
        from os.path import basename
        from email.mime.application import MIMEApplication
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        from email.utils import COMMASPACE, formatdate
        from datetime import datetime
        import ssl
        import email.utils
        from email.message import EmailMessage
        
        def handler(ctx, data: io.BytesIO = None):
           funDataStr = data.read().decode('utf-8')
        
        #Convert the log data to json
           funData =  json.loads(funDataStr)
        
        #Set up OCI configuration using resource principal
           signer = oci.auth.signers.get_resource_principals_signer()
        #Create Object Storage client
           object_storage_client = oci.object_storage.ObjectStorageClient({},signer=signer)
        
        # Extract object details from the event
           object_name = funData['data']['resourceName']
           namespace = funData['data']['additionalDetails']['namespace']
           bucket_name = funData['data']['additionalDetails']['bucketName']
        # Download the object
        #get_object_response = object_storage_client.get_object(namespace, bucket_name, object_name)
        #object_content = str(get_object_response.data.text)
           create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name = namespace,
              bucket_name = bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                 name = "prestorage",
                 access_type = "ObjectRead",
                 time_expires = datetime.strptime(
                    "2024-06-05T04:25:22.344Z",
                    "%Y-%m-%dT%H:%M:%S.%fZ"),
                 object_name = object_name))
           #logging.getLogger().info(create_preauthenticated_request_response.data)
           logging.getLogger().info("created pre authenticated url")
           string = str(create_preauthenticated_request_response.data)
           #response = create_preauthenticated_request_response.data().decode('utf-8')
           url = json.loads(string)
           logging.getLogger().info(url)
           temporary_url = f"{url['full_path']}"
           logging.getLogger().info(temporary_url)
        
        #Set your email credentials
           sender_email = "test@domain"
           sender_name = "Tester"
        
        #Set the recipient email address
           recipient_email = "xyz@oracle.com"
           USERNAME_SMTP = "SMTPOCID"
           password_smtp = "************"
           HOST = "smtp_email"
           PORT = 587
        
        #Create the email content
           subject = "Cost Usage Report"
           body = temporary_url
           message = EmailMessage()
           message['From'] = email.utils.formataddr((sender_name, sender_email))
           message['To'] = recipient_email
           message['Subject'] = subject
           message.set_content(body)
           try:
              server = smtplib.SMTP(HOST, PORT)
              server.ehlo()
              server.starttls(context=ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=None, capath=None))
              server.ehlo()
              server.login(USERNAME_SMTP, password_smtp)
              logging.getLogger().info("SMTP server logged in")
              server.sendmail(sender_email, recipient_email, message.as_string())
              #server.send_message(message)
              server.close()
           except Exception as e:
              logging.getLogger().info(f"Error: {e}")
           else:
              logging.getLogger().info('Email sent successfully!')
        
      • OCI-Benachrichtigungen verwenden:

        Hinweis: Aktualisieren Sie die Themen-OCID (Schritte zum Erstellen von Benachrichtigungen werden in Aufgabe 5 erläutert).

        import oci
        import json
        import io
        import logging
        import smtplib
        from os.path import basename
        from email.mime.application import MIMEApplication
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        from email.utils import COMMASPACE, formatdate
        from datetime import datetime
        import ssl
        import email.utils
        from email.message import EmailMessage
        
        def handler(ctx, data: io.BytesIO = None):
           funDataStr = data.read().decode('utf-8')
        
        # Convert the log data to json
           funData =  json.loads(funDataStr)
        
        # Set up OCI configuration using resource principal
           signer = oci.auth.signers.get_resource_principals_signer()
        # Create Object Storage client
           object_storage_client = oci.object_storage.ObjectStorageClient({},signer=signer)
           ons_client = oci.ons.NotificationDataPlaneClient({},signer=signer)
        # Extract object details from the event
        
        
           object_name = funData['data']['resourceName']
           namespace = funData['data']['additionalDetails']['namespace']
           bucket_name = funData['data']['additionalDetails']['bucketName']
        
        # Download the object
           create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name = namespace,
              bucket_name = bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                 name = "prestorage",
                 access_type = "ObjectRead",
                 time_expires = datetime.strptime(
                    "2024-06-05T04:25:22.344Z",
                    "%Y-%m-%dT%H:%M:%S.%fZ"),
                 object_name = object_name))
        #logging.getLogger().info(create_preauthenticated_request_response.data)
           logging.getLogger().info("created pre authenticated url")
           string = str(create_preauthenticated_request_response.data)
        #response = create_preauthenticated_request_response.data().decode('utf-8')
           url = json.loads(string)
        
           logging.getLogger().info(url)
           temporary_url = f"{url['full_path']}"
           logging.getLogger().info(temporary_url)
        #to send mail using notification
           publish_message_response = ons_client.publish_message(
              topic_id="ocid1.onstopic.oc1.iad.************",
              message_details=oci.ons.models.MessageDetails(
                 body=temporary_url,
                 title="Cost-usage report"),
           message_type="RAW_TEXT")
           logging.getLogger().info(publish_message_response)
           logging.getLogger().info('Email sent successfully!')
        
    • requirement.txt:

      fdk>=0.1.68
      oci
      
  4. 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 App_name
    

Nach dem Deployment kann Ihre Funktion aufgerufen werden. Um die Funktion auszulösen, muss eine Ereignisregel erstellt werden.

Aufgabe 4: Ereignisregel einrichten

  1. Erstellen Sie eine Ereignisregel in OCI. Klicken Sie unter Observability and Management auf Ereignisservices, Regeln und Regel erstellen. Geben Sie die Vergleichsregel wie in der folgenden Abbildung mit dem Attribut als Bucket-ID ein.

    Hinweis: Der erstellte OCI Object Storage-Bucket muss mit Belegereignissen aktiviert sein.

    Ereignisregel erstellen

  2. Fügen Sie die Aktion hinzu, wie in der folgenden Abbildung mit der Funktion dargestellt, die in Aufgabe 2 erstellt wird.

    Aktion

    Jetzt wird der Trigger für die Funktion erstellt.

Aufgabe 5: E-Mail-Konfiguration mit OCI Email Delivery oder OCI Notifications einrichten

Testen

Laden Sie das Objekt oder eine beliebige Datei in den Bucket hoch, und die Funktion wird automatisch mit einer Ereignisregel ausgelöst.

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. Außerdem können Sie education.oracle.com/learning-explorer besuchen, um Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.