Como usar o Lambda para interromper e iniciar instâncias do Amazon EC2 em intervalos regulares?

7 minuto de leitura
0

Quero interromper e iniciar automaticamente minhas instâncias do Amazon Elastic Compute Cloud (Amazon EC2) para reduzir meu uso do Amazon EC2.

Breve descrição

Use o AWS Lambda e o Amazon EventBridge para interromper e iniciar instâncias do EC2 automaticamente.

Observação: a resolução a seguir é um exemplo simples de solução. Para obter uma solução mais avançada, use o Programador de Instâncias da AWS. Para mais informações, consulte Como automatizar o início e a interrupção de instâncias da AWS.

Para usar o Lambda para interromper e iniciar instâncias do EC2 em intervalos regulares, realize as seguintes etapas:

  1. Crie uma política e um perfil do IAM personalizados do AWS Identity and Access Management (IAM) para sua função do Lambda.
  2. Crie funções do Lambda para interromper e iniciar suas instâncias do EC2.
  3. Teste as funções do Lambda.
  4. Crie cronogramas do EventBridge que executem as funções com base em um cronograma.
    Observação: você também pode criar regras que reajam aos eventos da sua conta da AWS.

Resolução

Observação: após concluir as etapas a seguir, você pode receber um erro de Erro do cliente na inicialização. Para obter mais informações, consulte Quando inicio minha instância com volumes criptografados anexados, a instância para 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, execute as etapas a seguir.

Crie uma política do IAM e um perfil do IAM para a função do Lambda

  1. Use o editor de políticas JSON para criar uma política do IAM. 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 um perfil 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.

Observação: se você usa um volume do Amazon Elastic Block Store (Amazon EBS) que é criptografado por uma chave do AWS Key Management Service (AWS KMS) gerenciada pelo cliente, adicione kms:CreateGrant à política do IAM.

Crie funções do Lambda para interromper e iniciar suas instâncias

  1. Abra o console do Lambda e escolha Criar função.
  2. Escolha Criar do zero.
  3. Em Informações básicas, insira as seguintes informações:
    Em Nome da função, insira um nome que descreva a função, como “StopEC2Instances”.
    Em Runtime, escolha Python 3.9.
    Em Permissões, expanda Alterar perfil de execução padrão.
    Em Perfil de execução, escolha Usar um perfil existente.
    Em Perfil existente, escolha o perfil do IAM.
  4. Escolha Criar função.
  5. Na guia Código, em Origem do código, cole o código a seguir no painel do editor de código na guia lambda_function. Ele interrompe as instâncias que você identificar:
    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))
    Substitua us-west-1 pela região da AWS onde suas instâncias estão. Substitua InstanceIds pelos IDs das instâncias que você quer interromper e iniciar.
  6. Escolha Implantar.
  7. Na guia Configuração, escolha Configuração geral e, em seguida, escolha Editar.
  8. Defina o Tempo limite como 10 segundos e escolha Salvar.
    Observação: (opcional) você pode ajustar as configurações da função Lambda. Por exemplo, para interromper e iniciar várias instâncias, pode ser necessário alterar o valor do Tempo limite e da Memória.
  9. Repita as etapas de 1 a 7 para criar outra função. Conclua as etapas a seguir para que essa função inicie suas instâncias:
    Na etapa 3, insira um Nome de função diferente. Por exemplo, “StartEC2Instances”.
    Na etapa 5, cole o código a seguir no painel do editor de código na guia lambda_function:
    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))

          Use sua região e os mesmos IDs de instâncias.

Teste as funções do Lambda

  1. Abra o console do Lambda e escolha Funções.
  2. Escolha uma das funções.
  3. Escolha a guia Código.
  4. Na seção Origem do código, escolha Testar.
  5. Na caixa de diálogo Configurar evento de teste, escolha Criar novo evento de teste.
  6. Insira um Nome do evento. Em seguida, escolha Criar.
    Observação: não altere o código JSON do evento de teste.
  7. Escolha Testar para executar a função.
  8. Repita as etapas de 1 a 7 para a outra função.

Verifique o status de suas instâncias

Console de Gerenciamento da AWS

Antes e depois do teste, verifique o status das suas instâncias para confirmar se suas funções funcionam.

CloudTrail

Para confirmar se a função do Lambda interrompeu ou iniciou a instância, use o AWS CloudTrail para verificar se houve eventos.

  1. Abra o console do CloudTrail.
  2. No painel de navegação, escolha Histórico de eventos.
  3. Escolha a lista suspensa Atributos de pesquisa e, em seguida, selecione Nome do evento.
  4. Insira StopInstances na barra de pesquisas para examinar os resultados. Em seguida, insira StartInstances.

Se não houver resultados, a função do Lambda não interrompeu nem iniciou as instâncias.

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

  1. Abra o console do EventBridge.
  2. Selecione Criar regra.
  3. Insira um nome para sua regra, como “StopEC2Instances”. (Opcional) Em Descrição, insira uma descrição da regra.
  4. Em Tipo de regra, escolha Cronograma e, em seguida, escolha Continuar no Agendador do Amazon EventBridge.
  5. Em Padrão de cronograma, escolha Cronograma recorrente.
  6. Em Padrão de cronograma, procure Ocorrência e escolha Cronograma recorrente.
  7. Em Tipo de cronograma, escolha um tipo de cronograma e conclua as seguintes etapas:
    Em Cronograma baseado em taxas, insira um valor de taxa e escolha um intervalo de tempo em minutos, horas ou dias.
    -ou-
    Para o Cronograma baseado em cron, insira uma expressão que diga ao Lambda quando parar a sua instância. Para obter informações sobre a sintaxe da expressão, consulte Crie uma regra do Amazon EventBridge que é executada de acordo com um cronograma.
    Observação: as expressões cron seguem o formato UTC. Certifique-se de ajustar a expressão de acordo com o seu fuso horário.
  8. Em Selecionar destinos, escolha Função do Lambda na lista suspensa Destino.
  9. Em Função, escolha a função de interrupção das instâncias.
  10. Escolha Pular para a análise e criação e, em seguida, escolha Criar.
  11. Repita as etapas de 1 a 10 para criar uma regra de inicialização das instâncias. Conclua as seguintes etapas:
    Insira um nome para sua regra, como “StartEC2Instances”.
    (Opcional) Em Descrição, insira uma descrição da regra. Por exemplo, “Inicia instâncias do EC2 todas as manhãs às 7h”.
    Na etapa 7, em Expressão cron, insira uma expressão que informe ao Lambda quando iniciar suas instâncias.
    Na etapa 9, em Função, escolha a função de inicialização das instâncias.

Observação: às vezes, uma função do Lambda interrompe uma instância e não consegue iniciá-la novamente. Isso pode ocorrer quando um volume do Amazon Elastic Block Store (Amazon EBS) é criptografado e a função do Lambda não está autorizada a usar a chave de criptografia. Para obter mais informações, consulte Política de chave do AWS KMS obrigatórias para usar com volumes criptografados e Políticas de chaves no AWS KMS.

Informações relacionadas

Tutorial: como programar funções do Lambda usando o EventBridge

Eventos dos produtos da AWS

Como adicionar ações de interrupção nos alarmes do Amazon CloudWatch

Opções de compra de instância

AWS OFICIAL
AWS OFICIALAtualizada há 6 meses