Remarques :

Configuration des notifications par courriel pour Oracle Cloud Infrastructure Events dans OCI Monitoring

Introduction

Les services Oracle Cloud Infrastructure (OCI) émettent des événements, qui sont des messages structurés indiquant des modifications dans les ressources. Il est nécessaire de créer des règles pour utiliser les événements et de spécifier une action à déclencher lorsqu'il trouve un événement correspondant.

Les actions de notification par e-mail sont une réponse que vous définissez pour les correspondances d'événements. Le service de remise de courriels OCI fournit une solution gérée rapide et fiable pour l'envoi de notifications par courriel sécurisées, en grand nombre et transactionnelles.

Objectifs

Prérequis

L'administrateur Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) doit créer les éléments suivants :

Pour plus d'informations sur la région d'envoi de courriels avec abonnement et préféré, reportez-vous à Configuration de l'adresse de connexion SMTP.

Tâche 1 : configurer l'expéditeur approuvé dans la livraison par courriel

Un expéditeur approuvé doit être configuré pour toutes les adresses d'origine qui envoient des courriels via OCI. Il est associé à un compartiment et existe uniquement dans la région dans laquelle l'expéditeur approuvé a été configuré.

Vous pouvez utiliser votre nom de domaine ou la notification oracle par défaut pour l'expéditeur approuvé comme indiqué ci-dessous.

  1. Ouvrez le menu de navigation de la console OCI et cliquez sur Services de développeur.

  2. Sous Application Integration, cliquez sur Email Delivery.

  3. Sous Email Delivery, cliquez sur Expéditeurs approuvés.

  4. Cliquez sur Créer un expéditeur approuvé et entrez l'adresse électronique à répertorier en tant qu'expéditeur approuvé.

    Remarque : si l'adresse de connexion SMTP de remise de courriels OCI est smtp.email.ap-mumbai-1.oci.oraclecloud.com, ajoutez noreply@notification à la région et entrez l'adresse électronique de l'expéditeur approuvée. Par exemple, noreply@notification.ap-mumbai-1.oci.oraclecloud.com.

  5. Cliquez sur Ajouter pour ajouter une adresse électronique à la liste des expéditeurs approuvés.

Tâche 2 : création d'un espace de noms et d'une définition de clé de balise

  1. Ouvrez le menu de navigation et cliquez sur Gouvernance et administration.

  2. Sous Gestion de location, cliquez sur Espaces de noms de balise.

  3. Sur la page Espaces de noms de balise, cliquez sur Créer des espaces de noms de balise.

  4. Dans le panneau Créer un espace de noms de balise, sélectionnez le compartiment approprié et saisissez custom dans le nom de l'espace de noms et fournissez la description.

  5. Dans l'espace de noms custom, cliquez sur Créer des définitions de clé de balise et saisissez recipient dans la clé de balise et créez-la.

    Remarque : vous pouvez ajouter les adresses électroniques de destinataire à la balise définie dans chaque ressource OCI, lorsque la notification est requise. La solution utilise recipient addresses pour notifier, si elle est disponible dans un événement cloud, sinon l'adresse defaultrecepient sera utilisée dans la configuration de fonction. Par exemple, demouser1@abc.com,demouser2@abc.com

Tâche 3 : création d'une clé secrète dans le coffre OCI

  1. Ouvrez le menu de navigation, cliquez sur Identity & Security, puis cliquez sur Vault.

  2. Sous Portée de la liste, sélectionnez un compartiment contenant le coffre.

    Remarque : si vous devez créer un coffre et une clé de cryptage maître, suivez les instructions fournies dans Create Vault et Master Encryption Key.

  3. Sous Ressources, cliquez sur Créer une clé secrète et sélectionnez la clé de cryptage maître appropriée.

    • Entrez smptppass dans le champ de nom et la description Mot de passe SMTP pour l'authentification de remise de courriels OCI.

    • Sélectionnez le format plain-text pour le modèle de type de clé secrète et saisissez smtp password pour le contenu de la clé secrète.

      Remarque : utilisez le mot de passe SMTP partagé par l'administrateur OCI IAM.

Tâche 4 : création et déploiement de la fonction OCI

  1. Sur la console OCI, cliquez sur Cloud Shell dans la navigation supérieure.

  2. Créer une fonction à l'aide de l'interface de ligne de commande du projet Fn à partir de cloud shell.

    fn init --runtime python <function-name>
    
    Example: fn init --runtime python emaildelivery-func
    
  3. Passez au répertoire que vous avez créé.

  4. Créez une application pour déployer la fonction.

    # 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. Copiez et collez le script ci-dessous dans le fichier func.py en écrasant le contenu existant.

    # 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. Vous pouvez remplacer companylogo.png par le logo de votre société et mettre à jour le texte HTML en tant que corps du courriel dans le script. La valeur par défaut est le logo Oracle.

  7. Exécutez la commande ci-dessous pour déployer la fonction.

    fn -v deploy --app <app-name>
    
    Example: fn -v deploy --app emaildeliveryapp
    
  8. Exécutez ci-dessous pour ajouter une configuration de fonction pour chaque clé et valeur de configuration.

    • expéditeur : utilisez l'expéditeur approuvé configuré dans la tâche 1.

    • smtpuser : utilisateur SMTP partagé par l'administrateur OCI IAM.

    • smtppass : utilisez l'OCID de la clé secrète du coffre de mots de passe SMTP et mettez à jour la valeur de configuration smtppass.

    • host : utilisez l'adresse de connexion SMTP selon le prérequis.

    • defaultrecipient : indiquez l'adresse électronique comme destinataire par défaut. La solution utilise _recipient addresses_ pour notifier, si elle est disponible dans un événement cloud, sinon l'adresse _defaultrecepient_ sera utilisée dans la configuration de fonction.

    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
    

Tâche 5 : créer une règle d'événement

  1. Ouvrez le menu de navigation et cliquez sur Observation & gestion.

  2. Sous Service d'événements, cliquez sur Règles.

  3. Cliquez sur Créer une règle et, dans le panneau Créer une règle, indiquez un nom convivial pour la règle et une description de son rôle.

  4. Dans la zone Conditions de règle, indiquez le type d'événement et l'action pour déclencher la fonction. Vous pouvez définir des filtres en fonction des types d'événement, des attributs et des balises afin de limiter les événements qui déclenchent des actions. Voici un exemple de déclenchement d'un événement de démarrage ou d'arrêt d'instance de calcul.

    règle d'événement d'instance de calcul

Tâche 6 : Valider la notification par courriel

  1. Démarrez ou arrêtez l'instance de calcul dans le compartiment où la règle d'événement a été créée pour déclencher l'événement OCI.

  2. Vous recevrez une notification conviviale par courriel, ainsi qu'un fichier JSON brut qui lui est attaché.

    Notification par courriel

Remerciements

Auteur - Dipesh Kumar Rathod (architecte cloud principal maître, infrastructure)

Ressources de formation supplémentaires

Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenu de formation gratuit sur le canal Oracle Learning YouTube. En outre, accédez à education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour consulter la documentation produit, consultez Oracle Help Center.