Posso iniciar e encerrar automaticamente minha instância da Amazon usando a API da Amazon? Você pode descrever como isso pode ser feito? Idealmente, preciso iniciar a instância e interrompê-la em intervalos de tempo especificados todos os dias.
90
Respostas:
Caso alguém tropece nessa velha questão, hoje em dia você pode conseguir a mesma coisa adicionando uma programação a um grupo de auto scaling: aumente a quantidade de instâncias em um grupo de auto scaling para 1 em certos momentos e diminua de volta para 0 depois .
E como essa resposta está recebendo muitas visualizações, pensei em criar um link para um guia muito útil sobre isso: Como executar instâncias EC2 em uma programação recorrente com escalonamento automático
fonte
Você pode tentar usar as ferramentas de API do Amazon EC2 diretamente. Na verdade, você precisa de apenas dois comandos: ec2-start-instances e ec2-stop-instances. Certifique-se de que as variáveis de ambiente, como EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY, etc., estejam configuradas corretamente e todas as credenciais AWS, certificados e arquivos de chave privada estejam no local adequado - você pode encontrar mais informações na documentação das ferramentas de API do AWS EC2.
Você pode testar o comando manualmente primeiro e depois, quando tudo funcionar bem, configurar o crontab Unix ou Tarefas agendadas no Windows. Você pode encontrar o exemplo abaixo para o arquivo Linux / etc / crontab (não se esqueça que todas as variáveis de ambiente mencionadas acima precisam estar presentes para o usuário 'sua-conta'.
Sou um desenvolvedor do projeto BitNami Cloud, onde empacotamos as ferramentas AWS (incluindo as que mencionei) em um instalador fácil de usar que você pode querer experimentar: BitNami CloudTools pack stack
fonte
Eu recomendo que você dê uma olhada no Guia de introdução do EC2 , que mostra como fazer o que você precisa usando as ferramentas de linha de comando do EC2. Você pode facilmente criar um script para um cron job (no Linux / UNIX) ou um trabalho agendado no Windows para chamar os comandos start e stop em um determinado momento.
Se quiser fazer isso a partir de seu próprio código, você pode usar as APIs SOAP ou REST; consulte o Guia do desenvolvedor para obter detalhes.
fonte
Eu escrevi código em Python, usando a biblioteca Boto, para fazer isso. Você pode ajustar isso para seu próprio uso. Certifique-se de executá-lo como parte de um cron job, e então você será capaz de iniciar ou desligar quantas instâncias forem necessárias durante a execução dos cron jobs.
fonte
Se não for de missão crítica - Uma coisa simplista a fazer é agendar o arquivo em lote para executar 'SHUTDOWN' (Windows) às 3 da manhã todos os dias. Assim, pelo menos, você não corre o risco de deixar acidentalmente uma instância indesejada em execução indefinidamente.
Obviamente, essa é apenas metade da história!
fonte
A empresa para a qual trabalho tinha clientes perguntando regularmente sobre isso, então escrevemos um aplicativo de agendamento EC2 freeware disponível aqui:
http://blog.simple-help.com/2012/03/free-ec2-scheduler/
Ele funciona no Windows e no Mac, permite que você crie várias programações diárias / semanais / mensais e permite que você use filtros correspondentes para incluir facilmente um grande número de instâncias ou incluir aquelas que você adicionar no futuro.
fonte
O AWS Data Pipeline está funcionando bem. https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/
Se desejar excluir dias do início (por exemplo, fim de semana), adicione um objeto ShellCommandPrecondition.
No AWS Console / Data Pipeline, crie um novo pipeline. É mais fácil editar / importar uma definição (JSON)
Coloque o script Bash a ser baixado e executado como pré-condição em seu balde S3
Ao ativar e executar o pipeline nos dias de fim de semana, o status de integridade do pipeline do console da AWS mostra um erro "ERROR". O script bash retorna um erro (saída 1) e o EC2 não é iniciado. Nos dias 1 a 5, o status é "SAUDÁVEL".
Para interromper o EC2 automaticamente no horário de fechamento do escritório, use o comando AWS CLI diariamente sem a condição prévia.
fonte
Você poderia olhar para Ylastic para fazer isso. A alternativa parece ser ter uma máquina em execução que encerra / inicia outras instâncias usando um cron job ou tarefa agendada.
Obviamente, se você quiser apenas uma instância, esta é uma solução cara, pois uma máquina deve estar sempre em execução e pagar ~ $ 80 por mês para que uma máquina execute tarefas cron não é rentável.
fonte
O escalonamento automático é limitado a instâncias de encerramento. Se você deseja interromper uma instância e manter o estado do servidor, um script externo é a melhor abordagem.
Você pode fazer isso executando um trabalho em outra instância que esteja funcionando 24 horas por dia, 7 dias por semana, ou pode usar um serviço de terceiros, como Ylastic (mencionado acima) ou Rocket Peak .
Por exemplo, em C #, o código para parar um servidor é bastante simples:
fonte
IMHO adicionando uma programação a um grupo de escalonamento automático é a melhor abordagem "semelhante à nuvem", conforme mencionado antes.
Mas caso você não possa encerrar suas instâncias e usar novas, por exemplo, se você tiver Elastic IPs associados a etc.
Você pode criar um script Ruby para iniciar e parar suas instâncias com base em um intervalo de data e hora.
Dê uma olhada em amazon_start_stop para criar um agendador gratuitamente usando o Heroku Scheduler .
fonte
Embora existam maneiras de fazer isso usando o escalonamento automático, ele pode não ser adequado para todas as ocasiões, pois encerra as instâncias. Os cron jobs nunca funcionarão para uma única instância (embora possam ser perfeitamente usados para situações como interromper uma única instância e agendar outras instâncias ao executar muitas instâncias). Você pode usar chamadas de API como StartInstancesRequest e StopInstancesRequest para conseguir o mesmo, mas novamente você precisa contar com um terceiro recurso. Existem muitos aplicativos para agendar instâncias da AWS com muitos recursos, mas para uma solução simples, eu recomendaria um aplicativo gratuito como o snapleaf.io
fonte
Sim, você pode fazer isso usando o AWS Lambda. Você pode selecionar o gatilho no Cloudwatch que é executado em expressões Cron no UTC.
Aqui está um link relacionado https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/
Outra alternativa é usar
awscli
o que está disponível a partirpip
,apt-get
,yum
oubrew
, e em seguida, executandoaws configure
com suas credenciais exportados do IAM e executar o seguinte script bash, para parar um EC2 que foi marcado comName: Appname
eValue: Appname Prod
. Você pode usarawscli
para marcar suas instâncias ou marcá-las manualmente no console da AWS.aws ec2 stop-instances
interromperá a instância ejq
é usado para filtrar a consulta json e buscar o ID correto da instância usando as tags deaws ec2 describe-instances
.Para verificar se
aws configure
foi bem-sucedido e retorna a saída json, executeaws ec2 describe-instances
e o ID da instância em execução deve estar lá na saída. Aqui está um exemplo de saídaO script bash seguinte é
stop-ec2.sh
em/home/centos/cron-scripts/
que é inspirado a partir deste post SOExecute o arquivo usando
sh /home/centos/cron-scripts/stop-ec2.sh
e verifique se a instância EC2 foi interrompida. Para depurar executeaws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Appname Prod") ) | select(.[].Tags[].Key == "Appname") | {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags} | [.]' | jq -r .[].InstanceId
e veja se ele retorna o ID de instância correto que foi marcado.Então, na
crontab -e
seguinte linha pode ser adicionado30 14 * * * sh /home/centos/cron-scripts/stop-ec2.sh >> /tmp/stop
que registrará a saída
/tmp/stop
. A30 14 * * *
é a expressão cron UTC que você pode verificarhttps://crontab.guru/
. Da mesma forma, substituir poraws ec2 start-instances
pode iniciar uma instância.fonte
Acho que a pergunta inicial foi um pouco confusa. Depende do que o Pasta precisa: 1. iniciar / encerrar (armazenamento de instância) - Auto Scaling é a solução certa (resposta da Nakedible) 2. iniciar / parar a instância de inicialização do EBS - Auto Scaling não vai ajudar, eu uso scripts remotos agendados (ex. , ec2 CLI).
fonte
Você não pode fazer isso automaticamente, ou pelo menos não sem alguma programação e manipulação de API nos arquivos de script. Se você deseja uma solução confiável para parar, reiniciar e gerenciar suas imagens (presumivelmente para controlar os custos em seu ambiente), você pode querer dar uma olhada no LabSlice . Aviso Legal: Eu trabalho para esta empresa.
fonte