Como interrompo e inicio instâncias do Amazon EC2 em intervalos regulares usando o Lambda?

Data da última atualização: 13-01-2022

Quero reduzir o uso do Amazon Elastic Compute Cloud (Amazon EC2) interrompendo e iniciando minhas instâncias do EC2 automaticamente. Como uso o AWS Lambda e o Amazon EventBridge para fazer isso?

Breve descrição

Nota: esta configuração de exemplo é uma solução simples. Para uma solução mais robusta, use o AWS Instance Scheduler. Para obter mais informações, consulte Como interrompo e inicio minhas instâncias usando o AWS Instance Scheduler?

Para interromper e iniciar instâncias do EC2 em intervalos regulares usando o Lambda:

1.    Crie uma política e uma função de execução personalizadas do AWS Identity and Access Management (IAM) para sua função do Lambda.

2.    Crie funções do Lambda que interrompem e iniciam suas instâncias do EC2.

3.    Teste suas funções do Lambda.

4.    Crie regras do EventBridge que acionam sua função de acordo com uma programação.
Observação: também é possível criar regras que são acionadas em um evento que ocorre na sua conta da AWS.

Resolução

Observação: se você receber um Erro do cliente na inicialização após concluir o procedimento a seguir, consulte Quando inicio minha instância com volumes criptografados anexados, a instância será interrompida imediatamente com o erro “Erro do cliente na inicialização” .

Obtenha os IDs das instâncias do EC2 que você deseja interromper e iniciar. Em seguida, faça o seguinte.

Crie uma política e uma função de execução do IAM para a função do Lambda

1.    Crie uma política do IAM usando o editor de políticas JSON. Copie e cole o seguinte documento de política JSON no editor de políticas:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

2.    Crie uma função do IAM para o Lambda.

Importante: ao anexar uma política de permissões ao Lambda, certifique-se de escolher a política do IAM que acabou de criar.

Crie funções do Lambda que interrompam e iniciem suas instâncias do EC2

1.    No console do AWS Lambda, escolha Criar função.

2.    Escolha Criar a partir do zero.

3.    Em Informações básicas, adicione o seguinte:
Em Nome da função, insira um nome que a identifique como a função usada para interromper suas instâncias do EC2. Por exemplo, "StopEC2Instances".
Para Tempo de execução, escolha Python 3.9.
Em Permissões, expanda Alterar função de execução padrão.
Em Função de execução, selecione Usar uma função existente.
Em Função existente, escolha a função do IAM que você criou.

4.    Escolha Criar função.

5.    Em Código, Código-fonte, copie e cole o código a seguir no painel do editor de código (lambda_function). Esse código interrompe as instâncias do EC2 identificadas.

Exemplo de código de função: interrompendo instâncias do EC2

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

Importante: para região, substitua "us-west-1" pela Região da AWS na qual estão suas instâncias. Para instâncias, substitua os IDs de instância do EC2 de exemplo pelos IDs das instâncias específicas que você deseja interromper e iniciar.

6.    Escolha Implantar.

7.    Na guia Configuração, escolha Configuração geral, Editar. Defina o Tempo limite para 10 segundos e selecione Salvar.

Observação: defina as configurações da função do Lambda conforme necessário para seu caso de uso. Por exemplo, se você quiser interromper e iniciar várias instâncias, precisará de valores diferentes no Tempo limite e Memória.

8.    Repita as etapas de 1 a 7 para criar outra função. Faça o seguinte de forma diferente para que essa função inicie suas instâncias do EC2:

Na etapa 3, insira um Nome de função diferente daquele usado antes. Por exemplo, “StartEC2Instances”.
Na etapa 5, copie e cole o seguinte código no painel do editor no editor de código (lambda_function):

Exemplo de código de função: iniciando instâncias do EC2

import boto3
region = 'us-west-1'
instances = ['i-12345cb6de4f78g9h', 'i-08ce9b2d7eccf6d26']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

Importante: para região e instâncias, use os mesmos valores usados para o código para interromper suas instâncias do EC2.

Teste suas funções do Lambda

1.    No Console do AWS Lambda, escolha Funções.

2.    Escolha uma das funções criadas.

3.    Selecione a guia Código.

4.    Na seção Código-fonte, selecione Testar.

5.    Na caixa de diálogo Configurar evento de teste, escolha Criar novo evento de teste.

6.    Insira um Nome de evento. Em seguida, escolha Criar.

Observação: não é necessário alterar o código JSON para o evento de teste; a função não o usa.

7.    Escolha Testar para executar a função.

8.    Repita as etapas de 1 a 6 para a outra função criada.

Dica: é possível verificar o status de suas instâncias do EC2 antes e depois do teste para confirmar se suas funções funcionam conforme o esperado.

Crie regras do EventBridge que acionam suas funções do Lambda

1.    Abra o console do EventBridge.

2.    Selecione Create rule (Criar regra).

3.    Insira um Nome para sua regra, como “StopEC2Instances”. Opcionalmente, você pode inserir uma Descrição.

4.    Em Definir padrão, selecione Programação.

5.    Execute um dos seguintes procedimentos:

Para Taxa fixa de, insira um intervalo de tempo em minutos, horas ou dias.
Para Expressão Cron, insira uma expressão que diga ao Lambda quando interromper suas instâncias. Para obter informações sobre a sintaxe da expressão, consulte Programar expressões para regras.
Nota
: as expressões Cron seguem o formato UTC. Certifique-se de ajustar a expressão para seu fuso horário preferido.

6.    Em Selecionar destinos, escolha a função Lambda no menu suspenso Destino.

7.    Para Função, escolha a função que interrompe suas instâncias do EC2.

8.    Role a página e selecione Criar.

9.    Repita as etapas de 1 a 8 para criar uma regra que inicie as instâncias do EC2. Faça o seguinte de forma diferente:

Insira um nome para sua regra, como “StartEC2Instances”.
(Opcional) Insira uma Descrição, como “Inicia instâncias do EC2 todas as manhãs, às 7h.”
Na etapa 5, para Expressão Cron, insira uma expressão que informe ao Lambda quando iniciar suas instâncias.
Na etapa 7, para Função, escolha a função que inicia suas instâncias do EC2.

(Opcional) Use o AWS Instance Scheduler para automatizar o procedimento

Para obter mais informações, consulte Automatizar o início e a interrupção de instâncias do AWS.