Note:

Configuración de Oracle Cloud Infrastructure Functions para enviar el informe de uso de costos mediante correo electrónico

Introducción

El informe de uso de costos se puede personalizar según los requisitos y podemos crear el informe de uso de costos programado. Según el programa, el informe se extraerá y guardará en el cubo de Oracle Cloud Infrastructure (OCI) Object Storage seleccionado.

Para enviar este informe por correo electrónico, necesitamos desplegar OCI Functions. OCI Functions se disparará en función de la regla de evento creada en OCI. Cuando el archivo se almacena en el cubo, el evento de carga de objeto dispara la función y OCI Functions tendrá la automatización para crear una URL de solicitud autenticada previamente para el objeto. Esta URL se enviará por correo electrónico.

El servicio de Email Delivery de OCI o los servicios de notificaciones de OCI pueden recibir correo electrónico. Ambas configuraciones se explican en este tutorial.

Objetivos

Requisitos

Tarea 1: Configuración de políticas y grupos dinámicos de OCI IAM necesarios

  1. Conéctese a la consola de OCI. Para obtener más información, consulte Conexión a Oracle Cloud.

  2. Vaya al grupo dinámico de IAM de OCI y cree un nuevo grupo dinámico con la siguiente regla.

    Crear Grupo Dinámico

  3. Vaya a las políticas de OCI IAM y cree una política de OCI IAM con las siguientes sentencias.

    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'}}
    

    Para enviar correo electrónico mediante el servicio OCI Notifications, se debe agregar la siguiente sentencia en la política de OCI IAM para acceder al tema OCI Notifications.

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

Tarea 2: Crear informe de uso de costos programados

  1. Vaya a Gestión de facturación y costos y seleccione Gestión de costos. Cree su propio informe de uso de costos personalizado en Análisis de costos y haga clic en Aplicar para guardar el informe.

    Crear informe de costo

  2. Haga clic en Informes programados y cree un nuevo informe programado con la información del bloque. Puede programar esto según sus requisitos.

    Crear informe programado

    Según el programa, el informe se guardará automáticamente en un cubo de OCI Object Storage determinado.

Tarea 3: Creación y despliegue del código de función

  1. Para crear una aplicación, vaya a Servicios para desarrolladores, haga clic en Aplicación y cree una aplicación en la red disponible.

  2. Vaya a functions/applications y cree una función. Esta función utilizará el grupo dinámico y la política de OCI IAM para acceder al evento. Siga los pasos de la pantalla para crear la función. Hemos utilizado Python para codificar la lógica necesaria, pero puede utilizar su propio lenguaje y cambiar la lógica según sea necesario. Para escribir el código, abra el archivo de función requirement.txt y el archivo func.py en OCI Cloud Shell y escriba el código.

    Crear función en Cloud Shell y editor de código

  3. Copie el siguiente código Python en func.py y el archivo de texto en el archivo requirement.txt.

    • func.py:

      • Uso de OCI Email Delivery:

        Nota: Agregue los detalles correspondientes del ID de correo electrónico y del protocolo simple de transferencia de correo (SMTP).

        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 de OCI Notifications:

        Nota: Actualice el OCID del tema (los pasos para crear la notificación se explican en la tarea 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. Actualice la función del registro y despliegue el código más reciente mediante el siguiente comando en OCI Cloud Shell.

    fn -v deploy — app App_name
    

Una vez desplegada, la función está lista para ser llamada. Para activar la función, se debe crear una regla de evento.

Tarea 4: Configuración de la regla de evento

  1. Crear una regla de evento en OCI. En Observación y gestión, haga clic en Servicios de eventos, Reglas y Crear regla. Introduzca la regla de coincidencia como se muestra en la siguiente imagen con el atributo como ID de cubo.

    Nota: El cubo de OCI Object Storage creado debe estar activado con eventos de objeto de salida.

    Crear Regla de Evento

  2. Agregue Acción como se muestra en la siguiente imagen con la función creada en la tarea 2.

    Acción

    Ahora, se crea el disparador para la función.

Tarea 5: Configuración de correo electrónico mediante OCI Email Delivery o OCI Notifications

Prueba

Cargue el objeto o cualquier archivo en el cubo y la función se disparará automáticamente mediante la regla de evento.

Confirmaciones

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en Oracle Learning Explorer.

Para obtener documentación sobre el producto, visite Oracle Help Center.