Note:

Configuración de notificaciones por correo electrónico para Oracle Cloud Infrastructure Events en OCI Monitoring

Introducción

Los servicios de Oracle Cloud Infrastructure (OCI) emiten eventos, que son mensajes estructurados que indican cambios en los recursos. Es necesario crear reglas para trabajar con eventos y también especificar una acción para disparar cuando encuentra un evento coincidente.

Las acciones de notificación por correo electrónico son una respuesta definida para las coincidencias de eventos. El servicio de entrega de correo electrónico de OCI proporciona una solución gestionada rápida y fiable para enviar notificaciones de correo electrónico transaccionales, de alto volumen y seguras.

Objetivos

Requisitos

El administrador de Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) debe crear:

Para obtener más información sobre la región de entrega de correo electrónico suscrita y preferida, consulte Configuring SMTP Connection Endpoint.

Tarea 1: Configurar el remitente aprobado en la entrega de correo electrónico

Se debe configurar un remitente aprobado para todas las direcciones "De:" que envían correo a través de OCI. Se asocia con un compartimento y existe solo en la región donde se configuró el remitente aprobado.

Puede utilizar el nombre de dominio o la notificación de oracle por defecto para el remitente aprobado, como se menciona a continuación.

  1. Abra el menú de navegación de la consola de OCI y haga clic en Servicios para desarrolladores.

  2. En Integración de aplicación, haga clic en Email Delivery.

  3. En Email Delivery, haga clic en Enviadores aprobados.

  4. Haga clic en Crear remitente aprobado e introduzca la dirección de correo electrónico que desea mostrar como remitente aprobado.

    Nota: Si el punto final de conexión SMTP de entrega de correo electrónico de OCI es smtp.email.ap-mumbai-1.oci.oraclecloud.com, agregue noreply@notification a la región e introduzca la dirección de correo electrónico del remitente aprobado. Por ejemplo, noreply@notification.ap-mumbai-1.oci.oraclecloud.com.

  5. Haga clic en Agregar para agregar una dirección de correo electrónico a la lista Remitentes aprobados.

Tarea 2: Creación de espacio de nombres de etiqueta y definición de clave

  1. Abra el menú de navegación y haga clic en Gobernanza y administración.

  2. En Gestión de arrendamiento, haga clic en Espacios de nombres de etiqueta.

  3. En la página Espacios de nombres de etiquetas, haga clic en Crear espacios de nombres de etiquetas.

  4. En el panel Crear espacio de nombres de etiqueta, seleccione el compartimento adecuado y escriba custom en el nombre del espacio de nombres y proporcione descripción.

  5. En el espacio de nombres custom, haga clic en Crear definiciones de clave de etiqueta y escriba destinatario en la clave de etiqueta y créela.

    Nota: Puede agregar las direcciones de correo electrónico de destinatario a la etiqueta definida en cada recurso de OCI, donde se requiere notificación. La solución utilizará recipient addresses para notificar, si está disponible en el evento de Cloud, de lo contrario, se utilizará la dirección defaultrecepient especificada en la configuración de la función. Por ejemplo, demouser1@abc.com,demouser2@abc.com

Tarea 3: Crear secreto en el almacén de OCI

  1. Abra el menú de navegación, haga clic en Identidad y seguridad y, a continuación, en Valor.

  2. En el ámbito de lista, seleccione un compartimento que contenga el almacén.

    Nota: Si necesita crear un nuevo almacén y una clave de cifrado maestra, siga las instrucciones de Create Vault y Master Encryption Key.

  3. En Recursos, haga clic en Crear secreto y seleccione la clave de cifrado maestra adecuada.

    • Introduzca smptppass en el campo de nombre y la descripción Contraseña de SMTP para la autenticación de entrega de correo electrónico de OCI.

    • Seleccione el formato texto sin formato para la plantilla de tipo de secreto e introduzca smtp password para el contenido del secreto.

      Nota: Utilice la contraseña SMTP compartida por el administrador de OCI IAM.

Tarea 4: Creación y despliegue de la función OCI

  1. En la consola de OCI, haga clic en Cloud Shell en la navegación superior.

  2. Cree una función mediante la CLI del proyecto Fn desde el shell en la nube.

    fn init --runtime python <function-name>
    
    Example: fn init --runtime python emaildelivery-func
    
  3. Cambie el directorio al directorio creado recientemente.

  4. Cree una aplicación para desplegar la función.

    # Specify the OCID of subnet
    fn create app emaildeliveryapp --annotation oracle.com/oci/subnetIds='["<subnet OCID>"]'
    
    Example:  fn create app emaildeliveryapp --annotation oracle.com/oci/subnetIds='["ocid1.subnet.oc1.ap-mumbai-1.aaaaaaaabitp32dkyox37qa3tk3evl2nxivwb....."]'
    
  5. Copie y pegue el siguiente script en el archivo func.py sobrescribiendo el contenido existente.

    # python script for sending SMTP configuration with Oracle Cloud Infrastructure Email Delivery
    import io
    import json
    import logging
    import oci
    from fdk import response
    import smtplib
    import email.utils
    import ssl
    import base64
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.base import MIMEBase
    
    # Get Resource Principal Credentials
    signer = oci.auth.signers.get_resource_principals_signer()
    
    # Get instance principal context
    secret_client = oci.secrets.SecretsClient(config={}, signer=signer)
    identity_client = oci.identity.IdentityClient(config={}, signer=signer)
    tenancy_data = identity_client.get_tenancy(tenancy_id=signer.tenancy_id).data
    t_name = str(tenancy_data.name)
    t_id = signer.tenancy_id
    
    # Retrieve secret
    def read_secret_value(secret_client, secret_id):
       response = secret_client.get_secret_bundle(secret_id)
       base64_Secret_content = response.data.secret_bundle_content.content
       base64_secret_bytes = base64_Secret_content.encode('ascii')
       base64_message_bytes = base64.b64decode(base64_secret_bytes)
       secret_content = base64_message_bytes.decode('ascii')
       return secret_content
    
    # Sender name
    sendername = 'noreply'
    
    # If you're using Email Delivery in a different region, replace the HOST value with an appropriate SMTP endpoint.
    # Use port 25 or 587 to connect to the SMTP endpoint.
    port = 587
    
    # Reading company logo information in base64 encoded
    with open("companylogo.png", "rb") as image_file:
       image_data = base64.b64encode(image_file.read())
    image_data = '<img src="data:image/png;base64,'+str(image_data)[2:]+'" alt="company logo" />'
    
    def handler(ctx, data: io.BytesIO=None):
       try:
          # Extracting function config values
          cfg = ctx.Config()
          smtp_user = cfg["smtpuser"]
          host = cfg["host"]
          sender = cfg["sender"]
          smtp_defrec = cfg["defaultrecipient"]
          smtp_pass = cfg["smtppass"]
    
          # Secrets from vault
          smtp_pass = read_secret_value(secret_client, secret_id=smtp_pass )
    
          # Extracting values from triggered OCI event
          body = json.loads(data.getvalue())
          e_Type = body.get("eventType")
          e_time = body.get("eventTime")
          r_name = body["data"]["resourceName"]
          c_id = body["data"]["compartmentId"]
          c_name = body["data"]["compartmentName"]
          r_id = body["data"]["resourceId"]
          add_detail = ""
    
          try:
                # Extracting additional details from OCI event
                details = body["data"]["additionalDetails"]
                for key, value in details.items():
                   add_detail = add_detail+str(key)+' : '+str(value)+'<br>'
          except (Exception, ValueError) as ex:
                add_detail = "Additional details not available for this OCI event"
    
          try:
                # Extracting recepient details if available in OCI event
                recipient = body["data"]["definedTags"]["custom"]["recipient"]
          except Exception as e:
                recipient = smtp_defrec
    
          # Extract event type
          e_Type = e_Type.split('com.oraclecloud.')[1]
    
          # Extract region name
          r_id = r_id.split('.')[3]
    
          # The subject line of the email.
          SUBJECT = 'Event | '+ r_name + ' | ' + e_Type + ' | ' + e_time
    
          BODY_HTML = """\
          <html>
             <head></head>
             <body>
             """ +str(image_data)+ """
             <h2>Oracle Cloud Notification</h2>
             <hr>
             <b>Event Time : </b>""" +str(e_time)+ """
             <br>
             <b>Event Type : </b>""" +str(e_Type)+ """
             <br>
             <b>Tenancy Name : </b>""" +str(t_name)+ """
             <br>
             <b>Tenancy ID : </b>""" +str(t_id)+ """
             <hr>
             <b>Resource Name : </b>""" +str(r_name)+ """
             <br>
             <b>Region Name : </b>""" +str(r_id)+ """
             <br>
             <b>Compartment ID : </b>""" +str(c_id)+ """
             <br>
             <b>Compartment Name : </b>""" +str(c_name)+ """
             <hr>
             <b>Details : </b><br>""" +str(add_detail)+ """
             <hr>
          <br>
          <p>
          Thank you, <br>
          The OCI team <br><br><br>
          Please do not reply directly to this email. This mailbox is not monitored. If you have any questions regarding this notification, contact your account administrator. <br>
          </p>
          </body>
          </html>
          """
    
          # create message container
          msg = MIMEMultipart()
          msg['Subject'] = SUBJECT
          msg['From'] = email.utils.formataddr((sendername, sender))
          msg['To'] = recipient
    
          # Attach HTML body for email
          msg.attach(MIMEText(BODY_HTML, 'html'))
    
          # Attach JSON payload as attachement
          attach_file = json.dumps(body,indent=2)
          payload = MIMEBase('application', 'octate-stream')
          payload.set_payload(attach_file)
          payload.add_header('Content-Disposition', 'attachment', filename='event_output.json')
          msg.attach(payload)
    
          # Try to send the message.
          server = smtplib.SMTP(host, port)
          server.ehlo()
          # most python runtimes default to a set of trusted public CAs that will include the CA used by OCI Email Delivery.
          # However, on platforms lacking that default (or with an outdated set of CAs), customers may need to provide a capath that includes our public CA.
          server.starttls(context=ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=None, capath=None))
          # smtplib docs recommend calling ehlo() before & after starttls()
          server.ehlo()
          server.login(smtp_user, smtp_pass)
    
          # our requirement is that SENDER is the same as From address set previously
          server.sendmail(sender, recipient, msg.as_string())
          server.close()
          # Display an error message if something goes wrong.
       except (Exception, ValueError) as ex:
          logging.getLogger().info('error parsing json payload: ' + str(ex))
    
       return response.Response(ctx, response_data=json.dumps({"message": "success"}),headers={"Content-Type": "application/json"})
    
  6. Puede sustituir companylogo.png por el logotipo de su compañía y actualizar el texto HTML como cuerpo de correo electrónico en el script. El valor por defecto es el logotipo de Oracle.

  7. Ejecute el siguiente comando para desplegar la función.

    fn -v deploy --app <app-name>
    
    Example: fn -v deploy --app emaildeliveryapp
    
  8. Ejecute a continuación para agregar la configuración de función para cada clave y valor de configuración.

    • remitente: use el remitente aprobado configurado en la tarea 1.

    • smtpuser: usuario SMTP compartido por el administrador de OCI IAM.

    • smtppass: utilice el OCID del secreto de almacén de contraseñas SMTP y actualice el valor de configuración de smtppass.

    • host: utilice el punto final de conexión SMTP según los requisitos.

    • defaultrecipient: proporcione la dirección de correo electrónico como destinatario por defecto. La solución utilizará _recipient addresses_ para notificar, si está disponible en el evento de Cloud, de lo contrario, se utilizará la dirección _defaultrecepient_ en la configuración de la función.

    fn config function <app-name> <function-name> <config-key> <config-value>
    
    Example: fn config function emaildeliveryapp emaildelivery-func sender noreply@notification.ap-mumbai-1.oci.oraclecloud.com
    

Tarea 5: Crear regla de evento

  1. Abra el menú de navegación y haga clic en Observación y gestión.

  2. En Servicio de eventos, haga clic en Reglas.

  3. Haga clic en Crear regla y, en el panel Crear regla, proporcione un nombre fácil de recordar para la regla y una descripción de lo que hace la regla.

  4. En el área Condiciones de regla, especifique el tipo de evento y la acción para disparar la función. Puede definir filtros basados en tipos de eventos, atributos y etiquetas para limitar los eventos que disparan acciones. A continuación se muestra un ejemplo para disparar el evento de inicio o parada de la instancia informática.

    Regla de evento de instancia informática

Tarea 6: Validar notificación por correo electrónico

  1. Inicie o pare la instancia informática en el compartimento en el que se ha creado la regla de evento para disparar el evento de OCI.

  2. Recibirá una notificación fácil de usar por correo electrónico junto con el JSON raw asociado.

    notificación por correo electrónico

Agradecimientos

Autor: Dipesh Kumar Rathod (maestro arquitecto principal en la nube, infraestructura)

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 un explorador de Oracle Learning.

Para obtener documentación sobre los productos, visite Oracle Help Center.