Nota
- Questa esercitazione richiede l'accesso a Oracle Cloud. Per iscriverti a un account gratuito, consulta Inizia a utilizzare Oracle Cloud Infrastructure Free Tier.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituisci questi valori con quelli specifici del tuo ambiente cloud.
Imposta Oracle Cloud Infrastructure Functions per l'invio del report sull'uso dei costi tramite e-mail
Introduzione
Il report sull'uso dei costi può essere personalizzato in base ai requisiti ed è possibile creare il report sull'uso dei costi schedulato. In base alla pianificazione, il report verrà estratto e salvato nel bucket di storage degli oggetti Oracle Cloud Infrastructure (OCI) selezionato.
Per inviare questo report tramite posta elettronica, è necessario distribuire OCI Functions. Le funzioni OCI verranno attivate in base alla regola evento creata in OCI. Ogni volta che il file viene memorizzato nel bucket, l'evento di caricamento dell'oggetto attiva la funzione e OCI Functions avrà l'automazione per creare un URL di richiesta preautenticato per l'oggetto. Questo URL verrà inviato tramite e-mail.
L'e-mail può essere ricevuta dal servizio di consegna e-mail OCI o dai servizi di notifiche OCI. Entrambe le configurazioni sono spiegate in questo tutorial.
Obiettivi
- Impostare OCI Functions per ottenere il report sull'uso dei costi pianificati utilizzando la posta elettronica.
Prerequisiti
-
Autorizzazioni di accesso in Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) per creare un gruppo dinamico, il criterio IAM OCI, creare funzioni per avere il report sull'uso dei costi pianificato nel bucket.
-
Accedi a tutti i componenti necessari per visualizzare gli identificativi Oracle Cloud (OCID) e altre informazioni pertinenti.
-
Accedi a OCI Cloud Shell per creare, distribuire e richiamare le funzioni.
-
Le risorse di rete per OCI Functions devono essere disponibili. Configurazione di VCN e subnet.
Task 1: impostare i criteri e i gruppi dinamici IAM OCI richiesti
-
Eseguire il login a OCI Console. Per ulteriori informazioni, vedere Esegui il login a Oracle Cloud.
-
Andare al gruppo dinamico IAM OCI e creare un nuovo gruppo dinamico con la regola seguente.
-
Andare ai criteri IAM OCI e creare un criterio IAM OCI con le istruzioni riportate di seguito.
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'}}
Per inviare messaggi di posta elettronica utilizzando il servizio OCI Notifications, è necessario aggiungere la seguente istruzione nel criterio IAM OCI per accedere all'argomento OCI Notifications.
allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
Task 2: Crea report Uso costi schedulati
-
Andare a Billing and Cost Management e selezionare Cost Management. Creare un report personalizzato sull'utilizzo dei costi in Analisi costi, quindi fare clic su Applica per salvare il report.
-
Fare clic su Report pianificati e creare un nuovo report pianificato con le informazioni sul bucket. Potete programmare questo secondo il vostro requisito.
In base alla pianificazione, il report verrà salvato automaticamente nel bucket di storage degli oggetti OCI specificato.
Task 3: Creare e distribuire il codice funzione
-
Per creare un'applicazione, andare a Servizi per sviluppatori, fare clic su Applicazione e creare un'applicazione nella rete disponibile.
-
Andare a funzioni/applicazioni e creare una funzione. Questa funzione utilizzerà il gruppo dinamico e il criterio IAM OCI per accedere all'evento. Per creare la funzione, attenersi alla procedura visualizzata. Abbiamo utilizzato Python per codificare la logica richiesta, ma è possibile utilizzare il proprio linguaggio e modificare la logica in base alle esigenze. Per scrivere il codice, aprire il file
requirement.txt
della funzione e il filefunc.py
in OCI Cloud Shell e scrivere il codice. -
Copiare il codice Python seguente in
func.py
e il file di testo inrequirement.txt
.-
func.py
:-
Uso di OCI Email Delivery:
Nota: aggiungere i dettagli relativi all'ID e-mail e al protocollo SMTP (Simple Mail Transfer Protocol).
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!')
-
Uso delle notifiche OCI:
Nota: aggiornare l'OCID dell'argomento (i passi per creare la notifica sono descritti nel task 5).
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
-
-
Aggiornare la funzione nel registro e distribuire il codice più recente utilizzando il comando seguente in OCI Cloud Shell.
fn -v deploy — app App_name
Una volta distribuita, la funzione è pronta per essere richiamata. Per attivare la funzione, è necessario creare la regola evento.
Task 4: Impostazione della regola evento
-
Crea una regola evento in OCI. In Osservabilità e gestione, fare clic su Servizi eventi, Regole e Crea regola. Immettere la regola di corrispondenza come mostrato nell'immagine seguente con attributo come ID bucket.
Nota: il bucket di storage degli oggetti OCI creato deve essere abilitato con gli eventi oggetto elemento.
-
Aggiungere Azione come mostrato nell'immagine seguente con la funzione creata nel task 2.
Ora viene creato il trigger per la funzione.
Task 5: impostare la configurazione di posta elettronica utilizzando OCI Email Delivery o OCI Notifiche
-
Utilizzo di OCI Email Delivery (questo richiede un dominio DNS pubblico):
-
Creare un dominio di posta elettronica in OCI. Andare a Servizi per sviluppatori e selezionare Consegna e-mail. Crea il dominio di posta elettronica in base al DNS pubblico disponibile. Il nome del dominio di posta elettronica deve essere uguale al nome del DNS pubblico.
-
Configurare la posta identificata dalle chiavi di dominio (DKIM) e i mittenti approvati nel dominio di posta elettronica aggiungendo record nei record DNS pubblici. Per ulteriori informazioni sull'impostazione del dominio e della configurazione di posta elettronica, vedere Istruzioni dettagliate per l'invio di messaggi di posta elettronica con OCI Email Delivery.
-
Creare le credenziali SMTP per l'utente. Generare la credenziale SMTP e salvarla per uso futuro. Nel file
func.py
devono essere forniti lo stesso ID e-mail approvato e le stesse credenziali SMTP.
-
-
Uso di OCI Notifications Service:
-
Per creare un argomento, andare a Servizi per sviluppatori. In Integrazione applicazioni, fare clic su Notifiche.
-
Nella pagina Argomenti, fare clic su Crea argomento e immettere le informazioni necessarie.
-
Dopo aver creato l'argomento, creare la sottoscrizione. Immettere Protocollo come
Email
e l'ID e-mail richiesto. -
Verrà inviata un'e-mail all'endpoint per confermare la sottoscrizione.
-
Test
Caricare l'oggetto o qualsiasi file nel bucket e la funzione verrà attivata automaticamente mediante la regola evento.
Collegamenti correlati
conferme
- Autore - Samratha S P (Senior Cloud Engineer)
Altre risorse di apprendimento
Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.
Per la documentazione del prodotto, visita l'Oracle Help Center.
Set Up Oracle Cloud Infrastructure Functions to Send Cost Usage Report using Email
F96403-03
December 2024