fog (1)
最近、私は仕事でChefを使いました。Chefの中のKnifeと呼ばれるコマンドラインツールでは、幾つかのクラウドサービスに対応しています。
Launch Cloud Instances with Knife - Chef - Opscode Open Source Wiki
それはRubyのライブラリ「fog」を利用することで実現していました。
そこで第1回目の今回から数回に分けて、このfogについて調べたことを書いてみようと思います。
参考になるサイト
まずはfogの公式サイトとRubyGems.orgです。
また最近、Engine Yardのブログにおいて、fogの作者であるgeemus (Wesley Beary)さんによるfogの紹介記事がありました。
fogが対応しているクラウドサービス
fogは複数のクラウドサービスに対応しているようですが、それはFog::Computeクラスの子クラスから推測できます。(残念ながら、対応リストが探し出せませんでした)私は今までAWSしか利用したことがなく、中には聞いたことがない名前のものがありましたので、全部が実在のクラウドサービスを指しているのかは調べていません。
- AWS
- Bluebox
- Brightbox
- Ecloud
- GoGrid
- Linode
- NewServers
- Ninefold
- Rackspace
- Slicehost
- StormOnDemand
- VirtualBox
- Voxel
Rubyスクリプトによるデモ
今回は手始めとして、Amazon EC2のインスタンスの作成と終了までを実行してみます。
Region | ap-northeast-1 (東京) |
---|---|
Availability Zone | ap-northeast-1a |
AMI | ami-d8b812d9 (ebs/ubuntu-images/ubuntu-natty-11.04-i386-server-20110426) |
Instance Type | t1.micro |
なお、「x」による伏せ字になっているところは適宜置き換えが必要です。
# -*- encoding: utf-8 -*- require "rubygems" require "fog" compute = Fog::Compute.new(:provider => "AWS", :aws_access_key_id => "xxxxxxxxxxxxxxxxxxxx", :aws_secret_access_key => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", :region => "ap-northeast-1") puts "インスタンスを作成します" server = compute.servers.create(:availability_zone => "ap-northeast-1a", :flavor_id => "t1.micro", :image_id => "ami-d8b812d9", :key_name => "xxxxxxxxxx") puts "インスタンス(#{server.identity})を作成しました" server.wait_for { ready? } puts "インスタンス(#{server.identity})がrunning状態になりました" puts server.inspect puts "OSの起動を待ちます" sleep 60 puts "cat /etc/lsb-release コマンドを実行します" puts server.ssh("cat /etc/lsb-release").first.stdout puts "インスタンス(#{server.identity})を終了します" server.destroy
このRubyスクリプトを実行してみた結果はこのようになりました。(一部書き換え済み)
$ ruby run_and_terminate_instance.rb インスタンスを作成します インスタンス(i-1e50291f)を作成しました インスタンス(i-1e50291f)がrunning状態になりました <Fog::Compute::AWS::Server id="i-1e50291f", ami_launch_index=0, availability_zone="ap-northeast-1a", block_device_mapping=[{"deviceName"=>"/dev/sda1", "volumeId"=>"vol-a87b97c2", "status"=>"attached", "attachTime"=>2011-06-30 16:59:56 UTC, "deleteOnTermination"=>true}], client_token=nil, dns_name="ec2-175-41-199-148.ap-northeast-1.compute.amazonaws.com", groups=[nil], flavor_id="t1.micro", image_id="ami-d8b812d9", kernel_id="aki-d209a2d3", key_name="xxxxxxxxxx", created_at=2011-06-30 16:59:37 UTC, monitoring=[{"state"=>false}], product_codes=[], private_dns_name="ip-10-146-90-204.ap-northeast-1.compute.internal", private_ip_address="10.146.90.204", public_ip_address="175.41.199.148", ramdisk_id=nil, reason=nil, root_device_name=nil, root_device_type="ebs", state="running", state_reason={}, subnet_id=nil, tags={}, user_data=nil > OSの起動を待ちます cat /etc/lsb-release コマンドを実行します DISTRIB_ID=Ubuntu DISTRIB_RELEASE=11.04 DISTRIB_CODENAME=natty DISTRIB_DESCRIPTION="Ubuntu 11.04" インスタンス(i-1e50291f)を終了します
まとめ
簡単なコードでAmazon EC2のインスタンスの作成から終了までが実現できます。
次回は、fog内部のコードに踏み込んで調べてみたいと思います。