Remarques :
- Ce tutoriel nécessite un accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, reportez-vous à Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeur pour les informations d'identification, la location et les compartiments Oracle Cloud Infrastructure. A la fin de l'exercice, remplacez ces valeurs par des valeurs propres à votre environnement cloud.
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
-
Configurez la génération de rapports pour les coûts OCI et générez des événements en fonction de la génération de rapports.
-
Configurez toute l'automatisation à l'aide de services gérés natifs du cloud sur OCI.
Prérequis
-
Droits d'accès requis dans Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) pour créer des groupes dynamiques, des stratégies, des buckets, des fonctions, configurer des événements et un service de notification.
-
Accès à tous les composants requis pour afficher leurs identificateurs Oracle Cloud (OCID) et d'autres informations.
-
Accès à OCI Cloud Shell pour créer, déployer et appeler des fonctions.
Tâche 1 : configuration des stratégies OCI IAM et des groupes dynamiques requis
-
Connectez-vous à la console OCI, accédez à Groupe dynamique et créez-en un.
-
Entrez l'OCID de compartiment dans la règle 1. Vos fonctions OCI doivent exister dans le même compartiment.
-
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é
-
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é.
-
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.
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éé.
-
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é.
Tâche 3 : créer un sujet Notifications OCI et ajouter un abonnement
-
Créez un sujet OCI Notifications requis pour envoyer la notification par courriel. Accédez à Notifications, Sujet et créez un sujet.
-
Créez un abonnement dans la même rubrique et ajoutez un courriel auquel la notification sera envoyée.
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.
-
Pour écrire le code, ouvrez les fichiers
requirement.txt
etfunc.py
dans OCI Cloud Shell. -
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...")
-
-
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
-
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
-
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.
-
Entrez le nom d'affichage et la description.
-
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.
-
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.
-
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.
Liens connexes
Remerciements
- Auteurs - Lovelesh Saxena (architecte principal en ingénierie logicielle), Mike Fung (architecte principal en cloud), Tim Lee (ingénieur en cloud personnel)
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.
Set Up Events Based Automated Email Notifications for Cost Analysis Reports Using Oracle Cloud Native Framework
F99116-01
May 2024