Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeur pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. A la fin de l'exercice, remplacez ces valeurs par des valeurs propres à votre environnement cloud.
Configuration d'Oracle Cloud Infrastructure Functions pour envoyer le rapport sur l'utilisation des coûts à l'aide d'un courriel
Introduction
Le rapport d'utilisation des coûts peut être personnalisé selon les besoins et nous pouvons créer le rapport d'utilisation des coûts planifié. Conformément à la programmation, le rapport sera extrait et enregistré dans le bucket Object Storage Oracle Cloud Infrastructure (OCI) sélectionné.
Pour envoyer ce rapport par courriel, nous devons déployer OCI Functions. OCI Functions sera déclenché en fonction de la règle d'événement créée dans OCI. Chaque fois que le fichier est stocké dans le bucket, l'événement de téléchargement d'objet déclenche la fonction et OCI Functions dispose de l'automatisation pour créer une URL de demande pré-authentifiée pour l'objet. Cette URL sera envoyée par e-mail.
Les courriels peuvent être reçus par le service OCI Email Delivery ou par les services OCI Notifications. Les deux configurations sont expliquées dans ce tutoriel.
Objectifs
- Configurez OCI Functions pour obtenir le rapport d'utilisation des coûts planifiés à l'aide de la messagerie.
Prérequis
-
Droits d'accès dans Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) pour créer un groupe dynamique, stratégie OCI IAM, créer des fonctions afin de disposer du rapport d'utilisation des coûts programmé dans le bucket.
-
Accéder à tous les composants requis pour afficher leurs identificateurs Oracle Cloud (OCID) et d'autres informations pertinentes.
-
Accédez à OCI Cloud Shell afin de pouvoir créer, déployer et appeler les fonctions.
-
Les ressources réseau pour OCI Functions doivent être disponibles. Configuration du VCN et du sous-réseau.
Tâche 1 : configuration des stratégies OCI IAM et des groupes dynamiques requis
-
Connectez-vous à la console OCI. Pour plus d'informations, reportez-vous à Connexion à Oracle Cloud.
-
Accédez au groupe dynamique OCI IAM et créez un groupe dynamique avec la règle suivante.
-
Accédez aux stratégies OCI IAM et créez une stratégie OCI IAM avec les instructions suivantes.
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'}}
Pour envoyer des courriels à l'aide du service OCI Notifications, l'instruction suivante doit être ajoutée à la stratégie OCI IAM pour accéder au sujet OCI Notifications.
allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
Tâche 2 : Créer un état d'utilisation des coûts planifiés
-
Accédez à Facturation et gestion des coûts et sélectionnez Gestion des coûts. Créez votre propre rapport d'utilisation des coûts personnalisé sous Analyse des coûts et cliquez sur Appliquer pour enregistrer le rapport.
-
Cliquez sur Rapports programmés et créez un rapport programmé avec vos informations de bucket. Vous pouvez le planifier selon vos besoins.
Conformément à la programmation, le rapport sera automatiquement enregistré dans le bucket OCI Object Storage indiqué.
Tâche 3 : créer et déployer le code fonction
-
Pour créer une application, accédez à Services de développeur, cliquez sur Application et créez une application dans le réseau disponible.
-
Accédez à functions/applications et créez une fonction. Cette fonction utilisera le groupe dynamique et la stratégie OCI IAM pour accéder à l'événement. Suivez les étapes à l'écran pour créer la fonction. Nous avons utilisé Python pour coder la logique requise, mais vous pouvez utiliser votre propre langage et modifier la logique si nécessaire. Pour écrire le code, ouvrez le fichier
requirement.txt
de la fonction et le fichierfunc.py
dans OCI Cloud Shell, puis écrivez le code. -
Copiez le code Python suivant dans
func.py
et le fichier texte dans le fichierrequirement.txt
.-
func.py
:-
Utilisation d'OCI Email Delivery :
Remarque : ajoutez les détails SMTP (Simple Mail Transfer Protocol) et ID de courriel respectifs.
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!')
-
Utilisation des notifications OCI :
Remarque : mettez à jour l'OCID du sujet (les étapes de création de notification sont expliquées dans la tâche 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
-
-
Mettez à jour la fonction dans le registre et déployez le dernier code à l'aide de la commande suivante sur OCI Cloud Shell.
fn -v deploy — app App_name
Une fois déployée, la fonction est prête à être appelée. Pour déclencher la fonction, une règle d'événement doit être créée.
Tâche 4 : configurer la règle d'événement
-
Créez une règle d'événement dans OCI. Sous Observation et gestion, cliquez sur Services d'événement, Règles et Créer une règle. Entrez la règle de mise en correspondance comme indiqué sur l'image suivante avec l'attribut comme ID de bucket.
Remarque : le bucket OCI Object Storage créé doit être activé avec des événements d'objet d'émission.
-
Ajoutez Action comme indiqué dans l'image suivante avec la fonction créée dans la tâche 2.
Le déclencheur de la fonction est alors créé.
Tâche 5 : configurer la configuration des courriels à l'aide d'OCI Email Delivery ou d'OCI Notifications
-
Utilisation d'OCI Email Delivery (cette opération nécessite un domaine DNS public) :
-
Créez un domaine de messagerie dans OCI. Accédez à Services de développeur et sélectionnez Email Delivery. Créez le domaine de messagerie conformément au DNS public disponible. Le nom de domaine de messagerie doit être identique au nom DNS public.
-
Configurez les clés de domaine du courrier identifié (DKIM) et les expéditeurs approuvés dans le domaine de messagerie en ajoutant des enregistrements dans vos enregistrements DNS publics. Pour plus d'informations sur la configuration et le domaine de messagerie, reportez-vous à Instructions pas à pas pour l'envoi de courriels avec OCI Email Delivery.
-
Créez les informations d'identification SMTP pour l'utilisateur. Générez les informations d'identification SMTP et enregistrez-les pour une utilisation ultérieure. Les mêmes ID de courriel approuvé et informations d'identification SMTP doivent être fournis dans le fichier
func.py
.
-
-
Utilisation du service OCI Notifications :
-
Pour créer un sujet, accédez à Services de développeur. Sous Intégration d'application, cliquez sur Notifications.
-
Sur la page Rubriques, cliquez sur Créer un sujet et entrez les informations requises.
-
Une fois le sujet créé, créez un abonnement. Entrez Protocole en tant que
Email
et l'ID de courriel requis. -
Un courriel sera reçu à l'adresse pour confirmer l'abonnement.
-
Test
Téléchargez l'objet ou n'importe quel fichier dans le bucket et la fonction automatique sera déclenchée à l'aide d'une règle d'événement.
Liens connexes
Remerciements
- Auteur - Samratha S P (ingénieur cloud senior)
Ressources de formation supplémentaires
Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.
Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.
Set Up Oracle Cloud Infrastructure Functions to Send Cost Usage Report using Email
F96399-03
December 2024