Ao usar o AWS re:Post, você concorda com os AWS re:Post Termos de uso

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

6 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 automaticamente as instâncias do EC2.

Observação: a resolução a seguir é um exemplo simples de solução. Para obter uma solução mais avançada, use o Agendador de Instâncias na 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.

À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 a política de chaves obrigatórias do AWS KMS para uso com volumes criptografados.

Resolução

Pré-requisito: Obtenha os IDs das instâncias do EC2 que você deseja interromper e iniciar.

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

Conclua as seguintes etapas:

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

  3. Anexe a política do IAM a um perfil do IAM.

Observação: Se você usa um volume do Amazon Elastic Block Store (Amazon EBS), talvez seja necessária uma configuração adicional. Se o volume do Amazon EBS estiver criptografado com 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

Conclua as seguintes etapas:

  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 ou StartEC2Instances.
    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. Escolha a guia Código.

  6. Na guia lambda_funciton.py, em Origem do código, insira o código a seguir no editor de código para stop_instances:

    import boto3region = '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))

    Para start_instances, insira o seguinte código no editor de código:

    import boto3region = '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))

    Observação: Substitua us-west-1 pela região da AWS em que suas instâncias estão e InstanceIds pelos IDs das instâncias que você deseja interromper e iniciar.

  7. Escolha Implantar.

  8. Na guia Configuração, escolha Configuração geral e, em seguida, escolha Editar.

  9. Defina o Tempo limite como 10 segundos e escolha Salvar.

Teste as funções do Lambda

Conclua as seguintes etapas:

  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 o nome do evento e 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 do Amazon EC2

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

CloudTrail

Você pode usar o AWS CloudTrail para confirmar se a função do Lambda interrompeu ou iniciou a instância.

Conclua as seguintes etapas:

  1. Abra o console do CloudTrail.
  2. No painel de navegação, selecione Histórico de eventos.
  3. Na lista suspensa Atributos de pesquisa, escolha 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.

Criar regras do EventBridge que executam funções do Lambda

Conclua as seguintes etapas:

  1. Abra o console do EventBridge.
  2. Selecione Criar regra.
  3. Insira um nome para sua regra, como StopEC2Instances ou StartEC2Instances.
  4. (Opcional) Em Descrição, insira uma descrição para a regra.
  5. Em Tipo de regra, escolha Cronograma e, em seguida, escolha Continuar no Agendador do Amazon EventBridge.
  6. No Padrão de cronograma, procure Ocorrência e escolha Cronograma recorrente.
  7. Em Tipo de cronograma, escolha um cronograma baseado em taxa ou um cronograma baseado em cron e, em seguida, conclua uma das seguintes etapas:
    Em Cronograma baseado em taxas, insira um valor de taxa e escolha um intervalo de tempo em minutos, horas ou dias.
    -or-
    Para o Cronograma baseado em cron, insira uma expressão que diga ao Lambda quando parar ou iniciar a sua instância.
    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. Na página Selecionar destinos, escolha Função do Lambda na lista suspensa Destino.
  9. Para Função, escolha a função que interrompe ou inicia suas instâncias.
  10. Escolha Pular para a análise e criação e, em seguida, escolha Criar.

Observação: você também pode criar regras que reajam aos eventos da sua conta da AWS.

Informações relacionadas

Tutorial: Crie uma regra agendada do EventBridge para funções do AWS Lambda

Eventos dos serviços da AWS no EventBridge

Opções de cobrança e compra do Amazon EC2

AWS OFICIAL
AWS OFICIALAtualizada há um mês