Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever e obter 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.
Chamar a função personalizada do Oracle Cloud Infrastructure com o evento de notificação e publicar a mensagem atualizada na ferramenta de colaboração Lark
Introdução
Os clientes do Oracle Cloud Infrastructure (OCI) recebem notificações por meio de tópicos de Notificação do OCI inscritos, que abrangem eventos como eventos de instância, alarmes, anúncios da console e muito mais. Esses tópicos inscritos também suportam Funções do OCI como Alvos de Notificação, permitindo que os clientes chamem a função personalizada durante o evento de notificação e enviem detalhes de notificação atualizados para canais de comunicação que suportam a chamada de API. Neste tutorial, mostraremos como encaminhar essas notificações atualizadas para Lark, uma plataforma de colaboração empresarial com APIs de mensagens.
Usando uma Função OCI personalizada, você pode recuperar vários dados e executar ações. Veja a seguir alguns exemplos, como:
- Informações da Instância: Reúna detalhes sobre instâncias do OCI, incluindo metadados, forma e estados do ciclo de vida.
- Detalhes da Rede: Recupera informações de VNIC e sub-rede, incluindo endereços IP privados e públicos.
- Tags de Recursos: Acesse e modifique tags de recursos para melhor organização e rastreamento.
- Dimensionamento e Gerenciamento: Executa ações como iniciar, interromper ou redimensionar instâncias com base em condições específicas.
- Registro em Log e Métricas: Colete logs e métricas para fins de monitoramento e geração de relatórios personalizados.
- Grupos de Segurança e ACLs: Gerencie regras de grupos de segurança e listas de controle de acesso.
Este tutorial fornecerá um passo a passo abrangente de como acionar uma Função OCI personalizada em resposta ao evento de energia de uma instância, como STOP. Os usuários têm a flexibilidade de personalizar essa função e acioná-la com base em vários tópicos de Notificação do OCI inscritos. Para obter mais informações sobre o OCI Functions, consulte Visão Geral do OCI Functions.
Objetivo
O OCI Functions permite que você grave um código personalizado que pode ser chamado com base na notificação do OCI, no tópico de Notificação inscrito do OCI Announcement, no evento da Instância de Computação e muito mais. Neste tutorial, criamos uma função personalizada gravada em código Python que é chamada com base em um evento de Notificação e publicamos a mensagem atualizada na ferramenta de colaboração Lark usando um URL do webhook dentro do código. Isso fornece uma opção para incluir e atualizar as informações adicionais necessárias que podem ser consumidas pelo usuário final.
Pré-requisitos
- Uma tenancy ativa do OCI com a cota de permissões e recursos necessária para suportar a arquitetura.
- Familiaridade com notificação do OCI, Funções do OCI como serviço e serviços de nuvem.
- O usuário pode fazer download do código de função personalizado desta arquitetura aqui usando o URL da PAR do Object Storage válido até Dezembro de 2026.
Público-alvo
Este tutorial se destina a administradores e profissionais do Cloud Service Provider.
Arquitetura
Veja a seguir um exemplo de topologia de caso de uso e arquitetura de alto nível da solução.
Você pode consultar essa arquitetura quando quiser criar uma Função do OCI personalizada e chamá-la com base no evento de notificação. Você pode seguir uma série de tarefas descritas neste Tutorial para configurar e validar essa arquitetura.
Tarefa 1: Criar um Grupo Dinâmico
Os grupos dinâmicos permitem que você agrupe instâncias de computação do OCI como atores "principais" (semelhantes aos grupos de usuários).
Observação: Você precisa de privilégios de Administrador para criar grupos Dinâmicos.
-
Acesse a conta da tenancy da Console do OCI.
-
No menu de serviços, selecione Identidade e Segurança e, na seção Identidade, selecione Grupos Dinâmicos.
-
Clique em Criar Grupo Dinâmico.
-
Informe um Nome e uma Descrição significativos.
-
Na seção Regra 1, adicione a seguinte linha:
ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1', instance.compartment.id = 'ocid1.compartment.XXXXX'}
Observação:
- Substitua o ID do compartimento pelo ID do compartimento desejado.
- Você também pode incluir o OCID do recurso de função específico em seu grupo dinâmico.
-
Clique em Criar e seu grupo dinâmico deverá ser criado com sucesso, conforme mostrado na imagem a seguir.
Tarefa 2: Criar Política de OCI IAM de Grupo Dinâmico
O Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) permite controlar quem tem acesso aos recursos de nuvem. Para que essa arquitetura funcione, precisamos conceder acesso à função como serviço faas para a computação, redes e vários outros serviços.
-
No menu de serviços, selecione Identidade e Segurança e, na seção Identidade, selecione Políticas.
-
Clique em Criar Política.
-
Informe um Nome e uma Descrição apropriados e certifique-se de selecionar o compartimento correto (neste exemplo, usaremos o nome do compartimento
oc-demo
). -
Na seção Policy Builder, ative a opção Mostrar editor manual e cole as seguintes linhas:
Allow dynamic-group <dynamic_group_name> to read instances in compartment <compartment_name_path>
Allow dynamic-group <dynamic_group_name> to read vnics in compartment <compartment_name_path>
Allow dynamic-group <dynamic_group_name> to read vnic-attachments in compartment <compartment_name_path>
Observação: substitua o nome dynamic_group_name e compartment_name_path pelos valores desejados.
-
Clique em Criar e sua política deve ser criada com sucesso no nível raiz/do seu compartimento, conforme mostrado na imagem a seguir.
Tarefa 3: Criar um Repositório para armazenar a imagem de função personalizada
O serviço Container Registry permite armazenar, compartilhar e gerenciar imagens de contêiner (como imagens do Docker) em um registro gerenciado pela Oracle.
-
Na Console, abra o menu de serviço e clique em Serviços do Desenvolvedor. Em Contêineres, clique em Serviço Container Registry.
-
Clique em Criar Repositório.
-
Na caixa de diálogo Criar Repositório, especifique Compartimento e Nome do Repositório de sua escolha e deixe-o Privado.
-
Clique em Criar Repositório e seu registro de contêiner deverá ser criado com sucesso no compartimento especificado, conforme mostrado na imagem a seguir.
Tarefa 4: Criar uma Rede Virtual na Nuvem com Sub-rede para armazenar a função application.
Uma rede virtual na nuvem (VCN) é uma rede que você define no OCI. Inclui sub-redes, tabelas de roteamento e gateways.
Observação: se você já tiver uma VCN, a sub-rede criada anteriormente, poderá ignorar essa tarefa e prosseguir com a Tarefa 5.
-
Clique no menu de serviços próximo ao canto superior esquerdo da console web do OCI.
-
Em Rede, selecione Virtual Cloud Networks.
-
Na página Redes Virtuais na Nuvem, clique em Iniciar Assistente de VCN.
-
Selecione Criar VCN com Conectividade de Internet e clique em Iniciar Assistente de VCN.
-
Conclua a configuração da VCN e clique em Próximo
-
Clique em Criar e suas redes virtuais na nuvem com sub-redes devem ser criadas com sucesso, conforme mostrado na imagem a seguir.
Tarefa 5: Criar um Aplicativo para armazenar funções
-
Abra o menu de serviço e clique em Serviços ao Desenvolvedor. Em Funções, clique em Aplicativos.
-
Clique em Criar Aplicativo.
-
Na janela Criar Aplicativo, selecione o Nome do aplicativo (por exemplo, function-app), selecione a VCN criada na Tarefa 4 e selecione a sub-rede pública.
-
Clique em Criar e seu aplicativo de função deve ser criado com sucesso, conforme mostrado na imagem a seguir.
Tarefa 6: Implantar a função para armazenar funções
Esta etapa usará o arquivo zip que pode ser baixado na seção Pré-requisitos deste tutorial.
-
Navegue até a console de nuvem do OCI e clique em Ferramentas de Desenvolvedor, Cloud Shell.
-
Depois que você clicar no botão Iniciar Cloud Shell, uma nova janela de shell pequena será exibida no final da página. No canto superior direito dessa janela, clique no menu de roda dentada e selecione Fazer Upload.
-
Faça upload do arquivo zip disponível na seção Pré-requisitos deste tutorial e navegue até o diretório copiado.
-
Você verá o arquivo func.py conforme abaixo do qual criamos para garantir que possa ler o JSON de notificação e adicionar outros campos, como detalhes de Endereço IP, e usar uma mensagem atualizada para enviar a mensagem ao URL do webhook de Marca.
- parse_message: Função ler notificação JSON e atualizar mensagem
- get_ip_address: Função usando Computação, biblioteca do cliente de Rede para ler detalhes adicionais como endereço IP com base no OCID do recurso da instância, por exemplo.
- make_post: Função para fazer uma publicação no canal Lark usando o URL do webhook.
Observação:
- Estamos usando o sdk do OCI python, mas você pode personalizar com base em outro idioma suportado usando sdks go/java.
- Você deve atualizar o URL do webhook ou Lark ou outras ferramentas de colaboração, como o Slack.
- Você pode personalizar essa função com base em seus requisitos. Usamos determinado payload de notificação JSON para ler valores, mas você também pode usar JSON de anúncio na console ou outro JSON de evento.
### This is a sample code, End user can modify as needed ### import io import oci import json import logging import requests """ Read Notification Message Add IP address of Resource. """ def parse_message(body): notification = "" ocid = "" type = body["source"] description = body["eventType"] compartment_id = body["data"]["compartmentId"] compartment_name = body["data"]["compartmentName"] affected_resources = "" if len(body["data"]) > 0: signer = oci.auth.signers.get_resource_principals_signer() affected_resources = "Affected Resources: " ocid = body["data"]["resourceId"] notification_reason = body["data"]["additionalDetails"]["instanceActionType"] affected_resources += "\nResource OCID: " + ocid resource_ip_address = get_ip_address(signer, ocid) affected_resources += "\nResource Private IP Address: " + resource_ip_address notification = type + " " + "\n\n" + compartment_name + " - " + compartment_id + "\n\n" + description + "\n\n" + affected_resources + "\n\n" + notification_reason logging.getLogger().debug(notification) make_post(notification) """ Get Resource IP address based of resource OCID. """ def get_ip_address(signer, resource_id): compute_client = oci.core.ComputeClient(config={}, signer=signer) network_client = oci.core.VirtualNetworkClient(config={}, signer=signer) instance_details = compute_client.get_instance(instance_id=resource_id).data vnic_response = compute_client.list_vnic_attachments(compartment_id=instance_details.compartment_id, instance_id=resource_id) vnics = vnic_response.data for vnic in vnics: vnic_details = network_client.get_vnic(vnic_id=vnic.vnic_id).data private_ip = vnic_details.private_ip return private_ip """ Post a Message to Lark. You can also use OCI Vault/Secret to store Lark credentials and access them here. """ def make_post(post_text): url = "https://open.larksuite.com/open-apis/bot/v2/hook/XXXX" headers = { "Content-Type": "application/json" } req_body = { "msg_type": "text", "content": { "text": post_text } } payload = json.dumps(req_body) try: post_response=requests.post(url=url, data=payload, headers=headers) except Exception as e: logging.getLogger().error(e) return response_dict = json.loads(post_response.text) code = response_dict.get("StatusCode", -1) if code != 0: logging.getLogger().error("error sending post text, code: " + str(code)) return def to_bool(a): return True if a == "True" else False """This is the function entry point. ctx will contain function variables defined in OCI console, data contains the payload """ def handler(ctx, data: io.BytesIO = None): try: cfg = dict(ctx.Config()) for a in cfg: cfg[a]=to_bool(cfg[a]) except Exception as e: print('ERROR: Missing configuration keys', e, flush=True) logging.getLogger().debug(cfg) return 'error parsing config keys: ' + str(ex) try: raw_body = data.getvalue() body = json.loads(raw_body) logging.getLogger().info(body) parse_message(body) except (Exception, ValueError) as ex: logging.getLogger().error('error parsing json payload: ' + str(ex)) return 'error parsing json payload: ' + str(ex)
-
Implante a função usando o comando
fn deploy
para criar a imagem do docker da função e as dependências associadas no cloud shell. Você pode enviar a imagem ao registro especificado do Docker e implantar a função no OCI Functions no aplicativo criado anteriormente.fn -v deploy --app <app-name>
Por exemplo:
fn -v deploy --app function-app
Observação: Você pode exibir o arquivo
func.yaml
e ver os detalhes necessários da imagem do docker da função. -
Uma vez implantada, sua função deverá ser criada com sucesso, conforme mostrado na imagem a seguir.
Tarefa 7: Inscrever a Função em um tópico
-
Abra o menu de serviço e clique em Serviços ao Desenvolvedor. Em Integração de Aplicativos, clique em Notificações. Certifique-se de estar no compartimento correto.
-
Clique em Criar Tópico.
-
Defina um nome apropriado e clique em Criar.
-
Depois que o tópico for criado, selecione-o na lista de tópicos.
-
Na janela Tópicos, selecione Assinaturas no lado esquerdo em Recursos e clique em Criar Assinatura.
-
Na janela lateral Criar Assinatura, selecione o protocolo a ser Funções, selecione o compartimento, o aplicativo e a função que foram criados na Tarefa 6.
-
Clique em Criar; sua função deve ser inscrita com sucesso em um tópico, conforme mostrado na imagem a seguir.
Tarefa 8: Criar uma Instância e Regra de Evento de Notificação
Para validar a função nesta etapa, criaremos uma instância e um tópico de notificação de criação associado na Tarefa 7 para um evento como parado por instância.
-
Na Console, navegue até Compute, Instâncias para criar uma instância de computação.
-
Clique no ícone Criar Instância e forneça os detalhes necessários:
- Nome da Instância
- Compartimento da Instância
- Selecione o AD desejado
- Selecione a VCN de Rede e a Sub-rede Pública
- Copie-se sua chave ssh pública
- Clique em Criar.
-
Aguarde a instância exibir a execução e faça log-in na instância usando o comando a seguir.
ssh opc@<public ip> -i <private key>
-
Navegue até a janela Computação, Instâncias, Detalhes da Instância, Notificação para criar um evento de notificação.
-
Clique em Criar Notificação e selecione um modelo QuickStart como Alteração do Status da Instância para Interrompido.
-
Informe o Nome da Regra de Evento e selecione o tópico criado na Tarefa 7 e clique em Criar Notificação. Sua regra de evento de notificação deve ser criada com sucesso para um tópico inscrito, conforme mostrado na imagem a seguir.
Tarefa 9: Validar Regra de Evento de Notificação
Nesta etapa, você interromperá a instância que acionará o tópico de notificação associado. Você também pode incluir seu endereço de e-mail para ver o payload de notificação.
-
Navegue até a instância criada e clique em Parar.
-
Depois que a instância for interrompida, você deverá obter um e-mail por meio do tópico de notificação inscrito e a função deverá ser acionada.
-
Confirme se você recebeu um e-mail conforme mostrado na imagem a seguir.
-
Vá para o canal Marca que você usou para incluir o URL do webhook.
Observação: Se você notar essa mensagem de atualização com cuidado no e-mail recebido, com base na função personalizada, incluímos o endereço IP da instância usando o sdk do OCI.
-
[Opcional] Você também pode associar este tópico de notificação aos detalhes da função de atualização de acordo com os detalhes do anúncio da console. Você pode seguir esses documentos para aprender mais.
Observação: modifique o código de função personalizado para garantir que você esteja lendo o payload JSON correto e modifique adequadamente. Você pode usar o payload JSON de anúncio de amostra recebido das equipes de serviço.
Próximas Etapas
Este tutorial mostra ao usuário final como você pode usar uma função personalizada para ler o payload JSON de notificação e usar bibliotecas do OCI SDKs para atualizar esse payload e publicar mensagens em ferramentas comuns de colaboração, como Marcar. Você pode expandir essa função para adicionar mais detalhes, como Tags de Recurso, Detalhes da Rede e muito mais.
Links Relacionados
- Visão Geral do Vault
- Visão Geral do Serviço Monitoring
- Visão Geral dos Anúncios da Console
- Visão Geral do Container Registry
- Conceitos Básicos de Políticas
Confirmações
- Autor - Arun Poonia, Arquiteto de Soluções Principal
Mais Recursos de Aprendizagem
Explore outros laboratórios no site docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. 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.
Invoke OCI custom function with notification event and publish updated message to LARK collaboration tool
F85963-01
August 2023
Copyright © 2023, Oracle and/or its affiliates.