Note :
- Ce tutoriel nécessite l'accès à Oracle Cloud. Pour vous inscrire à un compte gratuit, voir Introduction au niveau gratuit d'Oracle Cloud Infrastructure.
- Il utilise des exemples de valeurs pour les données d'identification, la location et les compartiments Oracle Cloud Infrastructure. À la fin de votre laboratoire, remplacez ces valeurs par celles propres à votre environnement en nuage.
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
-
Configurer la génération de rapports pour les coûts OCI et générer des événements en fonction de la génération de rapports.
-
Configurez toute l'automatisation à l'aide des services gérés natifs en nuage sur OCI.
Préalables
-
Autorisations requises dans Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) pour créer un groupe dynamique, une politique, des seaux, des fonctions, configurer des événements et un service d'avis.
-
Accès à tous les composants requis pour voir leurs identificateurs Oracle Cloud (OCID) et d'autres informations.
-
Accéder à Cloud Shell pour OCI pour créer, déployer et appeler des fonctions.
Tâche 1 : Configurer les politiques IAM OCI et les groupes dynamiques requis
-
Connectez-vous à la console OCI, allez à Groupe dynamique et créez un groupe dynamique.
-
Entrez l'OCID du compartiment dans la règle 1. Le service des fonctions pour OCI doit exister dans le même compartiment.
-
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é
-
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é.
-
Allez à Gestion des coûts, Rapports programmés et créez un rapport programmé. Entrez Nom, Description, Date de début et Périodicité.
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éé.
-
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é.
Tâche 3 : Créer un sujet d'avis OCI et ajouter un abonnement
-
Créez un sujet d'avis OCI requis pour envoyer l'avis par courriel. Allez à Avis, Sujet et créez un sujet.
-
Créez un abonnement dans le même sujet et ajoutez un courriel auquel l'avis sera envoyé.
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.
-
Pour écrire le code, ouvrez le fichier
requirement.txt
etfunc.py
dans OCI Cloud Shell. -
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...")
-
-
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
-
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
-
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.
-
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, Stockage d'objets, Objet - Créer et une autre condition comme Attribut, bucketName, demoBucket.
-
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.
-
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.
Liens connexes
Remerciements
- Auteurs - Lovelesh Saxena (architecte principal de l'ingénierie logicielle), Mike Fung (architecte principal du nuage), Tim Lee (ingénieur du nuage du personnel)
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.
Set Up Events Based Automated Email Notifications for Cost Analysis Reports Using Oracle Cloud Native Framework
F99115-01
May 2024