Observação:

Configurar Notificações por E-mail Automatizadas com Base em Eventos para Relatórios de Análise de Custos Usando o Oracle Cloud Native Framework

Introdução

Toda organização que executa suas cargas de trabalho na nuvem está muito interessada em entender seus custos na nuvem e deseja reportá-los de maneira significativa. Para isso, o OCI (Oracle Cloud Infrastructure) fornece uma funcionalidade usando a qual você pode criar relatórios automatizados com base no custo e, em seguida, obter esses relatórios no OCI Object Storage.

Para esses relatórios de custos, as equipes também gostariam de configurar a automação de forma que a equipe correspondente receba a notificação assim que o relatório for gerado. Com isso, eles também gostariam de ter o link para os relatórios como parte da notificação. Você pode configurar toda essa automação usando o Oracle Cloud Native Framework.

Objetivos

Pré-requisitos

Tarefa 1: Configurar as políticas e os Grupos Dinâmicos Obrigatórios do OCI IAM

  1. Acesse a Console do OCI, vá para Grupo Dinâmico e crie um novo grupo dinâmico.

    Criar Grupo Dinâmico

  2. Informe o OCID do compartimento na Regra 1. Suas Funções do OCI devem existir no mesmo compartimento.

    Configurar Grupo Dinâmico

  3. Vá para políticas do OCI IAM e crie uma política com a instrução a seguir.

    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
    

    Observação:

    • Use uma política de IAM mais específica conforme adequado ao seu caso de uso. Veja o exemplo a seguir:

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

Tarefa 2: Configurar um Bucket do OCI Object Storage e Criar um Relatório Programado

  1. Crie um bucket usando a Console do OCI. Usaremos esse bucket para enviar nossos relatórios. Certifique-se de que o bucket que você criou seja privado, pois isso garantirá que seu conteúdo esteja protegido do acesso público, bem como que Emitir Eventos de Objeto esteja ativado nesse bucket, pois isso permitirá que os eventos sejam emitidos quando houver um novo objeto enviado.

    Criar Bucket

  2. Vá para Gerenciamento de Custos, Relatórios Programados e crie um relatório programado. Digite Nome, Descrição, Data inicial e Recorrência.

    Criar relatório programado

    Selecione o bloco no qual você deseja publicar seus relatórios. Para selecionar o bucket no menu drop-down, adicione a política conforme mostrado na imagem a seguir para que o serviço de medição tenha acesso ao bucket criado.

    Criar relatório programado

  3. Depois que o bucket e o relatório programado forem criados, você poderá verificar o histórico de relatórios executados e também verá que os relatórios são publicados no bucket selecionado do OCI Object Storage.

    Relatório de histórico programado

Tarefa 3: Criar um Tópico do OCI Notifications e Adicionar uma Assinatura

  1. Crie um tópico do OCI Notifications necessário para enviar a notificação por e-mail. Vá para Notificações, Tópico e crie um tópico.

    Criar Tópico

  2. Crie uma assinatura no mesmo tópico e adicione um e-mail para o qual a notificação será enviada.

    Criar Inscrição

    Agora, o tópico do OCI Notifications está configurado.

Tarefa 4: Criar e Implantar o Código da Função

Vá para funções/aplicativos e crie uma função. Essa função usará o grupo dinâmico e a política do OCI IAM para acessar o bucket do OCI Object Storage e executar a operação necessária (criar URL PAR para o arquivo de relatório programado e enviar notificações com ele) quando a função for acionada pelo evento emitido.

Há uma ampla gama de abordagens que podem ser usadas para desenvolver o OCI Functions, com guias de início rápido que orientam você na configuração de um ambiente de desenvolvimento usando o OCI Cloud Shell, uma máquina virtual do OCI ou em execução localmente. As imagens no restante deste guia mostrarão o OCI Cloud Shell, mas qualquer uma dessas abordagens é válida. Usamos o Python para codificar a lógica necessária, mas você pode usar outra linguagem e alterar a lógica conforme necessário.

  1. Para gravar o código, abra os arquivos requirement.txt e func.py no OCI Cloud Shell.

    Função de Implantação

  2. A seguir está o código de função, ele usa os controladores de recursos do OCI para que você não precise manter suas credenciais do OCI. Lembre-se de substituir as variáveis das suas criações, como nome do bucket, OCID do tópico 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. Atualize a função no registro e implante o código mais recente usando o comando a seguir no OCI Cloud Shell.

    fn -v deploy — app reportsauto
    
  4. Uma vez implantada, sua função está pronta para ser chamada. Você pode tentar testar usando o comando de chamada de função e garantir que a função esteja funcionando conforme necessário.

    DEBUG=1 fn invoke reportsauto your_app_name
    

    Observação:

    • O OCI suporta principais de recurso/instância para evitar o fornecimento de informações relacionadas ao usuário durante a execução da função. Portanto, essa tarefa é necessária para garantir que a função tenha o conjunto de permissões correto para chamar as APIs, sem a qual a função não funcionará corretamente.

    • (Opcional ) Você também pode verificar o modo Depurar para solução de problemas. Por exemplo: execute o seguinte comando do OCI Cloud Shell para chamar e testar a função se ela estiver funcionando conforme esperado.

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

Tarefa 5: Configurar Regras do OCI Events

  1. Vá para a Console do OCI, clique em Integração de Aplicativos, Serviço Events, Regras e Criar regra de evento. Insira uma condição de regra e adicione uma função criada na Tarefa 4 como a ação do acionador.

  2. Informe o Nome para Exibição e a Descrição.

    Criar Regra de Evento

  3. Na seção Condição da regra, selecione a primeira condição como Tipo de Evento, Object Storage, Objeto - Criar e outra condição como Atributo, bucketName, demoBucket.

    Definir Regra de Eventos

  4. Conecte o evento à função por meio da seção Ações. Selecione Compartimento de Função, Aplicativo de Função e a função implantada na Tarefa 4.

    Alvo da Regra de Eventos

  5. Clique em Salvar alterações para salvar a regra de evento. Isso chamará a função quando a condição corresponder ao evento emitido do bucket do OCI Object Storage.

Confirmação

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.