Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever em uma conta gratuita, consulte Conceitos básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
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
- Configure o OCI Functions para obter o relatório de uso de custo programado usando e-mail.
Pré-requisitos
-
Permissões de acesso no Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) para criar grupo dinâmico, política do OCI IAM, criar funções para ter o relatório de uso de custo programado no bucket.
-
Acesso a todos os componentes necessários para exibir seus OCIDs (Oracle Cloud Identifiers) e outras informações relevantes.
-
Acesso ao OCI Cloud Shell para que você possa criar, implantar e chamar as funções.
-
Os recursos de rede do OCI Functions precisam estar disponíveis. Configuração da VCN e da sub-rede.
Tarefa 1: Configurar Políticas e Grupos Dinâmicos Obrigatórios do OCI IAM
-
Faça log-in na Console do OCI. Para obter mais informações, consulte Fazer Login no Oracle Cloud.
-
Vá para o grupo dinâmico do OCI IAM e crie um novo grupo dinâmico com a regra a seguir.
-
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
-
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.
-
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.
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
-
Para criar um aplicativo, vá para Serviços do Desenvolvedor, clique em Aplicativo e crie um aplicativo na rede disponível.
-
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 arquivofunc.py
no OCI Cloud Shell e grave o código. -
Copie o código Python a seguir em
func.py
e o arquivo de texto no arquivorequirement.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
-
-
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
-
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.
-
Adicione Ação conforme mostrado na imagem a seguir com a função que é criada na Tarefa 2.
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
-
Usando o OCI Email Delivery (Isso precisa do domínio DNS público):
-
Crie um domínio de e-mail no OCI. Vá para Developer Services e selecione Email Delivery. Crie o domínio de e-mail de acordo com o DNS público disponível. O nome do domínio de e-mail deve ser igual ao nome do DNS público.
-
Configure o e-mail identificado (DKIM) e os remetentes aprovados no domínio de e-mail adicionando registros em seus registros de DNS públicos. Para obter mais informações sobre a configuração e o domínio de e-mail, consulte Instruções passo a passo para enviar e-mail com o OCI Email Delivery.
-
Crie as credenciais SMTP para seu usuário. Gere a credencial SMTP e salve-a para uso futuro. O mesmo ID de e-mail aprovado e as mesmas credenciais SMTP devem ser fornecidos no arquivo
func.py
.
-
-
Usando o OCI Notifications Service:
-
Para criar um tópico, vá para Serviços do Desenvolvedor. Em Integração de Aplicativos, clique em Notificações.
-
Na página Tópicos, clique em Criar Tópico e especifique as informações necessárias.
-
Depois que o tópico for criado, crie a Assinatura. Informe Protocolo como
Email
e o id de e-mail obrigatório. -
O e-mail será recebido no ponto final para confirmar a assinatura.
-
Testando
Faça upload do objeto ou de qualquer arquivo no bucket e a função automaticamente será acionada usando a regra de evento.
Links Relacionados
Reconhecimentos
- Autor - Samratha S P (Engenheira Sênior de Nuvem)
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.
Set Up Oracle Cloud Infrastructure Functions to Send Cost Usage Report using Email
F96406-03
December 2024