Observação:

Configurar o Oracle Cloud Infrastructure Functions para Enviar Relatório de Uso de Custo usando E-mail

Introdução

O relatório de uso de custo pode ser personalizado de acordo com a exigência e podemos criar o relatório de uso de custo programado. De acordo com a programação, o relatório será extraído e salvo no bucket do Oracle Cloud Infrastructure (OCI) Object Storage selecionado.

Para enviar este relatório usando e-mail, precisamos implantar o OCI Functions. O OCI Functions será acionado com base na regra de evento criada no OCI. Sempre que o arquivo for armazenado no bucket, o evento de upload do objeto acionará a função e o OCI Functions terá a automação para criar um URL de solicitação pré-autenticada para o objeto. Este URL será enviado por e-mail.

O e-mail pode ser recebido pelo serviço OCI Email Delivery ou pelos serviços OCI Notifications. Ambas as configurações são explicadas neste tutorial.

Objetivos

Pré-requisitos

Tarefa 1: Configurar Políticas e Grupos Dinâmicos Obrigatórios do OCI IAM

  1. Faça log-in na Console do OCI. Para obter mais informações, consulte Fazer Login no Oracle Cloud.

  2. Vá para o grupo dinâmico do OCI IAM e crie um novo grupo dinâmico com a regra a seguir.

    Criar Grupo Dinâmico

  3. Vá para políticas do OCI IAM e crie uma política do OCI IAM com as instruções a seguir.

    allow dynamic-group dynamicgroup_name to manage buckets in compartment CompartmentName where all {target.bucket.name='bucket_name'}
    
    allow dynamic-group dynamicgroup_name to manage objects in compartment CompartmentName where all {target.bucket.name='bucket_name'}
    
    Allow service metering_overlay to manage objects in compartment CompartmentName where all {target.bucket.name='bucket_name', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_DELETE', request.permission='OBJECT_READ'}}
    

    Para enviar e-mail usando o serviço OCI Notifications, a instrução a seguir precisa ser adicionada à política do OCI IAM para acessar o tópico do OCI Notifications.

    allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
    

Tarefa 2: Criar Relatório de Uso de Custo Programado

  1. Vá para Gerenciamento de Custos e Faturamento e selecione Gerenciamento de Custos. Crie seu próprio relatório de uso de custo personalizado em Análise de Custos e clique em Aplicar para salvar o relatório.

    Criar Relatório de Custo

  2. Clique em Relatórios programados e crie um novo relatório programado com as informações do bloco. Você pode programar isso de acordo com sua exigência.

    Criar relatório programado

    De acordo com a programação, o relatório será salvo automaticamente em determinado bucket do OCI Object Storage.

Tarefa 3: Criar e Implantar o Código da Função

  1. Para criar um aplicativo, vá para Serviços do Desenvolvedor, clique em Aplicativo e crie um aplicativo na rede disponível.

  2. Vá para funções/aplicativos e crie uma função. Essa função usará o grupo dinâmico e a política do OCI IAM para acessar o evento. Siga as etapas na tela para criar a função. Usamos o Python para codificar a lógica necessária, mas você pode usar sua própria linguagem e alterar a lógica conforme necessário. Para gravar o código, abra o arquivo requirement.txt da função e o arquivo func.py no OCI Cloud Shell e grave o código.

    Criar Função no cloud shell e no editor de código

  3. Copie o código Python a seguir em func.py e o arquivo de texto no arquivo requirement.txt.

    • func.py:

      • Usando o OCI Email Delivery:

        Observação: adicione os respectivos detalhes de ID de e-mail e SMTP (Simple Mail Transfer Protocol).

        import oci
        import json
        import io
        import logging
        import smtplib
        from os.path import basename
        from email.mime.application import MIMEApplication
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        from email.utils import COMMASPACE, formatdate
        from datetime import datetime
        import ssl
        import email.utils
        from email.message import EmailMessage
        
        def handler(ctx, data: io.BytesIO = None):
           funDataStr = data.read().decode('utf-8')
        
        #Convert the log data to json
           funData =  json.loads(funDataStr)
        
        #Set up OCI configuration using resource principal
           signer = oci.auth.signers.get_resource_principals_signer()
        #Create Object Storage client
           object_storage_client = oci.object_storage.ObjectStorageClient({},signer=signer)
        
        # Extract object details from the event
           object_name = funData['data']['resourceName']
           namespace = funData['data']['additionalDetails']['namespace']
           bucket_name = funData['data']['additionalDetails']['bucketName']
        # Download the object
        #get_object_response = object_storage_client.get_object(namespace, bucket_name, object_name)
        #object_content = str(get_object_response.data.text)
           create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name = namespace,
              bucket_name = bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                 name = "prestorage",
                 access_type = "ObjectRead",
                 time_expires = datetime.strptime(
                    "2024-06-05T04:25:22.344Z",
                    "%Y-%m-%dT%H:%M:%S.%fZ"),
                 object_name = object_name))
           #logging.getLogger().info(create_preauthenticated_request_response.data)
           logging.getLogger().info("created pre authenticated url")
           string = str(create_preauthenticated_request_response.data)
           #response = create_preauthenticated_request_response.data().decode('utf-8')
           url = json.loads(string)
           logging.getLogger().info(url)
           temporary_url = f"{url['full_path']}"
           logging.getLogger().info(temporary_url)
        
        #Set your email credentials
           sender_email = "test@domain"
           sender_name = "Tester"
        
        #Set the recipient email address
           recipient_email = "xyz@oracle.com"
           USERNAME_SMTP = "SMTPOCID"
           password_smtp = "************"
           HOST = "smtp_email"
           PORT = 587
        
        #Create the email content
           subject = "Cost Usage Report"
           body = temporary_url
           message = EmailMessage()
           message['From'] = email.utils.formataddr((sender_name, sender_email))
           message['To'] = recipient_email
           message['Subject'] = subject
           message.set_content(body)
           try:
              server = smtplib.SMTP(HOST, PORT)
              server.ehlo()
              server.starttls(context=ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH, cafile=None, capath=None))
              server.ehlo()
              server.login(USERNAME_SMTP, password_smtp)
              logging.getLogger().info("SMTP server logged in")
              server.sendmail(sender_email, recipient_email, message.as_string())
              #server.send_message(message)
              server.close()
           except Exception as e:
              logging.getLogger().info(f"Error: {e}")
           else:
              logging.getLogger().info('Email sent successfully!')
        
      • Usando Notificações do OCI:

        Observação: Atualize o OCID do tópico (as etapas para criar uma notificação são explicadas na Tarefa 5).

        import oci
        import json
        import io
        import logging
        import smtplib
        from os.path import basename
        from email.mime.application import MIMEApplication
        from email.mime.multipart import MIMEMultipart
        from email.mime.text import MIMEText
        from email.utils import COMMASPACE, formatdate
        from datetime import datetime
        import ssl
        import email.utils
        from email.message import EmailMessage
        
        def handler(ctx, data: io.BytesIO = None):
           funDataStr = data.read().decode('utf-8')
        
        # Convert the log data to json
           funData =  json.loads(funDataStr)
        
        # Set up OCI configuration using resource principal
           signer = oci.auth.signers.get_resource_principals_signer()
        # Create Object Storage client
           object_storage_client = oci.object_storage.ObjectStorageClient({},signer=signer)
           ons_client = oci.ons.NotificationDataPlaneClient({},signer=signer)
        # Extract object details from the event
        
        
           object_name = funData['data']['resourceName']
           namespace = funData['data']['additionalDetails']['namespace']
           bucket_name = funData['data']['additionalDetails']['bucketName']
        
        # Download the object
           create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name = namespace,
              bucket_name = bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                 name = "prestorage",
                 access_type = "ObjectRead",
                 time_expires = datetime.strptime(
                    "2024-06-05T04:25:22.344Z",
                    "%Y-%m-%dT%H:%M:%S.%fZ"),
                 object_name = object_name))
        #logging.getLogger().info(create_preauthenticated_request_response.data)
           logging.getLogger().info("created pre authenticated url")
           string = str(create_preauthenticated_request_response.data)
        #response = create_preauthenticated_request_response.data().decode('utf-8')
           url = json.loads(string)
        
           logging.getLogger().info(url)
           temporary_url = f"{url['full_path']}"
           logging.getLogger().info(temporary_url)
        #to send mail using notification
           publish_message_response = ons_client.publish_message(
              topic_id="ocid1.onstopic.oc1.iad.************",
              message_details=oci.ons.models.MessageDetails(
                 body=temporary_url,
                 title="Cost-usage report"),
           message_type="RAW_TEXT")
           logging.getLogger().info(publish_message_response)
           logging.getLogger().info('Email sent successfully!')
        
    • requirement.txt:

      fdk>=0.1.68
      oci
      
  4. Atualize a função no registro e implante o código mais recente usando o comando a seguir no OCI Cloud Shell.

    fn -v deploy — app App_name
    

Uma vez implantada, sua função está pronta para ser chamada. Para acionar a função, a regra de evento precisa ser criada.

Tarefa 4: Configurar a Regra de Eventos

  1. Crie uma regra de evento no OCI. Em Observabilidade e Gerenciamento, clique em Serviços de evento, Regras e Criar Regra. Informe a regra de correspondência, conforme mostrado na imagem a seguir, com o atributo como ID do bucket.

    Observação: O bucket do OCI Object Storage criado deve ser ativado com eventos de objeto de emissão.

    Criar Regra de Evento

  2. Adicione Ação conforme mostrado na imagem a seguir com a função que é criada na Tarefa 2.

    Ação

    Agora, o trigger para a função é criado.

Tarefa 5: Configurar a Configuração de E-mail usando o OCI Email Delivery ou o OCI Notifications

Testando

Faça upload do objeto ou de qualquer arquivo no bucket e a função automaticamente será acionada usando a regra de evento.

Reconhecimentos

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. 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.