Nota

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

Prerequisiti

Task 1: impostare i criteri e i gruppi dinamici IAM OCI richiesti

  1. Eseguire il login a OCI Console. Per ulteriori informazioni, vedere Esegui il login a Oracle Cloud.

  2. Andare al gruppo dinamico IAM OCI e creare un nuovo gruppo dinamico con la regola seguente.

    Crea gruppo dinamico

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

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

    Crea report Costo

  2. Fare clic su Report pianificati e creare un nuovo report pianificato con le informazioni sul bucket. Potete programmare questo secondo il vostro requisito.

    Crea report pianificato

    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

  1. Per creare un'applicazione, andare a Servizi per sviluppatori, fare clic su Applicazione e creare un'applicazione nella rete disponibile.

  2. 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 file func.py in OCI Cloud Shell e scrivere il codice.

    Crea funzione in cloud shell e editor di codice

  3. Copiare il codice Python seguente in func.py e il file di testo in requirement.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
      
  4. 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

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

    Crea regola evento

  2. Aggiungere Azione come mostrato nell'immagine seguente con la funzione creata nel task 2.

    Azione

    Ora viene creato il trigger per la funzione.

Task 5: impostare la configurazione di posta elettronica utilizzando OCI Email Delivery o OCI Notifiche

Test

Caricare l'oggetto o qualsiasi file nel bucket e la funzione verrà attivata automaticamente mediante la regola evento.

conferme

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.