Note:

Configurar notificaciones por correo electrónico automatizadas basadas en eventos para informes de análisis de costos mediante Oracle Cloud Native Framework

Introducción

Todas las organizaciones que ejecutan sus cargas de trabajo en la nube están muy interesadas en comprender su gasto en costos en la nube y quieren informarlo de una manera significativa. Para ello, Oracle Cloud Infrastructure (OCI) proporciona una funcionalidad mediante la cual puede crear informes automatizados en función del costo y, a continuación, obtener esos informes en OCI Object Storage.

Para estos informes de costos, los equipos también desean configurar la automatización de manera que el equipo correspondiente reciba la notificación tan pronto como se genere el informe. Con esto, también les gustaría tener el enlace a los informes como parte de la notificación. Puede configurar toda esta automatización mediante Oracle Cloud Native Framework.

Objetivos

Requisitos

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

  1. Conéctese a la consola de OCI, vaya a Grupo dinámico y cree un nuevo grupo dinámico.

    Crear Grupo Dinámico

  2. Introduzca el OCID del compartimento en la regla 1. Sus funciones de OCI deben existir en el mismo compartimento.

    Configurar grupo dinámico

  3. Vaya a las políticas de OCI IAM y cree una política con la siguiente sentencia.

    allow dynamic-group dynamic_group_name to manage ons-family in compartment compartment_name
    
    allow dynamic-group dynamic_group_name to manage object-family in compartment compartment_name
    

    Nota:

    • Utilice una política de IAM más específica según su caso de uso. Consulte el ejemplo siguiente:

      • allow dynamic-group dynamic_group_name to use ons-topics in compartment compartment_name where request.operation = 'PublishMessage'
      • allow dynamic-group dynamic_group_name to manage buckets in compartment compartment_name where all {request.operation = 'CreatePreauthenticatedRequest', target.bucket.name = 'bucket_name'}

Tarea 2: Configuración de un cubo de OCI Object Storage y creación de un informe programado

  1. Crear un cubo con la consola de OCI. Utilizaremos este cubo para enviar nuestros informes. Asegúrese de que el cubo que ha creado es privado, ya que esto garantizará que el contenido esté protegido del acceso público, así como que Emit Object Events esté activado en este cubo, ya que permitirá que los eventos emitan cuando se transfiera un nuevo objeto.

    Crear cubo

  2. Vaya a Gestión de costos, Informes programados y cree un informe programado. Introduzca Nombre, Descripción, Fecha de inicio y Repetición.

    Crear informe programado

    Seleccione el cubo en el que desea publicar los informes. Para seleccionar el cubo en el menú desplegable, debe agregar la política como se muestra en la siguiente imagen para que el servicio de medición tenga acceso al cubo creado.

    Crear informe programado

  3. Después de crear el cubo y el informe programado, puede comprobar el historial de informes ejecutados y también verá que los informes se publican en el cubo de OCI Object Storage seleccionado.

    Informe de historial programado

Tarea 3: Creación de un tema de OCI Notifications y adición de una suscripción

  1. Cree un tema de OCI Notifications que sea necesario para enviar la notificación por correo electrónico. Vaya a Notifications, Tema y cree un tema.

    Crear Tema

  2. Cree una suscripción en el mismo tema y agregue un correo electrónico al que se enviará la notificación.

    Crear suscripción

    Ahora, el tema OCI Notifications está configurado.

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

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 cubo de OCI Object Storage y realizar la operación necesaria (crear URL de PAR para el archivo de informe programado y enviar notificaciones con él) cuando el evento emitido dispare la función.

Hay una amplia gama de enfoques que se pueden utilizar para desarrollar OCI Functions, con guías de inicio rápido que le guiarán a través de la configuración de un entorno de desarrollo mediante OCI Cloud Shell, una máquina virtual de OCI o una ejecución local. Las imágenes del resto de esta guía mostrarán OCI Cloud Shell, pero cualquiera de estos enfoques es válido. Hemos utilizado Python para codificar la lógica necesaria, pero puede utilizar otro lenguaje y cambiar la lógica según sea necesario.

  1. Para escribir el código, abra el archivo requirement.txt y func.py en OCI Cloud Shell.

    Despliegue de función

  2. A continuación se muestra el código de función, utiliza los principales de recursos de OCI para que no tenga que conservar sus credenciales de OCI. Recuerde sustituir las variables de las creaciones, como el nombre del cubo, el OCID del tema, etc.

    • requirements.txt.

      fdk>=0.1.71
      oci>=2.112.0
      
    • func.yaml.

      schema_version: 20180708
      name: reportsauto
      version: 0.0.6
      runtime: python
      build_image: fnproject/python:3.11-dev
      run_image: fnproject/python:3.11
      entrypoint: /python/bin/fdk /function/func.py handler
      memory: 256
      
    • func.py.

      import io
      import json
      import logging
      import oci
      from datetime import datetime
      
      from fdk import response
      
      
      def handler(ctx, data: io.BytesIO = None):
          try:
              body = json.loads(data.getvalue())
              logging.getLogger().info(body.get("eventType"))
              logging.getLogger().info(body.get("data").get("resourceName"))
          except (Exception, ValueError) as ex:
              logging.getLogger().info('error parsing json payload: ' + str(ex))
      
          logging.getLogger().info("Inside Python Hello World function")
          initiateFn(body.get("data").get("resourceName"))
          return response.Response(
              ctx, response_data=json.dumps(
                  {"message": "Function Executed!"}),
              headers={"Content-Type": "application/json"}
          )
      
      def initiateFn(uploaded_file):
          logging.getLogger().info("Reached initiate function...")
      
          signer = oci.auth.signers.get_resource_principals_signer()
          object_storage_client = oci.object_storage.ObjectStorageClient(config={}, signer=signer)
          namespace_name="orasenatdplt01"
          bucket_name="demobucket"
      
          now = datetime.now()
          par_name = "PAR_Request_" + str(now).split('.')[0].replace(" ", "_").replace(":", "_").replace("-", "_")
          create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name=namespace_name,
              bucket_name=bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                  name=par_name,
                  access_type="ObjectRead",
                  time_expires=datetime.strptime(
                      "2037-06-05T04:25:22.344Z",
                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                  object_name=uploaded_file))
      
          callNotificationAPI(create_preauthenticated_request_response.data)
      
      # Function to call Notification API as soon as an object push is detected
      def callNotificationAPI(parData):
          logging.getLogger().info("Trigger notification as object push is detected...")
          topicOcid = "ocid1.onstopic.oc1.iad.amaaaaxxxxxxxxxamn4"
          signer = oci.auth.signers.get_resource_principals_signer()
          ons_client = oci.ons.NotificationDataPlaneClient(config={}, signer=signer)
          publish_message_response = ons_client.publish_message(
              topic_id=topicOcid,
              message_details=oci.ons.models.MessageDetails(
                  body="OCI Notification Service - Cost Report File is created: " + str(parData.full_path),
                  title="OCI Notification Service - Cost Report File is created"),
              message_type="RAW_TEXT")
          logging.getLogger().info("Triggered notification as object push is detected...")
      
  3. 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 reportsauto
    
  4. Una vez desplegada, la función está lista para ser llamada. Puede intentar probar mediante el comando function invoke y asegurarse de que la función funciona según sea necesario.

    DEBUG=1 fn invoke reportsauto your_app_name
    

    Nota:

    • OCI soporta principales de instancia/recurso para evitar proporcionar información relacionada con el usuario al ejecutar la función. Por lo tanto, esta tarea es necesaria para asegurarse de que la función tiene el juego de permisos correcto para llamar a las API, con un fallo que la función no funcionará correctamente.

    • (Opcional ) También puede comprobar el modo Depurar para la resolución de problemas. Por ejemplo: ejecute el siguiente comando desde OCI Cloud Shell para llamar y probar la función si funciona como se esperaba.

      DEBUG=1 fn invoke e2e-function-demo e2e-fn-streaming
      

Tarea 5: Configuración de reglas de OCI Events

  1. Vaya a la consola de OCI, haga clic en Application Integration, Events Service, Rules y Create event rule. Introduzca una condición de regla y agregue una función creada en la tarea 4 como acción de disparador.

  2. Introduzca Nombre mostrado y Descripción.

    Crear Regla de Evento

  3. En la sección Condición de regla, seleccione la primera condición como Tipo de evento, Object Storage, Object - Create y otra condición como Attribute, bucketName, demoBucket.

    Definir Regla de Evento

  4. Conecte el evento con la función mediante la sección Acciones. Seleccione Compartimento de función, Aplicación de función y la función desplegada en la tarea 4.

    Destino de Regla de Evento

  5. Haga clic en Guardar cambios para guardar la regla de evento. Esto llamará a la función cuando la condición coincida para el evento emitido desde el cubo de OCI Object Storage.

Agradecimientos

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.