Note :

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

Préalables

Tâche 1 : Configurer les politiques et les groupes dynamiques OCI IAM requis

  1. Connectez-vous à la console OCI. Pour plus d'informations, voir Se connecter à Oracle Cloud.

  2. Allez au groupe dynamique IAM OCI et créez un nouveau groupe dynamique en utilisant la règle suivante.

    Créer un groupe dynamique

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

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

    Créer un rapport sur les coûts

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

    Créer un rapport programmé

    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

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

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

    Créer une fonction dans l'interpréteur de commandes et l'éditeur de code en nuage

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

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

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

  2. Ajoutez une action comme illustré dans l'image suivante avec une fonction créée dans la tâche 2.

    Action

    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

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.

Confirmation

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.