Observação:

Configurar Notificações por E-mail para o Oracle Cloud Infrastructure Events no OCI Monitoring

Introdução

Os serviços do Oracle Cloud Infrastructure (OCI) emitem eventos, que são mensagens estruturadas que indicam alterações em recursos. É necessário criar regras para trabalhar com eventos e também especificar uma ação a ser acionada quando encontrar um evento correspondente.

As ações de notificação por e-mail são uma resposta que você define para correspondências de evento. O serviço de entrega de e-mail da OCI oferece uma solução gerenciada rápida e confiável para enviar notificações por e-mail seguras, de alto volume e transacionais.

Objetivos

Pré-requisitos

O administrador do Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) deve criar:

Para obter mais informações sobre a região de entrega de e-mail inscrita e preferencial, consulte Configurando o Ponto Final de Conexão SMTP.

Tarefa 1: Configurar remetente aprovado na entrega de e-mail

Um remetente aprovado deve ser configurado para todos os endereços "De" que enviam e-mail por meio do OCI. Ela está associada a um compartimento e só existe na região em que o remetente aprovado foi configurado.

Você pode usar seu nome de domínio ou notificação oracle padrão para remetente aprovado conforme mencionado abaixo.

  1. Abra o menu de navegação da Console do OCI e clique em Serviços ao Desenvolvedor.

  2. Em Integração do Aplicativo, clique em Email Delivery.

  3. Em Email Delivery, clique em Remetentes Aprovados.

  4. Clique em Criar Remetente Aprovado e informe o endereço de e-mail que deseja listar como remetente aprovado.

    Observação: se o ponto final de conexão SMTP de entrega de e-mail do OCI for smtp.email.ap-mumbai-1.oci.oraclecloud.com, adicione noreply@notification à região e informe o endereço de e-mail do remetente aprovado. Por exemplo, noreply@notification.ap-mumbai-1.oci.oraclecloud.com.

  5. Clique em Adicionar para adicionar o endereço de e-mail à sua lista de Remetentes Aprovados.

Tarefa 2: Criar namespace de tag e definição de chave

  1. Abra o menu de navegação e clique em Governança e Administração.

  2. Em Gerenciamento de Tenancy, clique em Namespaces de Tag.

  3. Na página Namespaces de Tag, clique em Criar Namespaces de Tag.

  4. No painel Criar Namespace de Tag, selecione o compartimento apropriado e digite personalizado no nome do namespace e forneça descrição.

  5. No namespace custom, clique em Criar Definições de Chave de Tag e digite recipiente na chave de Tag e crie-a.

    Observação: você pode adicionar os endereços de e-mail do destinatário à tag definida em cada recurso do OCI, onde a notificação é necessária. A solução usará recipient addresses para notificar, se disponível no evento do Cloud, caso contrário, o endereço defaultrecepient será usado especificado na configuração da função. Por exemplo, demouser1@abc.com,demouser2@abc.com

Tarefa 3: Criar segredo no OCI vault

  1. Abra o menu de navegação, clique em Identidade e Segurança e clique em Vault.

  2. Em Escopo da lista, selecione um compartimento que contenha o vault.

    Observação: se você precisar criar um novo vault e uma chave de criptografia principal, siga as instruções em Criar Vault e Chave de Criptografia Principal.

  3. Em Recursos, clique em Criar Segredo e selecione a chave de criptografia mestra apropriada.

    • Digite smptppass no campo de nome e na descrição Senha SMTP para autenticação de entrega de e-mail do OCI.

    • Selecione o formato texto simples do Modelo de Tipo de Segredo e digite a senha smtp para obter o conteúdo do segredo.

      Observação: Use a senha SMTP compartilhada pelo administrador do OCI IAM.

Tarefa 4: Criar e implantar a função do OCI

  1. Na console do OCI, clique em Cloud Shell na navegação superior.

  2. Criar função usando a CLI do projeto Fn do shell da nuvem.

    fn init --runtime python <function-name>
    
    Example: fn init --runtime python emaildelivery-func
    
  3. Altere o diretório para o diretório recém-criado.

  4. Crie um aplicativo para implantar a função.

    # 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 e cole o script abaixo no arquivo func.py substituindo o conteúdo 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. Você poderia substituir companylogo.png pelo logotipo da sua empresa e atualizar o texto HTML como corpo do e-mail no script. O padrão é o logotipo da Oracle.

  7. Execute o comando abaixo para implantar a função.

    fn -v deploy --app <app-name>
    
    Example: fn -v deploy --app emaildeliveryapp
    
  8. Execute abaixo para adicionar configuração de função para cada chave e valor de configuração.

    • remetente: use o remetente aprovado configurado na Tarefa 1.

    • smtpuser: Usuário SMTP compartilhado pelo administrador do OCI IAM.

    • smtppass: Use o OCID do segredo do vault de senha SMTP e atualize no valor de configuração smtppass.

    • host: Use o ponto final de conexão SMTP de acordo com o pré-requisito.

    • defaultrecipient: Forneça o endereço de e-mail como destinatário padrão. A solução usará _recipient addresses_ para notificar, se disponível no evento do Cloud, caso contrário, o endereço _defaultrecepient_ será usado na configuração da função.

    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
    

Tarefa 5: Criar regra de evento

  1. Abra o menu de navegação e clique em Observabilidade & Gerenciamento.

  2. Em Serviço Events, clique em Regras.

  3. Clique em Criar Regra e, no painel Criar Regra, forneça um nome amigável para a regra e uma descrição do que a regra faz.

  4. Na área Condições da Regra, especifique o tipo de evento e a ação para acionar a função. Você pode definir filtros com base em tipos de evento, atributos e tags para limitar os eventos que acionam ações. Veja a seguir um exemplo para acionar o evento de início ou interrupção da instância de computação.

    regra de evento de instância de computação

Tarefa 6: Validar notificação por e-mail

  1. Inicie ou interrompa a instância de computação no compartimento em que a regra de evento foi criada para acionar o evento do OCI.

  2. Você receberá uma notificação por e-mail, juntamente com o JSON bruto anexado a ele.

    notificação de e-mail

Aquisições

Autor - Dipesh Kumar Rathod (Master Principal Arquiteto de Nuvem, Infraestrutura)

Mais Recursos de Aprendizagem

Explore outros laboratórios no site docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.