Note:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse en una cuenta gratuita, consulte Introducción a la capa gratuita de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para las credenciales, el arrendamiento y los compartimentos de Oracle Cloud Infrastructure. Al finalizar el laboratorio, sustituya estos valores por otros específicos de su entorno en la nube.
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
- Envíe notificaciones de eventos de OCI fáciles de usar con OCI Email Delivery.
Requisitos
El administrador de Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) debe crear:
-
Grupo dinámico y políticas para que la función OCI llame y envíe notificaciones por correo electrónico.
-
Grupo Dinámico
Cree un grupo dinámico para el compartimento de funciones.
# Replace OCID for function compartment All {resource.type = 'fnfunc', resource.compartment.id = '<function-compartment>'} Example: All {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaanovmfmmnonjjyxeq4jyghszj2eczlrkgj5svnxrt...'}
-
Políticas
Cree políticas para asignar un grupo dinámico a la función.
# Replace dynamic-group-name, function-compartment and OCID of vault secret for OCI function Allow dynamic-group <dynamic-group-name> to read secret-family in compartment <function-compartment> where target.secret.id='<ocid of smtp password vaultsecret>' Allow dynamic-group <dynamic-group-name> to inspect compartments in tenancy Allow dynamic-group <dynamic-group-name> to read repos in compartment <function-compartment>
-
-
Cuenta de servicio de protocolo simple de transferencia de correo (SMTP) con capacidad de usuario limitada solo para
SMTP credentials
. Genere y comparta la credencial SMTP con el desarrollador. -
Compartimento, grupo y políticas para que el desarrollador cree secretos y despliegue la función.
# Replace group-name as per your tenancy Allow group <group-name> to manage repos in compartment <function-compartment> Allow group <group-name> to manage vaults in compartment <function-compartment> Allow group <group-name> to manage keys in compartment <function-compartment> Allow group <group-name> to manage secret-family in compartment <function-compartment> Allow group <group-name> to manage approved-senders in compartment <function-compartment> allow group <group-name> to use cloud-shell in tenancy allow group <group-name> to manage functions-family in compartment <function-compartment> allow group <group-name> to use virtual-network-family in compartment <network-compartment> Allow group <group-name> to read objectstorage-namespaces in tenancy
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.
-
Abra el menú de navegación de la consola de OCI y haga clic en Servicios para desarrolladores.
-
En Integración de aplicación, haga clic en Email Delivery.
-
En Email Delivery, haga clic en Enviadores aprobados.
-
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
, agreguenoreply@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
. -
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
-
Abra el menú de navegación y haga clic en Gobernanza y administración.
-
En Gestión de arrendamiento, haga clic en Espacios de nombres de etiqueta.
-
En la página Espacios de nombres de etiquetas, haga clic en Crear espacios de nombres de etiquetas.
-
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.
-
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óndefaultrecepient
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
-
Abra el menú de navegación, haga clic en Identidad y seguridad y, a continuación, en Valor.
-
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.
-
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
-
En la consola de OCI, haga clic en Cloud Shell en la navegación superior.
-
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
-
Cambie el directorio al directorio creado recientemente.
-
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....."]'
-
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"})
-
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.
-
Ejecute el siguiente comando para desplegar la función.
fn -v deploy --app <app-name> Example: fn -v deploy --app emaildeliveryapp
-
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
-
Abra el menú de navegación y haga clic en Observación y gestión.
-
En Servicio de eventos, haga clic en Reglas.
-
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.
-
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.
Tarea 6: Validar notificación por correo electrónico
-
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.
-
Recibirá una notificación fácil de usar por correo electrónico junto con el JSON raw asociado.
Enlaces relacionados
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.
Set Up Email Notifications for Oracle Cloud Infrastructure Events in OCI Monitoring
F87596-01
October 2023
Copyright © 2023, Oracle and/or its affiliates.