Pausar automaticamente clusters inativos
Avalie esse Artigo
A couple of years ago I wrote an article on how to pause and/or scale clusters using scheduled triggers. This article represents a twist on that concept, adding a wrinkle that will pause clusters across an entire organization based on inactivity. Specifically, I’m looking at the Database Access History to determine activity.
É importante observar esta limitação de registro:
Se um cluster experimentar um pico de atividade e gerar uma quantidade extremamente grande de mensagens de log, o Atlas poderá parar de coletar e armazenar novos logs por um período de tempo.
Portanto, esse script pode dar um falso positivo de que um cluster está inativo quando, na verdade, acontece exatamente o oposto. Dado, no entanto, que a intenção desse script é gerenciar ambientes inferiores, que não são de produção, não vejo os falsos positivos como uma grande preocupação.
A implementação usa um trigger. O trigger chama uma série de Atlas App Services, que usam as Atlas API para iterar sobre os projetos da organização e seus clusters associados, testando a inatividade do cluster (conforme explicado na introdução) e, finalmente, pausando o cluster se ele estiver realmente inativo.
Para chamar as API Administrativas do Atlas, primeiro você precisará de uma API Key com o roleProprietário da Organização. As API Keys são criadas no Access Manager, que você encontrará no menu Organização à esquerda:
ou na barra de menu na parte superior:
Clique em Criar chave de API. Dê uma descrição à chave e certifique-se de definir as permissões para Proprietário da organização:
Ao clicar em Avançar, você verá suas chaves Públicas e Privadas. Salve sua chave privada , pois o Atlas nunca mais a mostrará a você.
Como uma camada adicional de segurança, você também tem a opção de definir uma lista de acesso IP para essas chaves. Estou pulando esta etapa, para que minha chave funcione de qualquer lugar.
Como essa solução funciona em toda a sua organização do Atlas, eu gosto de hospedá-la em seu próprio projeto do Atlas dedicado.
O Atlas App Services fornece um poderoso backend de desenvolvimento de aplicativos como serviço. Para começar a usá-lo, basta clicar na aba App Services.
Você verá que o App Services oferece vários modelos para você começar. Para esse caso de uso, basta selecionar a primeira opção para Criar seu próprio aplicativo:
Em seguida, você verá opções para vincular uma fonte de dados, nomear seu aplicativo e escolher um modelo de implantação. A iteração atual desse utilitário não usa uma fonte de dados, então você pode ignorar essa etapa (o App Services criará um cluster gratuito para você). Você também pode deixar o modelo de implantação como padrão (Global), a menos que queira limitar o aplicativo a uma região específica.
Dei o nome de Atlas Cluster Automation ao aplicativo:
Nessa situação, você tem duas opções:
- Basta importar o aplicativo App Services e ajustar qualquer uma das funções para atender às suas necessidades.
- Crie o aplicativo do zero (pule para a próxima seção).
A extração depende da chave secreta da API, portanto, a importação falhará se ela não for configurada previamente.
Use o menu
Values
à esquerda para Criar um Segredo chamado AtlasPrivateKeySecret
contendo a chave privada que você criou anteriormente (o segredo não está entre aspas):npm install -g mongodb-realm-cli
Para configurar seu aplicativo com o realm-cli, você deve se conectar ao Atlas usando suas chaves de API:
Selecione o
App Settings
e copie o ID do seu aplicativo:Execute o seguinte
realm-cli push
comando no diretório em que você extraiu a exportação:Após a importação, substitua o `AtlasPublicKey' pelo valor da chave pública da sua API.
O trigger está programado para disparar a cada 30 minutos. Observe que a funçãopausaClusters que o trigger chama atualmente apenas registra a atividade do cluster. Isso é para que você possa monitorar e verificar se a função se comporta conforme o desejado. Quando estiver pronto, descomente a linha que chama a funçãopausaCluster:
Além disso, a funçãopauseClusters pode ser configurada para excluir projetos (como os dedicados a cargas de trabalho de produção):
Agora que você revisou o rascunho, como etapa final, implante o aplicativo do App Services.
Para entender o que está incluído no aplicativo, estas são as etapas para criá-lo do zero.
As funções que precisamos criar chamarão a API de administração do Atlas, portanto, precisamos armazenar nossas chaves públicas e privadas de API, o que vamos fazer usando Valores e segredos. O código de amostra que forneço referência a esses valores como
AtlasPublicKey
e AtlasPrivateKey
, portanto, use esses mesmos nomes, a menos que queira alterar o código em que eles são referenciados.Você encontrará
Values
no menu Build:Primeiro, crie um Valor,
AtlasPublicKey
, para sua chave pública (observe que a chave está entre aspas):Crie um Segredo,
AtlasPrivateKeySecret
, contendo sua chave privada (o segredo não está entre aspas):O Segredo não pode ser acessado diretamente, portanto, crie um segundo Valor,
AtlasPrivateKey
, que se vincule ao segredo:As quatro funções que precisam ser criadas são auto-explicativas, então não vamos fornecer um monte de explicações adicionais aqui.
Essa função autônoma pode ser testada no console do App Services para ver a lista de todos os projetos da sua organização.
Depois que
getProjects
é chamado, o trigger itera sobre os resultados, passando o projectId
para essa funçãogetProjectClusters
.Para testar essa função, você precisa fornecer um
projectId
. Por padrão, o console fornece "Hello world!", portanto, testo essa entrada e forneço alguns valores padrão para facilitar o teste.Essa função contém a lógica que determina se o cluster pode ser pausado.
A maior parte do trabalho nessa função é manipular o carimbo de data/hora no log de acesso ao banco de dados para que ele possa ser comparado com a hora atual e a janela de lookback.
Além de retornar verdadeiro (ativo) ou falso (inativo), a função registra suas descobertas, por exemplo:
Checking if cluster 'SA-SHARED-DEMO' has been active in the last 60 minutes
Como
getClusterProjects
, há um bloco que você pode usar para fornecer alguns ID de projeto de teste e nomes de cluster para facilitar o teste no console do App Services.Por fim, se o cluster estiver inativo, passamos o ID do projeto e o nome do cluster para
pauseCluster
. Essa função também pode retomar um cluster, embora esse recurso não seja utilizado neste caso de uso.Esta função será chamada por um trigger. Como não é possível passar um parâmetro para um gatilho agendado, ele usa uma janela de retrospectiva codificada de 60 minutos que você pode alterar para atender às suas necessidades. Você pode até armazenar o valor em um banco de dados do Atlas e construir uma interface do usuário para gerenciar sua configuração :-).
A função avaliará todos os projetos e clusters na organização em que está hospedada. Entendendo que há prováveis projetos ou clusters que você nunca quer pausado, a função também inclui uma array excludeProjects, onde você pode especificar uma lista de nomes de projetos a serem excluídos da avaliação.
Por fim, você notará que a chamada para
pauseCluster
foi comentada. Sugiro que você execute essa função por alguns dias e analise os logs do Trigger para verificar se ela se comporta como esperado.Sim, ainda estamos usando um scheduled trigger, mas desta vez o trigger será executado periodicamente para verificar se há inatividade do cluster. Agora, seus desenvolvedores que trabalham tarde da noite não terão mais o cluster pausado abaixo deles.
Como uma etapa final, você precisa implantar o aplicativo Atlas App Services.
A gênese deste artigo foi que um cliente, quando apresentado meu artigo anterior sobre agendamento de pausas de cluster, perguntou se o mesmo poderia ser alcançado com base na inatividade. É minha confiança que, com as APIs do Atlas, tudo pode ser alcançado. A única questão era o que constitui inatividade? Dado o batimento cardíaco e a replicação que ocorrem naturalmente, sempre há algum "activity" no cluster. Por fim, decidi pelo acesso ao banco de dados como guia. Com o tempo, essa métrica pode ser combinada com algumas métricas adicionais ou alterada para algo completamente diferente, mas os ossos do processo estão aqui.