Respostas:
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 .
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
Para habilitar copiar e colar:
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
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"
}
]
}
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.
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": "*"
}
]
}
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)
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)
Aqui você criará um evento CloudWatch que acionará sua função Lambda à noite
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 * * ? *
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