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日です ✌(՞ਊ ՞)✌

.


  1. 「無い」っていうか、値が変わらないんだから API で取得する必要がないと言うのが正しいですかね [return]