Note:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse en una cuenta gratuita, consulte Introducción a la cuenta gratuita de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para credenciales, arrendamiento y compartimentos de Oracle Cloud Infrastructure. Al completar el laboratorio, sustituya estos valores por otros específicos de su entorno en la nube.
Configuración de Oracle Cloud Infrastructure Functions para enviar el informe de uso de costos mediante correo electrónico
Introducción
El informe de uso de costos se puede personalizar según los requisitos y podemos crear el informe de uso de costos programado. Según el programa, el informe se extraerá y guardará en el cubo de Oracle Cloud Infrastructure (OCI) Object Storage seleccionado.
Para enviar este informe por correo electrónico, necesitamos desplegar OCI Functions. OCI Functions se disparará en función de la regla de evento creada en OCI. Cuando el archivo se almacena en el cubo, el evento de carga de objeto dispara la función y OCI Functions tendrá la automatización para crear una URL de solicitud autenticada previamente para el objeto. Esta URL se enviará por correo electrónico.
El servicio de Email Delivery de OCI o los servicios de notificaciones de OCI pueden recibir correo electrónico. Ambas configuraciones se explican en este tutorial.
Objetivos
- Configure OCI Functions para obtener el informe de uso de costos programado por correo electrónico.
Requisitos
-
Permisos de acceso en Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) para crear un grupo dinámico, la política de OCI IAM, crear funciones para tener el informe de uso de costos programado en el cubo.
-
Acceda a todos los componentes necesarios para ver sus identificadores de Oracle Cloud (OCID) y otra información relevante.
-
Acceso a OCI Cloud Shell para que pueda crear, desplegar y llamar a las funciones.
-
Los recursos de red para OCI Functions deben estar disponibles. Configuración de VCN y subred.
Tarea 1: Configuración de políticas y grupos dinámicos de OCI IAM necesarios
-
Conéctese a la consola de OCI. Para obtener más información, consulte Conexión a Oracle Cloud.
-
Vaya al grupo dinámico de IAM de OCI y cree un nuevo grupo dinámico con la siguiente regla.
-
Vaya a las políticas de OCI IAM y cree una política de OCI IAM con las siguientes sentencias.
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 correo electrónico mediante el servicio OCI Notifications, se debe agregar la siguiente sentencia en la política de OCI IAM para acceder al tema OCI Notifications.
allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
Tarea 2: Crear informe de uso de costos programados
-
Vaya a Gestión de facturación y costos y seleccione Gestión de costos. Cree su propio informe de uso de costos personalizado en Análisis de costos y haga clic en Aplicar para guardar el informe.
-
Haga clic en Informes programados y cree un nuevo informe programado con la información del bloque. Puede programar esto según sus requisitos.
Según el programa, el informe se guardará automáticamente en un cubo de OCI Object Storage determinado.
Tarea 3: Creación y despliegue del código de función
-
Para crear una aplicación, vaya a Servicios para desarrolladores, haga clic en Aplicación y cree una aplicación en la red disponible.
-
Vaya a functions/applications y cree una función. Esta función utilizará el grupo dinámico y la política de OCI IAM para acceder al evento. Siga los pasos de la pantalla para crear la función. Hemos utilizado Python para codificar la lógica necesaria, pero puede utilizar su propio lenguaje y cambiar la lógica según sea necesario. Para escribir el código, abra el archivo de función
requirement.txt
y el archivofunc.py
en OCI Cloud Shell y escriba el código. -
Copie el siguiente código Python en
func.py
y el archivo de texto en el archivorequirement.txt
.-
func.py
:-
Uso de OCI Email Delivery:
Nota: Agregue los detalles correspondientes del ID de correo electrónico y del protocolo simple de transferencia de correo (SMTP).
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!')
-
Uso de OCI Notifications:
Nota: Actualice el OCID del tema (los pasos para crear la notificación se explican en la tarea 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
-
-
Actualice la función del registro y despliegue el código más reciente mediante el siguiente comando en OCI Cloud Shell.
fn -v deploy — app App_name
Una vez desplegada, la función está lista para ser llamada. Para activar la función, se debe crear una regla de evento.
Tarea 4: Configuración de la regla de evento
-
Crear una regla de evento en OCI. En Observación y gestión, haga clic en Servicios de eventos, Reglas y Crear regla. Introduzca la regla de coincidencia como se muestra en la siguiente imagen con el atributo como ID de cubo.
Nota: El cubo de OCI Object Storage creado debe estar activado con eventos de objeto de salida.
-
Agregue Acción como se muestra en la siguiente imagen con la función creada en la tarea 2.
Ahora, se crea el disparador para la función.
Tarea 5: Configuración de correo electrónico mediante OCI Email Delivery o OCI Notifications
-
Uso de OCI Email Delivery (se necesita un dominio de DNS público):
-
Crear un dominio de correo electrónico en OCI. Vaya a Servicios para desarrolladores y seleccione Email Delivery. Cree el dominio de correo electrónico según el DNS público disponible. El nombre de dominio de correo electrónico debe ser el mismo que el nombre de DNS público.
-
Configure las claves de dominio identificadas por correo (DKIM) y los remitentes aprobados en el dominio de correo electrónico agregando registros en los registros DNS públicos. Para obtener más información sobre la configuración y el dominio de correo electrónico, consulte Instrucciones paso a paso para enviar correo electrónico con OCI Email Delivery.
-
Cree las credenciales de SMTP para el usuario. Genere la credencial SMTP y guárdela para su uso futuro. Se deben proporcionar el mismo ID de correo electrónico aprobado y las mismas credenciales SMTP en el archivo
func.py
.
-
-
Uso del servicio OCI Notifications:
-
Para crear un tema, vaya a Servicios para desarrolladores. En Integración de aplicación, haga clic en Notificaciones.
-
En la página Temas, haga clic en Crear tema e introduzca la información necesaria.
-
Una vez creado el tema, cree una suscripción. Introduzca Protocolo como
Email
y el ID de correo electrónico necesario. -
Se recibirá un correo electrónico en el punto final para confirmar la suscripción.
-
Prueba
Cargue el objeto o cualquier archivo en el cubo y la función se disparará automáticamente mediante la regla de evento.
Enlaces relacionados
Confirmaciones
- Autor: Samratha S. P. (ingeniero sénior en la nube)
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 Oracle Learning Explorer.
Para obtener documentación sobre el producto, visite Oracle Help Center.
Set Up Oracle Cloud Infrastructure Functions to Send Cost Usage Report using Email
F96401-03
December 2024