Remarques :

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

Introduction

Toutes les entreprises qui exécutent leurs charges de travail sur le cloud sont très soucieuses de comprendre leurs dépenses en matière de cloud et souhaitent les signaler de manière significative. Pour cela, Oracle Cloud Infrastructure (OCI) fournit une fonctionnalité permettant de créer des rapports automatisés en fonction des coûts, puis d'obtenir ces rapports dans OCI Object Storage.

Pour ces rapports sur les 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é. Avec cela, 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érequis

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

  1. Connectez-vous à la console OCI, accédez à Groupe dynamique et créez-en un.

    Créer un groupe dynamique

  2. Entrez l'OCID de compartiment dans la règle 1. Vos fonctions OCI doivent exister dans le même compartiment.

    Configurer un groupe dynamique

  3. Accédez aux stratégies OCI IAM et créez une stratégie avec l'instruction suivante.

    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
    

    Remarque :

    • Utilisez une stratégie IAM plus spécifique selon votre cas d'emploi. 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 bucket OCI Object Storage et créer un rapport programmé

  1. Créez un bucket à l'aide de la console OCI. Nous utiliserons ce bucket pour publier nos rapports. Assurez-vous que le bucket que vous avez créé est privé, car cela garantira que votre contenu est sécurisé contre l'accès public et que l'option Emettre des événements d'objet est activée sur ce bucket, car cela permettra aux événements d'être émis lorsqu'un nouvel objet est propagé.

    Créer un bucket

  2. Accédez à Gestion des coûts, Rapports programmés et créez un rapport programmé. Saisissez Nom, Description, Date de début et Récurrence.

    Créer un rapport programmé

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

    Créer un rapport programmé

  3. Une fois le bucket et le rapport programmé créés, vous pouvez vérifier l'historique des rapports exécutés. Vous verrez également les rapports publiés dans le bucket OCI Object Storage sélectionné.

    Rapport planifié d'historique

Tâche 3 : créer un sujet Notifications OCI et ajouter un abonnement

  1. Créez un sujet OCI Notifications requis pour envoyer la notification par courriel. Accédez à Notifications, Sujet et créez un sujet.

    Créer un sujet

  2. Créez un abonnement dans la même rubrique et ajoutez un courriel auquel la notification sera envoyée.

    Créer un abonnement

    Désormais, le sujet Notifications OCI est configuré.

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

Accédez à functions/applications et créez une fonction. Cette fonction utilisera le groupe dynamique et la stratégie OCI IAM pour accéder au bucket OCI Object Storage et effectuer l'opération requise (créer une URL de demande pré-authentifiée pour le fichier de rapport programmé et envoyer des notifications avec ce dernier) 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 OCI Functions, 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 aucune de ces approches n'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 les fichiers requirement.txt et func.py dans OCI Cloud Shell.

    Activer la fonction

  2. Le code de fonction suivant est utilisé pour les principaux de ressource OCI afin que vous n'ayez pas à conserver vos informations d'identification OCI. N'oubliez pas de remplacer les variables de vos créations, telles que le nom du bucket, l'OCID de 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 dernier code à l'aide de la commande suivante sur OCI Cloud Shell.

    fn -v deploy — app reportsauto
    
  4. Une fois déployée, la fonction est prête à être appelée. Vous pouvez essayer d'effectuer un test à l'aide de la commande d'appel de fonction et vous assurer que la fonction fonctionne comme requis.

    DEBUG=1 fn invoke reportsauto your_app_name
    

    Remarque :

    • 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 droits d'accès appropriés pour appeler les API, faute de quoi la fonction ne fonctionnera pas correctement.

    • (Facultatif) Vous pouvez également vérifier le mode Débogage pour le dépannage. Par exemple, exécutez la commande suivante à partir d'OCI Cloud Shell 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 des règles d'événements OCI

  1. Accédez à la console OCI, cliquez sur Intégration d'application, Service d'événements, Règles et 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éclencheur.

  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, Object Storage, 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 via la section Actions. Sélectionnez Compartiment de fonction, Application de fonction et la fonction déployée dans la tâche 4.

    Cible de règle d'événement

  5. Cliquez sur Enregistrer les modifications pour enregistrer la règle d'événement. Cette opération appelle la fonction lorsque la condition correspond à l'événement émis à partir du bucket OCI Object Storage.

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.