Concrete Logo
Hamburger button

Como gerar um relatório de preços de instâncias AWS usando Ruby

  • Blog
  • 5 de Junho de 2014
Share

A AWS oferece uma ampla gama de produtos na linha EC2, e estes serviços podem ser contratados basicamente em 3 modalidades: on-demand, spot e reservadas. Você pode aprender mais sobre essas modalidades neste post do Victor Oliveira.

A modalidade padrão é on-demand: você paga apenas pelo que usar, sem taxas de contratação, sem contrato. Se você não tem previsão de quanto tempo vai manter a instância, se precisa de continuidade e não tem muita experiência com produtos AWS, essa é a melhor escolha.

Há casos em que o tempo de uso da instância é conhecido: vamos imaginar que um serviço foi desenvolvido e testado em instâncias EC2, e neste momento está em produção, e ficará assim por no mínimo 1 ano. Neste caso, uma boa opção seria reservar esta instância por 1 ano, conseguindo preços muito melhores que os praticados nas on-demand. Até o momento existem reservas Light, Medium e Heavy, todas com prazos de 1 e 3 anos.

Uma terceira forma de contratar instâncias é por meio da modalidade spot. A AWS possui milhares de instâncias disponíveis em todas as localidades, e estas instâncias são leiloadas enquanto estiverem fora de uso. O cliente define um preço máximo que deseja pagar pelo uso da instância pelo tempo de 1 hora e, se a Amazon possuir o recurso e não existirem ordens com preços maiores, a instância é disponibilizada.

Para cada tipo de uso há uma escolha diferente e não existe uma regra geral que defina qual é a melhor modalidade de compra para todos os casos. Entretanto, o custo é um item que sempre precisa ser levado em consideração. Os preços não são fixos: o preço da spot varia de acordo com a quantidade de pessoas utilizando o produto em cada região, enquanto os preços da on-demand e da reservada podem sofrer ajustes por parte da Amazon.

Bom, explicações dadas, vamos ao código. Para seguir a linha de raciocínio dos posts anteriores, vamos mostrar como usar o Ruby e o framework Sinatra para criar uma página simples (muito simples) capaz de buscar as informações de preço diretamente nos websites da Amazon.

IMPORTANTE: Até a data de lançamento deste post (5/6/2014), o site para obtenção dos dados e o formato do arquivo disponibilizado pela AWS foram testados e funcionaram corretamente. A Amazon pode alterar essas estruturas ou caminhos de arquivos sem aviso prévio, fazendo com que seja necessário ajustar o programa.

Em nosso ambiente de desenvolvimento, usamos Debian Sid (7.5 x86_64) e Ruby 2.1.

Na linha de comando, vamos instalar as gems do Sinatra e JSON:

Agora, precisamos iniciar um editor de texto (vi, emacs, gedit, kate, geany… seu preferido) e criar nosso novo arquivo. O meu tem um nome horrível: json-spot-parse.rb, mas isso pode ser alterado sem maiores problemas.

Vamos colocar o código completo no final do post, incluindo comentários, mas por enquanto veremos passo a passo o que cada trecho de código faz.

No início do arquivo vamos definir a codificação e as bibliotecas que serão utilizadas:

Toda a aplicação será escrita dentro de um bloco de controle do Sinatra. Este não é o padrão ideal de programação, mas esta também não é uma aplicação completa; não seremos crucificados por não usar todas as recomendações de estilo de programação em um “script” com algumas dezenas de linhas. Precisamos criar o bloco que receberá o HTTP GET:

Dentro do nosso bloco principal, vamos criar uma variável na qual serão definidas as URLs dos arquivos JSON disponibilizados pela AWS:

Vamos criar também uma segunda variável, que receberá o conteúdo do JSON:

Agora precisamos fazer o mais importante: acessar as URLs da Amazon, solicitar os arquivos e armazenar seus dados na variável @json. Vamos usar a biblioteca Net:HTTP para obter o arquivo via método GET. A Amazon utiliza os domínios que colocamos na variável @urls, mas após fazer o request, ela redireciona via código HTTP 301 para outra URL, onde o arquivo é finalmente disponibilizado. Resolvemos este problema com um loop while, que continua solicitando a página enquanto receber códigos de redirecionamento, como 301 e 302. Após receber o arquivo, usamos a biblioteca JSON para fazer a análise sintática do JSON e uma expressão regular para limpar alguns itens desnecessários que a Amazon coloca nestas páginas:

Neste ponto do código já temos os dados que precisamos, mas queremos exibi-los de uma forma estruturada e elegante. Usaremos um layout HTML simples, e colocaremos as informações que precisamos dentro do layout:

É isso. O meu arquivo, com comentários e várias linhas de espaço, ficou com apenas 83 linhas de código. Vamos ver como fica o arquivo completo:

Agora, vamos executar o arquivo no terminal:

W1

Sucesso! Conseguimos atingir nosso objetivo. Lembrando que este post é uma introdução ao assunto e mostra apenas como obter os valores de um tipo de instância em uma determinada região AWS, mas nada impede que vocês modifiquem, melhorem e criem um software completo, capaz de consultar todas as regiões e tipos de instâncias.

Dúvidas? Comentários? Sugestões? É só escrever aqui embaixo. =)

Até a próxima!