Como Agendar um START/STOP Automático no RDS

Como Agendar um START/STOP Automático no RDS

Introdução

Você pode ter vários motivos e razões diferentes para querer agendar um start e stop automático para o RDS. No meu caso eu estava criando um ambiente de QA onde não precisava que o RDS ficasse ligado o tempo todo para manter os custos reduzidos, felizmente a AWS disponibilizou uma opção no console para parar temporariamente durante 7 dias seu RDS, isso pode ser encontrado em:

  • Console AWS → RDS → DB Instance → Action → Stop

Embora isso já ajude para muitos casos, não se encaixava muito bem ao que eu precisava, pois eu não gostaria de ficar repetindo essa tarefa e esses cliques, então era hora de pensar em uma solução e automatizar esse processo, compartilho neste artigo como consegui atingir esse objetivo.


Tutorial

1- Acesse o console AWS → IAM → Policies → crie uma política conforme abaixo:

Name:

  • Defina um nome de sua preferência

  • Por exemplo:

    • rds-scheduler-qa-policy

Description:

  • Defina uma descrição de sua preferência

  • Por exemplo:

    • Policy that grants EventBridge permission to automatically start and stop RDS in the QA environment
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBProxyTargetGroups",
                "rds:StartDBCluster",
                "rds:DescribeDBInstanceAutomatedBackups",
                "rds:DescribeDBRecommendations",
                "rds:DescribeGlobalClusters",
                "rds:DescribeEngineDefaultParameters",
                "rds:DescribeRecommendations",
                "rds:DescribeDBClusterAutomatedBackups",
                "rds:DescribeDBProxyTargets",
                "rds:DownloadDBLogFilePortion",
                "rds:DescribeSourceRegions",
                "rds:StopDBCluster",
                "rds:DescribeDBSnapshots",
                "rds:DescribeDBSecurityGroups",
                "rds:StartDBInstance",
                "rds:DescribeReservedDBInstances",
                "rds:DescribeBlueGreenDeployments",
                "rds:DescribeValidDBInstanceModifications",
                "rds:DescribeDbSnapshotTenantDatabases",
                "rds:DescribeIntegrations",
                "rds:DescribeOrderableDBInstanceOptions",
                "rds:DescribeCertificates",
                "rds:DescribeOptionGroups",
                "rds:DescribeDBShardGroups",
                "rds:DescribeDBEngineVersions",
                "rds:DescribeDBSubnetGroups",
                "rds:DescribeExportTasks",
                "rds:DescribeTenantDatabases",
                "rds:DescribePendingMaintenanceActions",
                "rds:DescribeDBParameterGroups",
                "rds:DescribeDBClusterBacktracks",
                "rds:DescribeReservedDBInstancesOfferings",
                "rds:DescribeRecommendationGroups",
                "rds:DescribeDBInstances",
                "rds:DescribeEngineDefaultClusterParameters",
                "rds:DescribeDBProxies",
                "rds:DescribeDBParameters",
                "rds:DescribeEventCategories",
                "rds:DescribeDBProxyEndpoints",
                "rds:DescribeEvents",
                "rds:DescribeDBClusterSnapshotAttributes",
                "rds:DescribeDBClusterParameters",
                "rds:DescribeEventSubscriptions",
                "rds:DescribeDBLogFiles",
                "rds:StopDBInstance",
                "rds:DescribeDBSnapshotAttributes",
                "rds:ListTagsForResource",
                "rds:DescribeDBClusterSnapshots",
                "rds:DescribeOptionGroupOptions",
                "rds:DownloadCompleteDBLogFile",
                "rds:DescribeDBClusterEndpoints",
                "rds:DescribeAccountAttributes",
                "rds:DescribeDBClusters",
                "rds:DescribeDBClusterParameterGroups"
            ],
            "Resource": "*"
        }
    ]
}

2- Agora vá para IAM → Role → crie uma role conforme abaixo:

  • Name:

    • Defina um nome de sua preferência

    • Por exemplo:

      • rds-scheduler-qa-role
  • Description:

    • Defina uma descrição de sua preferência

    • Por exemplo:

      • Role with necessary EventBridge permissions to automatically start and stop RDS in the QA environment

Filtre por Customer managed e rds → selecione a política que criamos anteriormente

Edite a aba Trust Relashionship para conceder permissão ao EventBridge, conforme abaixo
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}


3- Agora vá para o console AWS → EventBridge → Rules → Create rule

4- Defina um nome e descrição de sua preferência, por exemplo:

  • Name:rds-name-start-qa-monday-to-friday-morning

  • Description:Rule that automatically starts QA environment RDS

  • Altere para a opção Schedule

  • Clique em Continue in EventBridge Scheduler

5- Altere para Recurring schedule → defina uma expressão cron de sua preferência

Por exemplo, eu gostaria de iniciar o RDS de segunda a sexta as 9 horas (horário de Brasília)

Por exemplo, para executar de segunda a sexta às 09 horas (UTC -3), isso seria:

00 9 ? * MON-FRI *
  • 00: é o minuto em que o cron será executado. Neste caso, o que significa que a tarefa será executada quando o relógio marcar exatamente 0 minutos.

  • 9: é a hora em que o cron será executado. Neste caso, o que significa que a tarefa será executada às 9 horas. (UTC -3)

  • ?: isso indica que não estamos definindo um dia específico do mês. A tarefa será executada independentemente do dia do mês.

  • *: isso indica que a tarefa será executada em todos os meses. Não estamos definindo um mês específico.

  • MON-FRI: especifica os dias da semana em que a tarefa será executada. Neste caso, a tarefa será executada de segunda a sexta-feira.

  • *: indica que a tarefa será executada em todos os anos. Não estamos definindo um ano específico.

Uma vez compreendido o formato do cron, lembre-se de ajustar seu Time Zone e preencher de acordo com suas necessidades.

6- Defina a opção Flexible Time Window, essa opção é útil quando você quiser que o EventBridge funcione dentro do tempo dessa janela que você definiu, pense nisso em casos que as tasks ou targets ainda não estão prontos, desta forma você define um intervalo de tempo para que isso seja feito.

Por exemplo, se eu definisse o cron as 9 horas e um Flexible Time Window de 15 minutos, na prática significa que o EventBridge Scheduler garantirá que ele seja executado dentro deste período, ou seja entre 9:00 às 9:15, mas isso não significa que ele será executado as 9:15, mas sim que será acionado dentro deste intervalo a qualquer momento a partir do horário agendado (no exemplo as 9:00 + flexible time window).

Isso é muito bom para distribuir as execuções nesta janela de tempo, reduzindo os impactos de várias solicitações ao mesmo tempo em um ambiente grande.

Como neste meu caso isso não é um requisito necessário, defino como Off

7- Você também pode definir uma data de início e término, como eu espero que a expressão cron funcione e não planejo inserir uma data para que esse cron comece a funcionar ou terminar, não preencho e clico em Next

8- Agora altere para All APIs → pesquise por rds → selecione a opção RDS

9- Agora pesquise por start → selecione a opção StartDBInstance

10- Como nessa regra estamos querendo iniciar o RDS, defino o campo DbInstanceIdentifier com o nome da minha instância RDS

{
  "DbInstanceIdentifier": "<RDS-NAME>"
}

11- Deixo a opção Schedule habilitada

12- Não defino nenhuma ação após o agendamento ser executado, pois neste caso de uso não planejo excluir o agendamento

13- Agora você pode definir uma DLQ (Dead Letter Queue), isso seria uma fila SQS para armazenar os eventos que falharam, aqui ainda existem dois tipos:

  • Recuperáveis

    • Se houver uma falha ou uma entrega mal sucedida no target (que no nosso caso é a API StartDBInstance do RDS), por padrão o EventBridge tentará fazer ela novamente por 24 horas e até 185 vezes.
  • Não recuperáveis

    • Se houver um erro não recuperável, como AccessDenied por exemplo, isso não será repetido pelo EventBridge, mas ele poderá adicionar se você quiser isso em uma fila DLQ para ser tratado ou processado posteriormente

Mesmo desabilitando a opção Retry Policy, ainda sim o EventBridge tentará repetir para eventos recuperáveis por 24 horas e até 185 vezes. Isso é um comportamento padrão, você configurando ou não.

Para este tutorial, defino isso como Disable, mas se isso for importante para você, este é o momento de configurar de acordo com suas preferências:

14- Não defino nenhuma criptografia

15- Seleciono a Role que criamos no início do tutorial

16- Clico em Create


Pronto! 😄

Porém criamos até agora apenas para iniciar o RDS, ainda falta uma parte importante que seria parar o RDS, para isso basta repetir os mesmos passos, porém mudando o request da API para StopDBInstance

E novamente passar o nome correto do seu RDS substituindo <RDS-NAME>

{
  "DbInstanceIdentifier": "<RDS-NAME>"
}

Limitações

  • O Event Bridge é capaz de fazer um único request por vez, isso significa que você não pode adicionar várias instâncias RDS no mesmo request, e isso pode gerar duplicação de trabalho, pois deverá repetir este passo a passo para cada instância do RDS que desejar.

  • O RDS e o Event Bridge precisam estar na mesma região.


Conclusão

Pronto! 😄

Agora sim temos todo o nosso objetivo completo.

Vimos neste artigo um tutorial passo a passo para iniciar e parar o RDS que faz:

  1. O EventBridge Scheduler configurado com uma expressão cron que inicia o RDS enviando uma chamada API para o StartDBInstance do RDS

  2. O EventBridge Scheduler configurado com uma expressão cron que para o RDS enviando uma chamada API para o StopDBInstance do RDS


Por fim, depois que o cron for executado em seu horário definido, poderemos ver no RDS a instância pausada ou iniciada:

Lembre-se de excluir todos os recursos ao final para não obter cobranças indesejadas e manter sua conta AWS limpa e organizada.
Espero que essas informações tenham sido úteis para você!