Como interrompo e inicio instâncias do Amazon EC2 em intervalos regulares usando o Lambda?
Data da última atualização: 23/02/2023
Quero reduzir o uso do Amazon Elastic Compute Cloud (Amazon EC2) interrompendo e iniciando minhas instâncias do EC2 automaticamente.
Breve descrição
Observação: A resolução a seguir é uma solução simples. Para uma solução mais avançada, use o AWS Instance Scheduler. Para obter mais informações, consulte Automatizar o início e a interrupção de instâncias do AWS.
Para usar o Lambda para interromper e iniciar instâncias do EC2 em intervalos regulares, conclua as seguintes etapas:
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 a função de acordo com uma programação.
Observação: você também pode criar regras que reajam aos eventos que ocorrem 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, execute estas etapas:
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 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 que acabou de criar.
Crie funções do Lambda que interrompam e iniciem suas instâncias do EC2
1. Abra o console do Lambda e escolha Criar função.
2. Escolha Author from scratch (Criar do zero).
3. Em Informações básicas, adicione as seguintes informações:
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 para interromper 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. Conclua as etapas a seguir de forma diferente para que essa função inicie suas instâncias do EC2:
Na etapa 3, insira um nome de Função diferente do que você usou antes. Por exemplo, “StartEC2Instances”.
Na etapa 5, copie e cole o código a seguir no painel do editor de código: (lambda_function).
Exemplo de código de função para iniciar 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. Abra o console do Lambda e escolha Funções.
2. Escolha uma das funções criadas.
3. Escolha 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 altere 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 7 para a outra função criada.
Verifique o status de suas instâncias do EC2
Console de Gerenciamento da AWS
Você pode verificar o status de suas instâncias do EC2 antes e depois do teste para confirmar se suas funções funcionam conforme o esperado.
AWS CloudTrail
Você pode usar o CloudTrail para verificar eventos e confirmar se a função Lambda interrompeu ou iniciou a instância do EC2.
1. Abra o console do CloudTrail.
2. No painel de navegação, escolha Event history (Histórico de eventos).
3. Escolha a lista suspensa Pesquisar atributos e, em seguida, escolha Nome do evento.
4. Na barra de pesquisa, digite StopInstances para revisar os resultados.
5. Na barra de pesquisa, digite StartInstances para revisar os resultados.
Se não houver resultados, a função Lambda não interrompeu e nem iniciou as instâncias do EC2.
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”. (Opcional) Insira uma descrição para a regra em Descrição.
4. Em Tipo de regra, escolha Programação e, em seguida, escolha Continuar no EventBridge Scheduler.
5. Em Padrão de programação, escolha Programação recorrente. Conclua uma das seguintes etapas:
Em Padrão de programação, para Ocorrência, escolha Programação recorrente. Em seguida, conclua uma das seguintes etapas:
Quando o tipo de programação for Programação baseada em taxa, em Expressão de taxa, insira um valor de taxa e escolha um intervalo de tempo em minutos, horas ou dias.
Quando o tipo de agendamento for cronograma baseado em Cron, para expressão Cron, insira uma expressão que diga ao Lambda quando interromper sua instância. Para obter informações sobre a sintaxe da expressão, consulte Programar expressões para regras.
Observação: as expressões Cron seguem o formato UTC. Lembre-se de ajustar a expressão de acordo com o fuso horário de sua preferência.
6. Em Selecionar alvos, escolha a função Lambda na lista suspensa Alvo.
7. Para Função, escolha a função que interrompe suas instâncias do EC2.
8. Escolha Pular para revisar e criar e, em seguida, escolha Criar.
9. Repita as etapas de 1 a 8 para criar uma regra que inicie as instâncias do EC2. Conclua as etapas a seguir de forma diferente:
Insira um nome para sua regra, como “StartEC2Instances”.
(Opcional) Em Descrição, insira uma descrição para sua regra, como “Iniciar 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.
Informações relacionadas
Este artigo ajudou?
Precisa de ajuda com faturamento ou suporte técnico?