Como verificar o preço spot da AWS automaticamente?

15

Estive pensando em um trabalho de Jenkins para verificar o preço das caixas de agente que fabricamos; de vez em quando o preço aumenta e leva uma ou duas horas antes que alguém perceba que não há novos agentes chegando, e então precisamos entrar manualmente e verificar o preço à vista e ajustar de acordo, ou mudar de zona etc.

Meu primeiro instinto foi que o melhor caminho é ter um trabalho Jenkins por hora que execute aws ec2 describe-spot-instance-requestsae verifique se há solicitações com falha (e depois nos atrasa em uma falha). Mas estou imaginando se existe um método mais limpo que envolva realmente comparar preços rígidos (e, portanto, poderia nos dizer exatamente o que está acontecendo e quanto), em vez de analisar solicitações bem-sucedidas / com falha.

Alguém criou algo semelhante? Como você fez isso?

Alex
fonte
11
Pergunta razoável, eu acho ... mas por que você não oferece apenas o que as instâncias realmente valem para você, seleciona vários tipos de instâncias (incluindo instâncias maiores do que o necessário, que são ocasionalmente mais baratas quando os preços spot de instâncias menores aumentam ... ocasionalmente - inclusive no momento em que escrevo isso - me encontro com um cc2.8xlarge, porque atualmente é mais barato que o c3.2xlarge que eu precisava, apesar de ter 4x os núcleos e 4x a memória) e deixo o sistema manipular a instância seleção de tipo e colocação de AZ com base no mercado?
Michael - sqlbot
11
@ Michael-sqlbot Não tenho nada a dizer nessa parte do processo; temos documentação informando que compramos um determinado tamanho de instância para fins de auditoria e é por isso que estamos presos. Apenas tentando aproveitar ao máximo uma situação não-ideal.
Alex
11
É justo, @Alex. Só pensei em jogá-lo, caso você não tivesse considerado.
Michael - sqlbot
@ Alex Fora de interesse, o tamanho da instância é determinado para que possa ser visto facilmente nas contas? Porque você (em vez disso, eles!) Pode usar tags e vê-las no Cost Explorer.
Tim Malone

Respostas:

15

Detectou uma ferramenta de código aberto chamada autospotting que pode ajudar com isso:

Uma vez ativado em um grupo AutoScaling sob demanda existente, ele lança uma instância local do EC2 que é mais barata, pelo menos tão grande e configurada de forma idêntica às suas instâncias sob demanda atuais. Assim que a nova instância estiver pronta, ela será adicionada ao grupo e uma instância sob demanda será desanexada do grupo e encerrada.

Temos isso em nosso pipeline de tarefas, poderemos adicionar mais contexto assim que terminarmos.

Atualizar:

Outra ferramenta que foi recentemente demonstrada em uma conferência foi mapbox / spotswap

Isso funciona de maneira um pouco diferente. Ele monitora um ASG normal com instâncias On Demand ou Reservadas e, em seguida, se houver escala, os lances e as provisões detectam instâncias de nível de computação semelhante em um ASG separado.

Hashfyre
fonte
2
Bem-vindo ao site, Hashfyre :)
Dawny33
11
Eu sou o autor do AutoSpotting, obrigado por mencionar! Você já experimentou? Sou todo ouvidos para feedback dos usuários.
Cristian Măgherușan-Stanciu 15/10
6

Eu pessoalmente consideraria um modelo como este:

Timed Lambdas -> Checks spot price -> Push to ElastiCache

Então, quando você precisar de instâncias:

Timed lambdas -> Pulls spot price from ElastiCache, sets it as environment variable on your Machine where you spin up IaC from -> This is parsed as argument to IaC code and pushes out the spot price

Você também pode definir algumas tolerâncias dentro das lambdas (ou seja, 10, 25, 50% de aumento com base na importância) e um limite máximo de demanda, por exemplo. Também é um ótimo lugar para construir a lógica para lidar com, por exemplo, encontrar o AZ mais barato, encontrar o preço spot relativamente mais barato ( 2xt2.mediumvs t2.large) etc.

Henry
fonte
Apenas para obter informações, você pode ter editado a resposta excluída e sinalizada para solicitar exclusão. (Nenhum dano feito, é apenas informativa :))
Tensibai
11
Deixarei minha vergonha perseverar para me lembrar de meus dias equivocados por toda a eternidade.
Henry
Rofl, não há realmente nenhuma vergonha, não se preocupe :)
Tensibai
3
Minhas cicatrizes definem quem eu sou
Henry
Idéia legal - também vale a pena mencionar que é possível empurrar o preço para uma tabela do DynamoDB, caso eles ainda não tenham um cluster do ElastiCache;). Ou talvez até um arquivo JSON em um bucket S3.
Tim Malone
4

Deixe-me dar uma maneira independente de ferramenta de tentar fazer isso.

de vez em quando o preço aumenta e leva uma ou duas horas antes que alguém perceba que nenhum novo agente está chegando, e então precisamos entrar manualmente e verificar o preço à vista e ajustar de acordo, ou mudar de zona etc.

Enfrentamos o mesmo problema na infraestrutura que estamos construindo. Portanto, tínhamos if-elseblocos de estilo para definir o preço da oferta, dependendo do preço sob demanda da instância.

A AWS possui uma API para obter o preço sob demanda de uma instância. Usamos esse wrapper Python para esse fim.

Assim, uma vez que temos o preço on-demand (digamos X), nós ligado if-elseblocos de estilo, que são 0.4*X, 0.6*X, 0.8*X, X, o que significa que estão tentando para um preço de oferta na faixa de 40%, 60%, 80% do on preço sob demanda. Se tudo falhar, voltaremos a criar instâncias sob demanda.

Além disso, como isso é independente dos preços spot atuais da AWS, nunca pagamos um preço acima do preço sob demanda.

Mas, se você estiver procurando uma maneira de fazê-lo on-the-fly, a solução da Hashfyre deve ser o caminho a seguir.

Dawny33
fonte