Note :

Configurer des avis par courriel automatisés basés sur des événements pour les rapports d'analyse de coûts à l'aide d'Oracle Cloud Native Framework

Présentation

Toutes les organisations qui exécutent leurs charges de travail sur le nuage souhaitent comprendre leurs dépenses en matière de coûts dans le nuage et produire des rapports pertinents. Pour cela, Oracle Cloud Infrastructure (OCI) fournit une fonctionnalité à l'aide de laquelle vous pouvez créer des rapports automatisés en fonction du coût, puis obtenir ces rapports dans le service de stockage d'objets pour OCI.

Pour ces rapports de coûts, les équipes souhaitent également configurer l'automatisation de manière à ce que l'équipe correspondante reçoive la notification dès que le rapport est généré. Ainsi, ils aimeraient également avoir le lien vers les rapports dans le cadre de la notification. Vous pouvez configurer toute cette automatisation à l'aide d'Oracle Cloud Native Framework.

Objectifs

Préalables

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

  1. Connectez-vous à la console OCI, allez à Groupe dynamique et créez un groupe dynamique.

    Créer un groupe dynamique

  2. Entrez l'OCID du compartiment dans la règle 1. Le service des fonctions pour OCI doit exister dans le même compartiment.

    Configurer le groupe dynamique

  3. Allez aux politiques IAM OCI et créez une politique avec l'énoncé suivant.

    allow dynamic-group dynamic_group_name to manage ons-family in compartment compartment_name
    
    allow dynamic-group dynamic_group_name to manage object-family in compartment compartment_name
    

    Note :

    • Utilisez une politique IAM plus spécifique selon votre cas d'utilisation. Voici un exemple :

      • allow dynamic-group dynamic_group_name to use ons-topics in compartment compartment_name where request.operation = 'PublishMessage'
      • allow dynamic-group dynamic_group_name to manage buckets in compartment compartment_name where all {request.operation = 'CreatePreauthenticatedRequest', target.bucket.name = 'bucket_name'}

Tâche 2 : Configurer un seau de stockage d'objets OCI et créer un rapport programmé

  1. Créez un seau à l'aide de la console OCI. Nous utiliserons ce seau pour pousser nos rapports. Assurez-vous que le seau que vous avez créé est privé, car cela garantit que votre contenu est protégé contre l'accès public et que l'option Émettre des événements d'objet est activée sur ce seau, car cela permettra aux événements d'émettre lorsqu'un nouvel objet est poussé.

    Créer un seau

  2. Allez à Gestion des coûts, Rapports programmés et créez un rapport programmé. Entrez Nom, Description, Date de début et Périodicité.

    Créer un rapport programmé

    Sélectionnez le seau dans lequel vous voulez publier vos rapports. Pour sélectionner le seau dans le menu déroulant, vous devez ajouter la politique indiquée dans l'image suivante afin que le service de mesure ait accès au seau créé.

    Créer un rapport programmé

  3. Une fois le seau et le rapport programmé créés, vous pouvez vérifier l'historique des rapports exécutés et vous verrez également que les rapports sont publiés dans le seau de stockage d'objets OCI sélectionné.

    Rapport d'historique programmé

Tâche 3 : Créer un sujet d'avis OCI et ajouter un abonnement

  1. Créez un sujet d'avis OCI requis pour envoyer l'avis par courriel. Allez à Avis, Sujet et créez un sujet.

    Créer un sujet

  2. Créez un abonnement dans le même sujet et ajoutez un courriel auquel l'avis sera envoyé.

    Créer un abonnement

    Maintenant, le sujet des avis OCI est configuré.

Tâche 4 : Créer et déployer le code de fonction

Allez à fonctions/applications et créez une fonction. Cette fonction utilisera le groupe dynamique et la politique OCI IAM pour accéder au seau de stockage d'objets OCI et effectuer l'opération requise (créer l'URL de demande préauthentifiée pour le fichier de rapport programmé et envoyer des avis avec celui-ci), lorsque la fonction est déclenchée PAR l'événement émis.

Il existe un large éventail d'approches qui peuvent être utilisées pour développer le service des fonctions pour OCI, avec des guides de démarrage rapide qui vous guident tout au long de la configuration d'un environnement de développement à l'aide d'OCI Cloud Shell, d'une machine virtuelle OCI ou d'une exécution locale. Les images du reste de ce guide afficheront OCI Cloud Shell, mais l'une de ces approches est valide. Nous avons utilisé Python pour coder la logique requise, mais vous pouvez utiliser un autre langage et modifier la logique si nécessaire.

  1. Pour écrire le code, ouvrez le fichier requirement.txt et func.py dans OCI Cloud Shell.

    déployer la fonction

  2. Le code de fonction suivant est utilisé par les principaux de ressource OCI afin que vous n'ayez pas à conserver vos données d'identification OCI. N'oubliez pas de remplacer les variables pour vos créations, telles que le nom du seau, l'OCID du sujet, etc.

    • requirements.txt.

      fdk>=0.1.71
      oci>=2.112.0
      
    • func.yaml.

      schema_version: 20180708
      name: reportsauto
      version: 0.0.6
      runtime: python
      build_image: fnproject/python:3.11-dev
      run_image: fnproject/python:3.11
      entrypoint: /python/bin/fdk /function/func.py handler
      memory: 256
      
    • func.py.

      import io
      import json
      import logging
      import oci
      from datetime import datetime
      
      from fdk import response
      
      
      def handler(ctx, data: io.BytesIO = None):
          try:
              body = json.loads(data.getvalue())
              logging.getLogger().info(body.get("eventType"))
              logging.getLogger().info(body.get("data").get("resourceName"))
          except (Exception, ValueError) as ex:
              logging.getLogger().info('error parsing json payload: ' + str(ex))
      
          logging.getLogger().info("Inside Python Hello World function")
          initiateFn(body.get("data").get("resourceName"))
          return response.Response(
              ctx, response_data=json.dumps(
                  {"message": "Function Executed!"}),
              headers={"Content-Type": "application/json"}
          )
      
      def initiateFn(uploaded_file):
          logging.getLogger().info("Reached initiate function...")
      
          signer = oci.auth.signers.get_resource_principals_signer()
          object_storage_client = oci.object_storage.ObjectStorageClient(config={}, signer=signer)
          namespace_name="orasenatdplt01"
          bucket_name="demobucket"
      
          now = datetime.now()
          par_name = "PAR_Request_" + str(now).split('.')[0].replace(" ", "_").replace(":", "_").replace("-", "_")
          create_preauthenticated_request_response = object_storage_client.create_preauthenticated_request(
              namespace_name=namespace_name,
              bucket_name=bucket_name,
              create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
                  name=par_name,
                  access_type="ObjectRead",
                  time_expires=datetime.strptime(
                      "2037-06-05T04:25:22.344Z",
                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                  object_name=uploaded_file))
      
          callNotificationAPI(create_preauthenticated_request_response.data)
      
      # Function to call Notification API as soon as an object push is detected
      def callNotificationAPI(parData):
          logging.getLogger().info("Trigger notification as object push is detected...")
          topicOcid = "ocid1.onstopic.oc1.iad.amaaaaxxxxxxxxxamn4"
          signer = oci.auth.signers.get_resource_principals_signer()
          ons_client = oci.ons.NotificationDataPlaneClient(config={}, signer=signer)
          publish_message_response = ons_client.publish_message(
              topic_id=topicOcid,
              message_details=oci.ons.models.MessageDetails(
                  body="OCI Notification Service - Cost Report File is created: " + str(parData.full_path),
                  title="OCI Notification Service - Cost Report File is created"),
              message_type="RAW_TEXT")
          logging.getLogger().info("Triggered notification as object push is detected...")
      
  3. 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 reportsauto
    
  4. Une fois déployée, votre fonction est prête à être appelée. Vous pouvez essayer de tester à l'aide de la commande d'appel de fonction et vous assurer que la fonction fonctionne comme nécessaire.

    DEBUG=1 fn invoke reportsauto your_app_name
    

    Note :

    • OCI prend en charge les principaux de ressource/instance pour éviter de fournir des informations relatives aux utilisateurs lors de l'exécution de la fonction. Cette tâche est donc nécessaire pour s'assurer que la fonction dispose des autorisations appropriées pour appeler les API, faute de quoi la fonction ne fonctionnera pas correctement.

    • (Facultatif ) Vous pouvez également vérifier le mode de débogage pour le dépannage. Par exemple, exécutez la commande suivante à partir de Cloud Shell pour OCI pour appeler et tester la fonction si elle fonctionne comme prévu.

      DEBUG=1 fn invoke e2e-function-demo e2e-fn-streaming
      

Tâche 5 : Configurer les règles d'événements OCI

  1. Allez à la console OCI, cliquez sur Intégration d'applications, sur Service d'événements, sur Règles et sur Créer une règle d'événement. Entrez une condition de règle et ajoutez une fonction créée dans la tâche 4 en tant qu'action de déclenchement.

  2. Entrez le nom d'affichage et la description.

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

  3. Dans la section Condition de règle, sélectionnez la première condition comme Type d'événement, Stockage d'objets, Objet - Créer et une autre condition comme Attribut, bucketName, demoBucket.

    Définir une règle d'événement

  4. Connectez l'événement à la fonction au moyen de la section Actions. Sélectionnez Compartiment de la fonction, Application de fonction et la fonction déployée dans la tâche 4.

    Cible de la règle d'événement

  5. Cliquez sur enregistrer les modifications pour enregistrer la règle d'événement. Cette action appellera la fonction lorsque la condition correspond à l'événement émis à partir du seau de stockage d'objets OCI.

Remerciements

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur 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.