Remarques :

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

Prérequis

Tâche 1 : configuration des stratégies OCI IAM et des groupes dynamiques requis

  1. Connectez-vous à la console OCI. Pour plus d'informations, reportez-vous à Connexion à Oracle Cloud.

  2. Accédez au groupe dynamique OCI IAM et créez un groupe dynamique avec la règle suivante.

    Créer un groupe dynamique

  3. 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

  1. 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.

    Créer un rapport sur les coûts

  2. Cliquez sur Rapports programmés et créez un rapport programmé avec vos informations de bucket. Vous pouvez le planifier selon vos besoins.

    Créer un rapport programmé

    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

  1. Pour créer une application, accédez à Services de développeur, cliquez sur Application et créez une application dans le réseau disponible.

  2. 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 fichier func.py dans OCI Cloud Shell, puis écrivez le code.

    Créer une fonction dans cloud shell et l'éditeur de code

  3. Copiez le code Python suivant dans func.py et le fichier texte dans le fichier requirement.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
      
  4. 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

  1. 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.

    Créer une règle d'événement

  2. Ajoutez Action comme indiqué dans l'image suivante avec la fonction créée dans la tâche 2.

    Action

    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

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.

Remerciements

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.