Nota

Imposta notifiche e-mail automatiche basate su eventi per report analisi costi mediante Oracle Cloud Native Framework

Introduzione

Ogni organizzazione che esegue i propri carichi di lavoro sul cloud è molto attenta a comprendere la spesa in termini di costi sul cloud e desidera segnalarla in modo significativo. Per questo, Oracle Cloud Infrastructure (OCI) fornisce una funzionalità che consente di creare report automatizzati in base ai costi e quindi di ottenere tali report in OCI Object Storage.

Per questi report sui costi, i team desiderano anche impostare l'automazione in modo che il team corrispondente riceva la notifica non appena il report viene generato. In questo modo, vorrebbero anche avere il collegamento alle relazioni nell'ambito della notifica. Puoi impostare tutta questa automazione utilizzando Oracle Cloud Native Framework.

Obiettivi

Prerequisiti

Task 1: impostare i criteri e i gruppi dinamici IAM OCI richiesti

  1. Eseguire il login a OCI Console, andare a Gruppo dinamico e creare un nuovo gruppo dinamico.

    Crea gruppo dinamico

  2. Immettere l'OCID compartimento nella regola 1. Le funzioni OCI devono esistere nello stesso compartimento.

    Imposta gruppo dinamico

  3. Andare ai criteri IAM OCI e creare un criterio con la seguente istruzione.

    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
    

    Nota:

    • Utilizzare criteri IAM più specifici in base al caso d'uso. Fare riferimento all'esempio riportato di seguito.

      • 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'}

Task 2: impostare un bucket di storage degli oggetti OCI e creare un report pianificato

  1. Creare un bucket utilizzando OCI Console. Utilizzeremo questo bucket per inviare i nostri report. Assicurarsi che il bucket creato sia privato in quanto ciò garantirà che il contenuto sia sicuro dall'accesso pubblico e che l'opzione Emetti eventi oggetto sia abilitata in questo bucket, in quanto ciò consentirà agli eventi di emettere quando viene eseguito il push di un nuovo oggetto.

    Crea bucket

  2. Andare a Gestione costi, Report schedulati e creare un report schedulato. Immettere Nome, Descrizione, Data inizio e Ricorrenza.

    Crea report pianificato

    Selezionare il bucket in cui si desidera pubblicare i report. Per selezionare il bucket dal menu a discesa, è necessario aggiungere il criterio come mostrato nell'immagine riportata di seguito in modo che il servizio di misurazione abbia accesso al bucket creato.

    Crea report pianificato

  3. Dopo aver creato il bucket e il report pianificato, puoi controllare la cronologia dei report eseguiti e vedrai anche che i report vengono pubblicati nel bucket di storage degli oggetti OCI selezionato.

    Report schedulato cronologia

Task 3: Creare un argomento di notifiche OCI e aggiungere una sottoscrizione

  1. Creare un argomento OCI Notifications necessario per inviare la notifica di posta elettronica. Andare a Notifiche, Argomento e creare un argomento.

    Crea argomento

  2. Creare una sottoscrizione nello stesso argomento e aggiungere un'e-mail a cui verrà inviata la notifica.

    Crea sottoscrizione

    Ora l'argomento Notifiche OCI è configurato.

Task 4: Creare e distribuire il codice funzione

Passare a funzioni/applicazioni e creare una funzione. Questa funzione utilizzerà il gruppo dinamico e il criterio IAM OCI per accedere al bucket di storage degli oggetti OCI ed eseguire l'operazione richiesta (creare l'URL PAR per il file di report pianificato e inviarvi notifiche) quando la funzione viene attivata dall'evento emesso.

Esistono una vasta gamma di approcci che possono essere utilizzati per sviluppare OCI Functions, con guide di avvio rapido che ti guideranno durante l'impostazione di un ambiente di sviluppo utilizzando OCI Cloud Shell, una virtual machine OCI o in esecuzione localmente. Le immagini riportate nel resto di questa guida mostreranno OCI Cloud Shell, ma uno di questi approcci è valido. Abbiamo usato Python per codificare la logica richiesta, ma è possibile utilizzare un altro linguaggio e modificare la logica in base alle esigenze.

  1. Per scrivere il codice, aprire i file requirement.txt e func.py in OCI Cloud Shell.

    Implementa funzione

  2. Di seguito è riportato il codice funzione che utilizza i principal delle risorse OCI in modo da non dover conservare le credenziali OCI. Ricordarsi di sostituire le variabili per le creazioni, ad esempio nome bucket, OCID argomento e così via.

    • 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. Aggiornare la funzione nel registro e distribuire il codice più recente utilizzando il comando seguente in OCI Cloud Shell.

    fn -v deploy — app reportsauto
    
  4. Una volta distribuita, la funzione è pronta per essere richiamata. È possibile provare a eseguire il test utilizzando il comando di richiamo della funzione e assicurarsi che la funzione funzioni come richiesto.

    DEBUG=1 fn invoke reportsauto your_app_name
    

    Nota:

    • OCI supporta i principali risorsa/istanza per evitare di fornire informazioni relative agli utenti durante l'esecuzione della funzione. Questo task è quindi necessario per assicurarsi che la funzione disponga del set di autorizzazioni corretto per chiamare le API, in caso contrario la funzione non funzionerà correttamente.

    • (Facoltativo) È inoltre possibile controllare la modalità Debug per la risoluzione dei problemi. Ad esempio, eseguire il comando seguente da OCI Cloud Shell per richiamare e testare la funzione se funziona come previsto.

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

Task 5: Impostazione delle regole degli eventi OCI

  1. Andare a OCI Console, fare clic su Integrazione applicazioni, Servizio eventi, Regole e Crea regola evento. Immettere una condizione regola e aggiungere una funzione creata nel task 4 come azione trigger.

  2. Immettere Nome visualizzato e Descrizione.

    Crea regola evento

  3. Nella sezione Condizione regola selezionare la prima condizione come Tipo di evento, Storage degli oggetti, Oggetto - Crea e un'altra condizione come Attributo, bucketName, demoBucket.

    Definisci regola evento

  4. Connettere l'evento alla funzione tramite la sezione Azioni. Selezionare Compartimento funzione, Applicazione funzione e la funzione distribuita nel task 4.

    Target regola evento

  5. Fare clic su Salva modifiche per salvare la regola evento. Questa operazione richiamerà la funzione quando la condizione corrisponde all'evento emesso dal bucket di storage degli oggetti OCI.

Conferma

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.

Per la documentazione del prodotto, visitare Oracle Help Center.