Como iniciar e parar a instância do AWS EC2 com base em uma programação baseada em tempo

17

Existe uma maneira fácil de iniciar e interromper instâncias do AWS EC2 em um determinado horário todos os dias? Isso poderia economizar muito dinheiro para meus servidores de desenvolvimento e teste.

Tim
fonte

Respostas:

16

Atualizar

A AWS lançou uma ferramenta chamada " Agendador de Instâncias ", incluindo um guia de configuração completo, vinculado a partir dessa página. Parece ser um aprimoramento do EC2 Scheduler que descrevo abaixo, com mais alguns recursos, mas é essencialmente a mesma coisa.

O guia abaixo ainda funcionará, mas provavelmente é melhor consultar o planejador de instâncias para novas instalações.

Correio Original

A AWS tem uma ferramenta chamada EC2 Scheduler que fornece controle muito flexível sobre o início e a parada de instâncias do EC2.

A ferramenta permite que você defina os horários padrão de início e parada ao configurar a ferramenta, que poderá ser alterada posteriormente. Você pode escolher quais instâncias são controladas, e você pode especificar diferentes horários de início e parada para cada instância usando tags.

Embora seja uma ótima ferramenta, a documentação é um pouco vaga e confusa. É como se a documentação tivesse sido escrita por um engenheiro que escreveu a ferramenta e sabe tudo sobre ela, em vez de um escritor técnico.

Nota : se você tiver comentários ou correções, os comentários são apreciados. Se você tiver uma pergunta baseada nisso, inicie sua própria pergunta.

O que é o Agendador EC2

Essa ferramenta é uma função Lambda que funciona com o Cloudwatch Events e o DynamoDB. Ele foi implantado usando um modelo de Cloudformation, que também configura as funções e políticas necessárias do IAM. Você pode ler sobre a arquitetura aqui .

Arquitetura do AWS EC2 Scheduler

Desdobramento, desenvolvimento

Comece acessando esta página e clicando em "iniciar solução". No momento, o link direto está aqui , mas pode mudar.

Selecione a região na qual você deseja implantar os recursos na parte superior do console. O script controla instâncias do EC2 em qualquer região, mas é executado em uma região.

Marcando instâncias do EC2

Isso é abordado na documentação aqui , mas não é tão simples quanto poderia ser.

Você controla quais instâncias são iniciadas e interrompidas identificando suas instâncias.

O caso mais simples exige que você marque cada instância do EC2 que deseja iniciar e interromper de acordo com o agendamento. Para isso, localize sua instância do EC2 no console, clique em tags e crie essa tag

Marcação de Instância EC2 para Agendador

Para habilitar copiar e colar:

  • Chave: agendador: ec2-begintop
  • Valor: verdadeiro

Se você deseja que uma instância específica seja iniciada e parada em um agendamento diferente, anexe informações adicionais à chave e ao valor da tag. Por exemplo, se você deseja que uma instância inicie às 1500 UTC e pare às 2400 UTC na terça, quinta e sexta-feira, insira o seguinte.

Chave: agendador: ec2-begintop: late Valor: 1500; 2400; utc; ter, qui, sex

Observe que a palavra "atrasado" pode ser qualquer sequência, "atrasado" não tem significado especial.

Você pode converter o UTC para o horário local usando esta ferramenta .

Você pode usar o editor de tags para instâncias de tags em massa. Isso poderia facilitar a configuração da marcação em massa, o que pode ser útil por ter configurações diferentes para desenvolvimento, teste e produção. Duvido que você usaria isso na produção.

Parâmetros CloudFormation

Ao executar o modelo CloudFormation, é necessário inserir muitos parâmetros. A maioria você pode deixar no padrão. Aqui estão alguns dos parâmetros mais importantes

  • Nome da pilha: chame como quiser. É exatamente o que é chamado no CloudFormation.
  • Nome da tag personalizada: essa é a "chave" da tag que você coloca na instância do EC2. Deixe-o no valor padrão, a menos que você tenha um bom motivo ou precise de várias instalações.
  • Hora padrão de início / parada: hora UTC padrão para iniciar e parar as instâncias
  • DynamoDB: as configurações são armazenadas no DynamoDB. Você pode alterar o nome da tabela e tal. Como o nível gratuito do DynamoDB não expira, é improvável que a maioria das pessoas seja cobrada.
  • (segunda tela) Permissões - este é um arenque vermelho, consulte a seção abaixo. Deixe-o como padrão e esteja executando como administrador ao tentar configurar o EC2 Scheduler.
  • Opções de notificação: achei útil configurar notificações do SNS para validar se estava funcionando. Não gastei tempo para descobrir como desabilitá-los, apenas o apaguei novamente no modelo Cloudformation para reinstalar.

Permissões, políticas e funções

A seção de função Permissões / IAM do modelo CloudFormation é um arenque vermelho - ou seja, é irrelevante. Ele especifica apenas a função usada para executar o script CloudFormation, não faz diferença para os recursos criados ou a função usada quando a função lambda é executada. Em retrospecto, isso é óbvio, mas não era óbvio para mim quando comecei.

Qualquer função que você executar este script, como a mesma função e permissões embutidas, será criada no IAM. A função Lambda é executada usando uma "função de agendador ec2" criada pelo script.

Incluí minhas políticas abaixo caso sejam úteis para qualquer pessoa.

Eventos e métricas do CloudWatch

Se você deseja ver os logs da sua função Lambda, entre em Cloudwatch Events. O registro é muito bom. Também existem métricas, para que você possa ver quando é executado, quando é executado, etc.

Adicional

O código para a função lambda está disponível no Github .

Políticas

Isso geralmente não é necessário, mas pode ser para alguém, então eu os incluirei.

Política para função do IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

Política de confiança para a função do IAM

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Tim
fonte
Amazon, desde então, as coisas mudaram - "EC2 Scheduler foi substituído pelo AWS Instância Scheduler"
Max Barraclough
Obrigado Max, atualizei a resposta para incluir um link. Ele vem com um guia de implementação completo, portanto, acho que não preciso fornecer instruções completas.
Tim
1
É inacreditável como eles gostam de coisas complicar ...
Mehdi
9

Se você deseja iniciar e parar instâncias, aqui está outra opinião sobre isso, que também faz uso do serviço Lambda. Supõe que você deseja controlar um ID de instância específico. Você pode controlar várias instâncias adicionando mais IDs separados por vírgula. (ex: 'i-3453453', 'i-45656745'). Você pode encontrar o ID da sua instância na seção Instâncias do console da AWS.

No console Lambda

  1. Abra o console do AWS Lambda e escolha a função Criar.
  2. Escolha Autor do zero.
  3. Digite um nome para sua função, como "StopEC2Instances".
  4. Para tempo de execução, selecione Python 2.7
  5. Expanda o menu suspenso Função e escolha Criar uma função personalizada. Isso abre uma nova guia ou janela no seu navegador.
  6. No menu suspenso Função do IAM, selecione Criar uma nova função do IAM e insira um Nome da função, como "lambda_start_stop_ec2".
  7. Escolha Exibir documento de diretiva, Editar e, em seguida, escolha OK quando solicitado a ler a documentação. Substitua todo o texto da política por:

Código abaixo

{
  "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": "*"
    }
  ]
}
  1. Escolha Permitir para concluir a criação da função e retornar ao console do AWS Lambda.
  2. Para interromper suas instâncias, substitua todo o texto no editor de código de função pelo seguinte:

Código abaixo

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

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

Lembre-se de substituir os valores da região e da instância pelos seus.

  1. No menu suspenso Tempo de execução, escolha Python2.7.
  2. Em Configurações básicas, insira 10 segundos para a função Tempo limite.
  3. Escolha Salvar.
  4. Repita todas as etapas para criar outra função que iniciará suas instâncias, mas use este script python para iniciar tudo:

Código abaixo

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

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

Agendar as funções

Aqui você criará um evento CloudWatch que acionará sua função Lambda à noite

  1. Abra o console do Amazon CloudWatch.
  2. Escolha Eventos e, em seguida, escolha Criar regra.
  3. Escolha Agenda em Origem do Evento.
  4. Digite um intervalo de tempo ou expressão cron que informe ao Lambda quando parar suas instâncias. Para obter mais informações sobre a sintaxe correta, consulte Agendar sintaxe de expressão para obter regras.

Nota: Expressões Cron são avaliadas em UTC. Certifique-se de ajustar a expressão para o seu fuso horário preferido. Aqui está um exemplo que executará a função todos os dias às 08:00 GMT / UTC):

0 08 * * ? *
  1. Escolha Adicionar destino e escolha a função Lambda.
  2. Para Função, escolha a função Lambda que interrompe suas instâncias.
  3. Escolha Configurar detalhes.
  4. Digite as seguintes informações nos campos fornecidos: Para Nome, digite um nome significativo, como "StopEC2Instances". Para Descrição, adicione uma descrição significativa, como "interrompe as instâncias do EC2 todos os dias à noite". Para Estado, selecione Ativado.
  5. Escolha Criar regra.

Para reiniciar suas instâncias pela manhã, repita essas etapas e use seu horário de início preferido. Se você deseja enviar uma mensagem de email sempre que as funções falharem, é possível configurar um tópico do SNS e configurar o envio dessa mensagem em Depuração na janela de criação da função Lmbda.

A fonte de tudo isso pode ser encontrada aqui: documentação da AWS

netfed
fonte
Como diabos você consegue que o código Python fique bem no editor, como ele acabou de aparecer agora?
netfed
Clique na ajuda '?' e você encontrará mais sobre como usar a formatação de descontos. serverfault.com/editing-help
jscott
1
É um erro no código de formatação. Você precisa colocar texto sem formatação entre diferentes formatações - nesse caso, um bloco de código e um bloco numerado. É por isso que coloquei "código abaixo" em - não faz sentido, em todos os lugares, mas funciona.
Tim
@ Tim Obrigado por esclarecer. Eu não sabia disso. Ele resolveu a formatação da expressão cron também. Obrigado novamente.
Netfed