Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever em uma conta gratuita, consulte Conceitos básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
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
-
Configure a geração de relatórios para custos da OCI e gere eventos com base na geração de relatórios.
-
Configure toda a automação usando serviços gerenciados nativos da nuvem no OCI.
Pré-requisitos
-
Permissões necessárias no Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) para criar grupo dinâmico, política, buckets, funções, configurar eventos e serviço de notificação.
-
Acesso a todos os componentes necessários para exibir seus OCIDs (Oracle Cloud Identifiers) e outras informações.
-
Acesso ao OCI Cloud Shell para criar, implantar e chamar funções.
Tarefa 1: Configurar as políticas e os Grupos Dinâmicos Obrigatórios do OCI IAM
-
Acesse a Console do OCI, vá para Grupo Dinâmico e crie um novo grupo dinâmico.
-
Informe o OCID do compartimento na Regra 1. Suas Funções do OCI devem existir no mesmo compartimento.
-
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
-
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.
-
Vá para Gerenciamento de Custos, Relatórios Programados e crie um relatório programado. Digite Nome, Descrição, Data inicial e Recorrência.
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.
-
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.
Tarefa 3: Criar um Tópico do OCI Notifications e Adicionar uma Assinatura
-
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.
-
Crie uma assinatura no mesmo tópico e adicione um e-mail para o qual a notificação será enviada.
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.
-
Para gravar o código, abra os arquivos
requirement.txt
efunc.py
no OCI Cloud Shell. -
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...")
-
-
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
-
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
-
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.
-
Informe o Nome para Exibição e a Descrição.
-
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.
-
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.
-
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.
Links Relacionados
Confirmação
- Autores - Lovelesh Saxena (Arquiteto Principal de Engenharia de Software), Mike Fung (Arquiteto Principal de Nuvem Mestre), Tim Lee (Engenheiro de Nuvem da Equipe)
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.
Set Up Events Based Automated Email Notifications for Cost Analysis Reports Using Oracle Cloud Native Framework
F99120-01
May 2024