Apache Libcloudでクラウドサービスへアクセスする

2012.02.09

クラウド・ロックイン

ユーザーにとってクラウドベンダによるロックインは、クラウドを利用する際のリスクの1つとなっています。
例えば、現在のシステムではA社のクラウドストレージを使用しているが、将来B社のクラウドストレージにするといった場合、
依存するライブラリやAPIなどを簡単に変更できるでしょうか?

ケント・ベック氏は以下のようにいっています。


「こう考えると、クラウドによるデータとアプリケーションのロックインは非常に強力なものがあります。
いちど特定のクラウドで大規模なデータの管理やアプリケーションの運用を始めたら、
ずっとそのクラウドを使うことを覚悟しなければなりません。」
(http://www.publickey1.jp/blog/09/post_27.htmlより引用)

それを解消するための1つの策として、クラウドサービスを抽象化しようという取り組みがあります。
これが本日ご紹介するApache Libcloudです。

Apache Libcloudとは

LibcloudはPython用ライブラリで、20種類以上のクラウドサービスに対応した共通のインタフェースを提供しています。
Amazon EC2、Rackspace、IBM Cloudなど、主要なクラウド事業者に対応しています。
これを用いると、単一のAPIを利用することで、どのクラウドサービスでも動くアプリケーションを一度の記述で作成することが可能です。
では動作を確認してみましょう。

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.2
  • Python: 2.7

動かしてみよう

まずはcurlを使ってeasy_install(RubyのGemみたいなの)をインストールします。
その後easy_installでpip(これもパッケージ管理システム)をインストールし、pipでlibcloudをインストールしましょう。

$ curl -O http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py
$ sudo easy_install pip
$ sudo pip install apache-libcloud  

次にtest.pyファイルを作成します。今回はAWSのEC2とS3に対してアクセスし、情報を取得するだけです。
ファイルの先頭から順番にみていきます。

まず必要なパッケージをimportします。
LibcloudはCompute,Strage,Load-balancers,DNSとライブラリのパッケージが分かれており、
libcloud.compute.*がEC2などのマシンに関連するパッケージで、libcloud.storage.*がS3などのストレージに関連するパッケージです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#import
from libcloud.compute.types import Provider as ec2_provider
from libcloud.compute.providers import get_driver as get_ec2_driver

from libcloud.storage.types import Provider as s3_provider
from libcloud.storage.providers import get_driver as get_s3_driver

import libcloud.security

次にAWSへのアクセスキーを定義しておきます。
その下でlibcloud.security.VERIFY_SSL_CERT = Falseとしています。
libcloudではクラウドにアクセスするためにデフォルトで中間証明書を必要としますが、テストのための証明書なしでアクセスできるようにしています。
このため、このプログラムを実行すると警告がでます。実運用では中間証明書を指定して使用しましょう。

#アクセスキー
EC2_ACCESS_ID = 'EC2のアクセスキー'
EC2_SECRET_KEY = 'EC2のシークレットキー'

libcloud.security.VERIFY_SSL_CERT = False

EC2とS3それぞれ、Providerを指定してDriverを取得し、キーを指定してクラウドへ接続しています。
(リージョンはTokyoを指定)

#ec2
ec2Driver = get_ec2_driver(ec2_provider.EC2_AP_NORTHEAST)
ec2 = ec2Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)

#s3
s3Driver = get_s3_driver(s3_provider.S3_AP_NORTHEAST)
s3 = s3Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)

クラウドへ接続したら、ノード情報やコンテナ情報を取得するメソッドで情報を取得することができます。
プログラムからマシンのインスタンスを作成したり、アップロードすることも可能です。
詳しくはここをご確認ください。

#名前やIPなど、マシンの基本情報取得
nodes = ec2.list_nodes()
print("list_nodes-----------------")
print(nodes)

#AWSでいうS3のバケット情報取得
s3cons = s3.list_containers()
print("list_containers-----------------")
print(s3cons)

使用したtest.pyサンプルの全文です。
実行はコンソール上でpython test.pyとしてください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from libcloud.compute.types import Provider as ec2_provider
from libcloud.compute.providers import get_driver as get_ec2_driver

from libcloud.storage.types import Provider as s3_provider
from libcloud.storage.providers import get_driver as get_s3_driver

import libcloud.security

EC2_ACCESS_ID = 'EC2のアクセスキー'
EC2_SECRET_KEY = 'EC2のシークレットキー'

libcloud.security.VERIFY_SSL_CERT = False

#ec2
ec2Driver = get_ec2_driver(ec2_provider.EC2_AP_NORTHEAST)
ec2 = ec2Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)

#s3
s3Driver = get_s3_driver(s3_provider.S3_AP_NORTHEAST)
s3 = s3Driver(EC2_ACCESS_ID, EC2_SECRET_KEY)

#名前やIPなど、マシンの基本情報取得
nodes = ec2.list_nodes()
print("list_nodes-----------------")
print(nodes)

#AWSでいうS3のバケット情報取得
s3cons = s3.list_containers()
print("list_containers-----------------")
print(s3cons)

まとめ

今回はApache Libcloudを用いて汎用APIでAWSにアクセスしてみました。
接続先とキーを変更すれば、同じAPIでEucalyptus等にもアクセス可能です。
ドキュメントなどはまだまだ足りない印象がありますが、昨年Apacheのトップレベルプロジェクトに昇格したこともあり、
今後の発展が見込まれます。

参考サイトなど