Eucalyptus Advent Calendar 2012 JP 十七日目
手抜きじゃないよ?省力化だよ?
同僚から「最近の Advent Calendar の内容薄くなってね?」とツッコまれました内気な少年の羽深です。ほんと危うく思い詰めるところでしたよ。取り扱い注意なガラスの心なんですよ、まったく。
Eucalyptus を fog に巻く
巷では Ruby によるクラウドサービスライブラリの「fog」が流行っているようなので、「EC2/S3/IAM API 互換」と言っている Eucalyptus でも使えるんじゃね?ということで fog で Eucalyptus を利用してみました。
まぁ、「fog に巻く」っていうタイトルにした割には内容が薄くて全然巻けていなくて、さすがのブライトさんも怒れないレベルの薄さですよ、どうせ。
ちなみに参考にしたドキュメント類は、fog のドキュメントとソースコードと以下のブログです。ありがとうございます。
インストール方法ですが、以下のとおりです。うん簡単。
gem install fog
で、簡単なサンプルとして以下のようなコードを書いてみました。
#!/usr/bin/ruby
require 'rubygems'
require 'fog'
compute = Fog::Compute.new({
:provider => 'AWS',
:aws_access_key_id => 'WKy3rMzOWPouVOxK1p3Ar1C2uRBwa2FBXnCw',
:aws_secret_access_key => 'yxXm3RXPl97GPRSpWrHJduejS323WqZL0Mw',
:endpoint => 'http://172.16.34.10:8773/services/Eucalyptus',
:region => 'Eucalyptus',
})
puts compute.servers.inspect
で、これを実行すると以下のような結果がびろびろ~んと出てきます。
<Fog::Compute::AWS::Servers
filters={}
[
<Fog::Compute::AWS::Server
id="i-4997090C",
ami_launch_index=0,
availability_zone="amesha-spenta",
block_device_mapping=[],
network_interfaces=[],
client_token=nil,
dns_name="172.16.34.37",
ebs_optimized=nil,
groups=[],
flavor_id="c1.medium",
iam_instance_profile={},
image_id="emi-92D1136B",
kernel_id="eki-246C15D8",
key_name="mammoth",
created_at=Mon Dec 03 07:51:10 UTC 2012,
monitoring=false,
placement_group=nil,
platform=nil,
product_codes=[],
private_dns_name="10.168.2.9",
private_ip_address=nil,
public_ip_address=nil,
ramdisk_id="eri-84BE1735",
reason=nil,
root_device_name=nil,
root_device_type=nil,
security_group_ids=[],
state="running",
state_reason={},
subnet_id=nil,
tenancy=nil,
tags={},
user_data=nil,
vpc_id=nil
>,
(中略)
]
>
ちなみに Fog::Compute::AWS#servers ではなく Fog::Compute::AWS#flavors を取得すると
[ <Fog::Compute::AWS::Flavor
id="t1.micro",
bits=0,
cores=2,
disk=0,
name="Micro Instance",
ram=613
>,
(省略)
って感じの…あれあれ?存在しない VM Type が返ってくる…。でコード(fog-1.8.0/lib/fog/aws/models/compute/flavors.rb)を確認すると、
module Fog
module Compute
class AWS
FLAVORS = [
{ :bits => 0, :cores => 2, :disk => 0, :id => 't1.micro', :name => 'Micro Instance', :ram => 613},
{ :bits => 32, :cores => 1, :disk => 160, :id => 'm1.small', :name => 'Small Instance', :ram => 1740.8},
{ :bits => 32, :cores => 2, :disk => 400, :id => 'm1.medium', :name => 'Medium Instance', :ram => 3750},
{ :bits => 64, :cores => 4, :disk => 850, :id => 'm1.large', :name => 'Large Instance', :ram => 7680},
{ :bits => 64, :cores => 8, :disk => 1690, :id => 'm1.xlarge', :name => 'Extra Large Instance', :ram => 15360},
{ :bits => 32, :cores => 5, :disk => 350, :id => 'c1.medium', :name => 'High-CPU Medium', :ram => 1740.8},
{ :bits => 64, :cores => 20, :disk => 1690, :id => 'c1.xlarge', :name => 'High-CPU Extra Large', :ram => 7168},
(省略)
あぁ、そうか、EC2 API には flavor 情報を取得する API が無い1んだから、定数にしちゃえば OK なのか。Eucalyptus の場合は DescribeAvailabilityZones の verbose オプション指定時の結果を利用するような provider を書けばいいんですが、折角「API 互換」と謳っているのに、専用に provider を書いたら負けな気がするので、今日はこれまで。
あ、ちなみに上記のサンプルでは :endpoint に http でエンドポイント URL を書いてますが、https にすると証明書のバリデーションが失敗して
/usr/lib64/ruby/gems/1.8/gems/excon-0.16.10/lib/excon/ssl_socket.rb:60:in `connect': Unable to verify certificate, please set `Exs[:ssl_ca_path] = path_to_certs`, `Excon.defaults[:ssl_ca_file] = path_to_file`, or `Excon.defaults[:ssl_verify_peer] = false` (l. (Excon::Errors::SocketError)
from /usr/lib64/ruby/gems/1.8/gems/excon-0.16.10/lib/excon/ssl_socket.rb:60:in `initialize'
from /usr/lib64/ruby/gems/1.8/gems/excon-0.16.10/lib/excon/connection.rb:364:in `new'
from /usr/lib64/ruby/gems/1.8/gems/excon-0.16.10/lib/excon/connection.rb:364:in `socket'
from /usr/lib64/ruby/gems/1.8/gems/excon-0.16.10/lib/excon/connection.rb:192:in `request_kernel'
from /usr/lib64/ruby/gems/1.8/gems/excon-0.16.10/lib/excon/connection.rb:103:in `request'
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/core/connection.rb:21:in `request'
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/aws/compute.rb:383:in `_request'
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/aws/compute.rb:378:in `request'
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/aws/requests/compute/describe_instances.rb:76:in `describe_instances
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/aws/models/compute/servers.rb:64:in `all'
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/core/collection.rb:130:in `lazy_load'
from /usr/lib64/ruby/gems/1.8/gems/fog-1.8.0/lib/fog/core/collection.rb:11:in `each'
from /usr/lib64/ruby/1.8/pp.rb:195:in `__send__'
from /usr/lib64/ruby/1.8/pp.rb:195:in `seplist'
from /usr/lib64/ruby/1.8/pp.rb:303:in `pretty_print'
from /usr/lib64/ruby/1.8/prettyprint.rb:201:in `group'
from /usr/lib64/ruby/1.8/prettyprint.rb:227:in `nest'
from /usr/lib64/ruby/1.8/prettyprint.rb:200:in `group'
from /usr/lib64/ruby/1.8/prettyprint.rb:212:in `group_sub'
from /usr/lib64/ruby/1.8/prettyprint.rb:199:in `group'
from /usr/lib64/ruby/1.8/pp.rb:302:in `pretty_print'
from /usr/lib64/ruby/1.8/pp.rb:140:in `pp'
from /usr/lib64/ruby/1.8/prettyprint.rb:201:in `group'
from /usr/lib64/ruby/1.8/prettyprint.rb:227:in `nest'
from /usr/lib64/ruby/1.8/prettyprint.rb:200:in `group'
from /usr/lib64/ruby/1.8/prettyprint.rb:212:in `group_sub'
from /usr/lib64/ruby/1.8/prettyprint.rb:199:in `group'
from /usr/lib64/ruby/1.8/pp.rb:140:in `pp'
from /usr/lib64/ruby/1.8/pp.rb:77:in `pp'
from /usr/lib64/ruby/1.8/pp.rb:119:in `guard_inspect_key'
from /usr/lib64/ruby/1.8/pp.rb:77:in `pp'
from /usr/lib64/ruby/1.8/pp.rb:60:in `pp'
from /usr/lib64/ruby/1.8/pp.rb:59:in `each'
from /usr/lib64/ruby/1.8/pp.rb:59:in `pp'
from fog-test1.rb:15
なんて素敵なエラーが吐かれますのでご注意を。
クリスマスまであと8日です ✌(՞ਊ ՞)✌
.
- 「無い」っていうか、値が変わらないんだから API で取得する必要がないと言うのが正しいですかね [return]