プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Twitterの呟きでAmazon EC2のインスタンスを起動するスクリプト

 JAWS-UG Advent Calendar 2013の13日目です。ついでに独りでAdvent Calendarに挑戦中です。


 AWSの費用を抑えるコツは、使っていないインスタンスをこま目に停止することです。例えば開発機として利用しているのであれば、出社した時に起動して退社時に停止するのが理想です。しかし、わざわざマネージメントコンソールにログインするの面倒くさいですね。私だったら、3日で手運用していることを忘れてしまいます。そんなモノグサちゃんでもちゃんと節約する方法を伝授します。Twitterによる起動停止です。

Twitterによるインスタンスの起動と停止



 指定したユーザの特定の単語に反応して起動と停止するスクリプト例です。
起動・停止するインスタンスは、EC2のUserというタグ名でTwitterのユーザ名を設定しているインスタンスです。タグ指定なので、複数台でも起動出来ます。


gemからtwitterとaws-sdkをインストールしてください。後は、それぞれの認証トークンを取得してください。

require 'twitter'
require 'aws-sdk'

ACCESS_KEY = 'your aws access_key'
SECRET_KEY = 'your aws secret_key'
EC2_REGION = 'ec2.ap-northeast-1.amazonaws.com'

TWITTER_USER_NAME = "your twitter user name"

def get_timeline
  config = {
    :consumer_key => "twitter consumer_key",
    :consumer_secret => "twitter consumer_secret",
    :oauth_token => "twitter oauth_token",
    :oauth_token_secret => "twitter oauth_token_secret"
  }
  client = Twitter::REST::Client.new(config)
  client.user_timeline(TWITTER_USER_NAME).each {|res|
    if res.text.include?("働きたくないでござる")
      run_instance
    elsif res.text.include?("ビールなう")
      stop_instance
    end
  }
end

def run_instance
  p "run instance"
  ec2 = AWS::EC2.new(
    :access_key_id => ACCESS_KEY,
    :secret_access_key => SECRET_KEY,
    :ec2_endpoint => EC2_REGION
  )
  ec2.instances.each do |instance|
    if instance.status == :stopped && instance.tags[:User] == TWITTER_USER_NAME
      instance.start
      p "#{instance.tags[:Name]} send run signal"
    end
  end
end

def stop_instance
  p "stop instance"
  ec2 = AWS::EC2.new(
    :access_key_id => ACCESS_KEY,
    :secret_access_key => SECRET_KEY,
    :ec2_endpoint => EC2_REGION
  )
  ec2.instances.each do |instance|
    if instance.status == :running && instance.tags[:User] == TWITTER_USER_NAME
      instance.stop
      p "#{instance.tags[:Name]} send stop signal"
    end
  end
end

get_timeline

※やっつけで作ったスクリプトなので、後日修正します。


 このスクリプトをどこかのサーバで定期的に動かしておけば、Twitterからインスタンスの操作が出来るようになります。管理のためだけに常時インスタンスを立ち上げるのが勿体無いというのであれば、Herokuで定期起動といったことも出来ます。
 ちなみに、このスクリプトの問題点として、タイムラインのどこまで取得済みかのステータスを持っていないということがあります。Twitterのタイムライン取得のオプションで、Sinceというものがあるのでそこで最終取得を指定してあげれば未処理のタイムラインのみ取得出来るようになります。問題は、そのステータスをどこに保存するかですね。SNS,SQS,SWF辺りを上手く使えばスマートに出来ると思います。時間作って、その辺りのコードもアップしようと思います。

まとめ



 今回のエントリーは、完全にネタです。しかし、人間ちょっと面倒くさいと思えるものは、やらなくなると言うのも事実です。また仮にやるとしても、やる気を振り絞る必要があるので心の力を消費します。であれば、面倒くさいと感じない方法を用意しておくべきです。その一例として、今回はTwitterのつぶやきによる起動を作りました。例え小さなことでも、自分もしくはチームのメンバーが心地よく働けるような仕組みを考えてみるのも良いのではないでしょうか?AWSはAPIが完備しているので、きっと色々な手助けをしてくれますよ。



See Also:
Herokuを使って無料のジョブサーバを構築する
AWSでブラックリスト型のFirewallを実装する。〜BlackList Firewallパターン〜


参照:
JAWS-UG Advent Calendar 2013