Como posso interromper uma instância do Amazon RDS por mais de sete dias?

Data da última atualização: 18/10/2021

Quero interromper um Amazon Relational Database Service (Amazon RDS) por mais de sete dias.

Breve descrição

Você pode iniciar e interromper suas instâncias do Amazon RDS facilmente em alguns minutos. Este recurso oferece suporte à economia de custos para bancos de dados que não precisam estar em execução o tempo todo. Você pode interromper uma instância de banco de dados por até sete dias. Se você não iniciar manualmente a instância de banco de dados após sete dias, a instância será iniciada automaticamente. Isso acontece para que a instância não fique atrasada em nenhuma atualização de manutenção necessária para o hardware, sistema operacional subjacente ou versão do mecanismo de banco de dados.

Para interromper a instância do RDS por mais de sete dias sem perder as atualizações de manutenção necessárias, faça o seguinte:

  1. Configure as permissões do AWS Identity Access Management (IAM) para permitir que o AWS Lambda faça o seguinte: inicie a instância. Interrompa a instância. Recupere as informações sobre a instância.
  2. Adicione etiquetas para instâncias do RDS que você deseja iniciar e interromper automaticamente.
  3. Crie uma função do Lambda para iniciar a instância de banco de dados.
  4. Crie uma função do Lambda para interromper a instância de banco de dados.
  5. Crie uma agenda para fazer o seguinte: inicie uma instância de banco de dados no início da janela de manutenção semanal. Interrompa uma instância de banco de dados no final da janela de manutenção.

Resolução

Configurar permissões do IAM

Crie uma política do IAM para permitir que o Lambda inicie e pare a instância e recupere as informações sobre a instância.

1.    Abra o console do IAM.

2.    No painel de navegação, selecione Políticas.

3.    Escolha Criar política.

4.    Clique na guia JSON.

5.    Copie a política a seguir e cole a política na guiaJSON para conceder as permissões de IAM necessárias:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "rds:StartDBCluster",
                "rds:StopDBCluster",
                "rds:ListTagsForResource",
                "rds:DescribeDBInstances",
                "rds:StopDBInstance",
                "rds:DescribeDBClusters",
                "rds:StartDBInstance"
            ],
            "Resource": "*"
        }
    ]
}

6.    Escolha Próximo: etiquetas.

7.    (Opcional) para adicionar uma etiqueta, escolha Adicionar etiqueta e insira os valores apropriados para os campos Chave e Valor – opcional.

8.    Selecione Próximo: revisar.

9.    Na página Revisar política, em Nome, insira o nome da política. Consulte a seção Resumo para ver as permissões concedidas pela política.

10.    Escolha Criar política.

Para obter mais informações, consulte Criação de políticas na guia JSON.

Crie uma função do IAM e, em seguida, anexe as políticas necessárias

  1. Abra o console do IAM.
  2. No painel de navegação, escolha Funções.
  3. Escolha Criar função.
  4. Para Selecionar tipo de entidade confiável, escolha Serviço da AWS.
  5. Em Ou selecione um serviço para exibir seus casos de uso, escolha Lambda.
  6. Clique em Próximo: permissões.
  7. Para Políticas de filtro, insira o nome da política criada na seção anterior. Quando a política que você criou for exibida, selecione a política. Para Políticas de filtro, insira AWSLambdaBasicExecutionRole. Quando a política gerenciada AWSLambdaBasicExecutionRole que você criou for exibida, escoha a política.
  8. Escolha Próximo: etiquetas.
  9. (Opcional) para adicionar uma etiqueta, insira os valores apropriados para os campos Chave e Valor (opcional).
  10. Selecione Próximo: revisar.
  11. Na página Criar função, em Nome da função, insira o nome da função que você está criando.
  12. Escolha Criar função.

Para obter mais informações, consulte Criar uma função para um serviço da AWS (console).

Adicionar etiquetas para instâncias de banco de dados

  1. Abra oconsole do Amazon RDS.
  2. No painel de navegação, selecione Bancos de dados.
  3. Escolha a instância de banco de dados que você deseja iniciar e interromper automaticamente.
  4. Na seção de detalhes, role para baixo até a seção Etiquetas.
  5. Na guia Etiquetas, escolha Adicionar. Para a chave Etiqueta, insirainício automático. Para Valor, insira sim. Escolha Adicionar para salvar as alterações.
  6. Escolha Adicionar novamente. Para a chave Etiqueta, insira parada automática. Para Valor, insira sim. Escolha Adicionar para salvar as alterações.

Para obter mais informações, consulte Adicionar, listar e remover etiquetas.

Crie uma função do Lambda para iniciar as instâncias de banco de dados marcadas

1.    Abra o console do Lambda.

2.    No painel de navegação, escolha Funções.

3.    Escolha Criar função.

4.    Escolha Criar a partir do Scratch.

5.    Em Nome da função, insira o nome da função.

6.    Para Tempo de execução, selecione Python 3.7.

7.    Em arquitetura, deixe a seleção padrão de x86_64.

7.    Expanda Alterar função de execução padrão.

8.    Por exemplo, para a função de execução, selecione Usar uma função existente.

9.    Para função existente, selecione a função do IAM que você criou anteriormente.

10.    Escolha Criar função.

11.    Escolha a guia Código.

12.    No editor de código-fonte, exclua o código de exemplo e cole o seguinte:

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Start DB Instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance stopped. Start it if eligible.
        if (db['DBInstanceStatus'] == 'stopped'):
            doNotStart=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
                for tags in GetTags:
                #if tag "autostart=yes" is set for instance, start it
                    if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
                        result = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                        print ("Starting instance: {0}.".format(db['DBInstanceIdentifier']))
                if(doNotStart == 1):
                    doNotStart=1
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                

if __name__ == "__main__":
    lambda_handler(None, None)

13.    Escolha Arquivo, selecione Salvar e, em seguida, escolha Implantar.

15.    Escolha a guia Configuração, escolha Configuração geral e, em seguida, escolha Editar.

16.    Em Tempo limite, faça o seguinte: por min, selecione 0. Para seg, selecione 10. 17.    Escolha Salvar.

Crie uma função do Lambda para parar as instâncias de banco de dados marcadas

Para criar uma função do Lambda para interromper as instâncias de banco de dados marcadas, use as instruções na seção anterior Criar uma função do Lambda para iniciar as instâncias de banco de dados marcadas com a seguinte alteração:

No editor de código-fonte, exclua o código de exemplo e cole o seguinte:

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Stop DB instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance is not already stopped
        if (db['DBInstanceStatus'] == 'available'):
            DoNotStop=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
                for tags in GetTags:
                #if tag "autostop=yes" is set for instance, stop it
                    if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
                        result = rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
                        print ("Stopping instance: {0}.".format(db['DBInstanceIdentifier']))
                if(DoNotStop == 1):
                    DoNotStop=1
            except Exception as e:
                print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                
if __name__ == "__main__":
    lambda_handler(None, None)

Realizar testes de função

Suponha que suas instâncias de banco de dados marcadas estejam no estado Parado. Para realizar testes de função, faça o seguinte:

  1. Abra a lista Funções do Lambda.
  2. Escolha a função que você criou para iniciar as instâncias de banco de dados .
  3. Escolha Ações e, em seguida, escolha Testar.
  4. Na guia Teste, para Nome, insira o nome do seu evento.
  5. Escolha Salvar alterações e, em seguida, escolha Testar.

Crie o cronograma

Suponha que a janela de manutenção semanal para as instâncias de banco de dados marcadas seja de domingo, das 22:00 às 22:30. Você pode configurar um cronograma criando duas regras para o seguinte:

  • Inicie automaticamente a instância de banco de dados 30 minutos antes do início da janela de manutenção
  • Interrompa automaticamente a instância de banco de dados 30 minutos depois que a janela de manutenção terminar

Para criar a regra para iniciar automaticamente a instância de banco de dados 30 minutos antes da janela de manutenção, faça o seguinte:

  1. Abra a lista Funções do Lambda.
  2. Escolha a função que você criou para iniciar as instâncias de banco de dados.
  3. Em Visão geral da função, escolha Adicionar acionador.
  4. Selecione EventBridge (CloudWatch Events) e, em seguida, selecione Criar uma nova regra.
  5. Em Nome da regra, insira o nome da regra que você deseja criar.
  6. Para Expressão de programação, adicione uma expressão cron para a programação automatizada (Exemplo: cron (30 21 ? * SUN *)).
  7. Escolha Adicionar.

Use as mesmas instruções para criar outra regra para interromper automaticamente a instância de banco de dados 30 minutos após a janela de manutenção. Certifique-se de alterar o nome da regra e a expressão cron para a programação automatizada de acordo (Exemplo: cron (00 23 ? * SUN *)).