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.
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
- Richten Sie OCI Functions ein, um den Bericht zur geplanten Kostennutzung per E-Mail abzurufen.
Voraussetzungen
-
Greifen Sie auf Berechtigungen in Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) zu, um eine dynamische Gruppe und eine OCI-IAM-Policy zu erstellen und Funktionen zu erstellen, die den geplanten Kostenverwendungsbericht im Bucket enthalten.
-
Zugriff auf alle erforderlichen Komponenten, um ihre Oracle Cloud-IDs (OCIDs) und andere relevante Informationen anzuzeigen.
-
Zugriff auf OCI Cloud Shell, damit Sie die Funktionen erstellen, bereitstellen und aufrufen können.
-
Netzwerkressourcen für OCI Functions müssen verfügbar sein. VCN- und Subnetzkonfiguration.
Aufgabe 1: Erforderliche OCI-IAM-Policys und dynamische Gruppen einrichten
-
Melden Sie sich bei der OCI-Konsole an. Weitere Informationen finden Sie unter Bei Oracle Cloud anmelden.
-
Gehen Sie zu der dynamischen Gruppe von OCI IAM, und erstellen Sie eine neue dynamische Gruppe mit der folgenden Regel.
-
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
-
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.
-
Klicken Sie auf Geplante Berichte, und erstellen Sie einen neuen geplanten Bericht mit Ihren Bucket-Informationen. Sie können dies entsprechend Ihrer Anforderung planen.
Entsprechend dem Zeitplan wird der Bericht automatisch im angegebenen OCI Object Storage-Bucket gespeichert.
Aufgabe 3: Funktionscode erstellen und bereitstellen
-
Um eine Anwendung zu erstellen, gehen Sie zu Entwicklerservices, klicken Sie auf Anwendung, und erstellen Sie eine Anwendung im verfügbaren Netzwerk.
-
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 Dateifunc.py
in OCI Cloud Shell, und schreiben Sie den Code. -
Kopieren Sie den folgenden Python-Code in
func.py
und die Textdatei in der Dateirequirement.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
-
-
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
-
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.
-
Fügen Sie die Aktion hinzu, wie in der folgenden Abbildung mit der Funktion dargestellt, die in Aufgabe 2 erstellt wird.
Jetzt wird der Trigger für die Funktion erstellt.
Aufgabe 5: E-Mail-Konfiguration mit OCI Email Delivery oder OCI Notifications einrichten
-
OCI Email Delivery verwenden (dies erfordert eine öffentliche DNS-Domain):
-
Erstellen Sie eine E-Mail-Domain in OCI. Gehen Sie zu Entwicklerservices, und wählen Sie Email Delivery aus. Erstellen Sie die E-Mail-Domain gemäß verfügbarem öffentlichem DNS. Der Name der E-Mail-Domain muss mit dem öffentlichen DNS-Namen identisch sein.
-
Konfigurieren Sie die Domainschlüssel für identifizierte E-Mails (DKIM) und genehmigte Absender in der E-Mail-Domain, indem Sie Datensätze in Ihren öffentlichen DNS-Datensätzen hinzufügen. Weitere Informationen zum Einrichten von E-Mail-Domain und -Konfiguration finden Sie unter Schritt-für-Schritt-Anweisungen zum Senden von E-Mails mit OCI Email Delivery.
-
Erstellen Sie die SMTP-Zugangsdaten für Ihren Benutzer. Generieren Sie die SMTP-Zugangsdaten, und speichern Sie sie für die zukünftige Verwendung. In der Datei
func.py
müssen dieselbe genehmigte E-Mail-ID und dieselben SMTP-Zugangsdaten angegeben werden.
-
-
OCI Notifications Service verwenden:
-
Um ein Thema zu erstellen, gehen Sie zu Entwicklerservices. Klicken Sie unter Anwendungsintegration auf Benachrichtigungen.
-
Klicken Sie auf der Seite Themen auf Thema erstellen, und geben Sie die erforderlichen Informationen ein.
-
Nachdem das Thema erstellt wurde, erstellen Sie ein Abonnement. Geben Sie Protokoll als
Email
und die erforderliche E-Mail-ID ein. -
Die E-Mail wird an den Endpunkt gesendet, um das Abonnement zu bestätigen.
-
Testen
Laden Sie das Objekt oder eine beliebige Datei in den Bucket hoch, und die Funktion wird automatisch mit einer Ereignisregel ausgelöst.
Verwandte Links
Danksagungen
- Autor - Samratha S P (Senior 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. 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.
Set Up Oracle Cloud Infrastructure Functions to Send Cost Usage Report using Email
F96400-03
December 2024