Note :
- Ce tutoriel nécessite l'accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, voir Introduction à l' niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les données d'identification, la location et les compartiments Oracle Cloud Infrastructure. À la fin de votre laboratoire, remplacez ces valeurs par celles propres à votre environnement en nuage.
Configurer Oracle Cloud Infrastructure Functions pour envoyer le rapport d'utilisation des coûts par courriel
Présentation
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 programmé. Conformément au programme, le rapport sera extrait et enregistré dans le seau de stockage d'objets Oracle Cloud Infrastructure (OCI) sélectionné.
Pour envoyer ce rapport par courriel, nous devons déployer le service des fonctions pour OCI. Le service des fonctions pour OCI 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 seau, l'événement de chargement d'objet déclenche la fonction et le service des fonctions pour OCI dispose de l'automatisation pour créer une URL de demande préauthentifiée vers l'objet. Cette URL sera envoyée par courriel.
Les courriels peuvent être reçus par le service de transmission de messages OCI ou par les services d'avis OCI. Les deux configurations sont expliquées dans ce tutoriel.
Objectifs
- Configurez le service des fonctions pour OCI pour obtenir le rapport d'utilisation des coûts programmés à l'aide d'un courriel.
Préalables
-
Autorisations d'accès dans Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) pour créer un groupe dynamique, politique IAM OCI, créer des fonctions pour avoir le rapport d'utilisation des coûts programmé dans le seau.
-
Accès à tous les composants requis pour voir leurs identificateurs Oracle Cloud (OCID) et d'autres informations pertinentes.
-
Accédez à Cloud Shell pour OCI afin de créer, déployer et appeler les fonctions.
-
Les ressources de réseau pour le service des fonctions pour OCI doivent être disponibles. Configuration du VCN et des sous-réseaux.
Tâche 1 : Configurer les politiques et les groupes dynamiques OCI IAM requis
-
Connectez-vous à la console OCI. Pour plus d'informations, voir Se connecter à Oracle Cloud.
-
Allez au groupe dynamique IAM OCI et créez un nouveau groupe dynamique en utilisant la règle suivante.
-
Allez aux politiques IAM OCI et créez une politique IAM OCI avec les énoncés suivants.
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 d'avis OCI, l'énoncé suivant doit être ajouté dans la politique IAM OCI pour accéder au sujet d'avis OCI.
allow dynamic-group dynamicgroup_name to use ons-topics in compartment CompartmentName
Tâche 2 : Créer un rapport d'utilisation des coûts programmés
-
Allez à Billing and Cost Management et sélectionnez Cost Management. Créez votre propre rapport personnalisé sur l'utilisation des coûts sous Analyse de coûts et cliquez sur Appliquer pour enregistrer le rapport.
-
Cliquez sur Rapports programmés et créez un nouveau rapport programmé avec vos informations de seau. Vous pouvez planifier cela selon vos besoins.
Selon le programme, le rapport sera automatiquement enregistré dans le seau de stockage d'objets OCI indiqué.
Tâche 3 : Créer et déployer le code de fonction
-
Pour créer une application, allez à Services de développement, cliquez sur Application et créez une application dans le réseau disponible.
-
Allez à fonctions/applications et créez une fonction. Cette fonction utilisera le groupe dynamique et la politique IAM OCI 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 de fonction
requirement.txt
et le fichierfunc.py
dans OCI Cloud Shell et écrivez le code. -
Copiez le code Python suivant dans
func.py
et le fichier texte dans le fichierrequirement.txt
.-
func.py
:-
Utilisation du service de transmission de messages OCI :
Note : Ajoutez les détails respectifs de l'ID courriel et du protocole 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!')
-
Utilisation du service d'avis pour OCI :
Note : Mettez à jour l'OCID du sujet (les étapes de création d'avis 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 code le plus récent à l'aide de la commande suivante dans OCI Cloud Shell.
fn -v deploy — app App_name
Une fois déployée, votre 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 Observabilité et gestion, cliquez sur Services d'événement, Règles et Créer une règle. Entrez la règle de correspondance comme illustré dans l'image suivante avec l'attribut comme ID seau.
Note : Le seau de stockage d'objets OCI créé doit être activé avec les événements d'objet émis.
-
Ajoutez une action comme illustré dans l'image suivante avec une fonction créée dans la tâche 2.
Maintenant, le déclencheur de la fonction est créé.
Tâche 5 : Configurer le courriel à l'aide du service de transmission de messages OCI ou des avis OCI
-
Utilisation du service de transmission de messages OCI (cela nécessite un domaine DNS public) :
-
Créez un domaine de courriel dans OCI. Allez à Services de développement et sélectionnez Transmission de messages. Créez le domaine de courriel conformément au DNS public disponible. Le nom du domaine de courriel doit être identique au nom du DNS public.
-
Configurez les clés de domaine identifiées (DKIM) et les expéditeurs approuvés dans le domaine de courriel en ajoutant des enregistrements dans vos enregistrements DNS publics. Pour plus d'informations sur la configuration et le domaine de courriel, voir Instructions étape par étape pour envoyer des courriels avec le service de transmission de messages pour OCI.
-
Créez les données d'identification SMTP pour votre utilisateur. Générez les données d'identification SMTP et enregistrez-les pour une utilisation future. Les mêmes ID courriel approuvé et données d'identification SMTP doivent être fournis dans le fichier
func.py
.
-
-
Utilisation du service d'avis OCI :
-
Pour créer un sujet, allez à Services de développement. Sous Intégration d'applications, cliquez sur Avis.
-
Dans la page Sujets, cliquez sur Créer un sujet et entrez les informations requises.
-
Une fois le sujet créé, créez un abonnement. Entrez le protocole
Email
et l'ID courriel requis. -
Un courriel sera reçu au point d'extrémité pour confirmer l'abonnement.
-
Test en cours
Chargez l'objet ou tout fichier dans le seau et le fonctionnement automatique sera déclenché à l'aide d'une règle d'événement.
Liens connexes
Confirmation
- Auteur - Samratha S P (Ingénieur infonuagique principal)
Autres ressources d'apprentissage
Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez 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
F96402-03
December 2024