第7回:EucalyptusのAPIと認証


 XenやKVMなどの従来の仮想化技術とEucalyptusで構築するクラウドの大きな違いがAPIの提供の有無にあります。APIを利用することにより、プログラムからクラウドの操作を行うことが可能になります。これをProgrammable Infrastructureと呼び、負荷に応じたネットワーク構成、マシン構成の自動拡張などを可能にする概念となります。今回から何回かに分けて、Programmable Infrastructureについて説明します。今回はAPI全体の概要と、基本となる認証について説明します。

 

2つのAPI提供方式

 EucalyptusはAmazon EC2と互換のAPIを提供しています。このため同じAPIが利用できるならばクライアントも共用できるのではないかと考えられますが、実際は多くのAmazon EC2で利用可能なGUIクライアントをそのままEucalyptusで利用することはできません。

 なぜAPI互換なのにそのままクライアントを共用できないのでしょうか。その理由を理解するためにはまず、Amazon EC2、Eucalyptusで用意されているAPIの仕組みを学ぶ必要があります。

 Amazon EC2、Eucalyptusともに二つのAPI、SOAP APIとQuery APIを提供しています。どちらのAPIもできることはほとんど同じですが、APIを利用するためのプロトコルが異なります。SOAP APIは実行するAPI名やパラメータを記述したSOAP-XMLメッセージを送付し、APIの実行結果としてXMLメッセージを受け取ります。

 これに対してQuery APIではSOAPメッセージを送付する代わりにURLとリクエストパラメーターで構成されるHTTP URLリクエストを送付し、API実行結果としてXMLを受け取ります。

APIの種類

 ここで、euca2oolsを利用する際に設定したeucarcファイルの中身をもう一度確認してみましょう。eucarcではSOAP APIを利用するために必要な情報とQuery APIを利用するために必要な情報の両方が記載されています。

EUCA_KEY_DIR=$(dirname $(readlink -f ${BASH_SOURCE}))
export S3_URL=http://[Eucalyptusのホスト名]:8773/services/Walrus
export EC2_URL=http://[Eucalyptusのホスト名]:8773/services/Eucalyptus
# SOAP APIを利用するために必要な秘密鍵とX.509証明書
export EC2_PRIVATE_KEY=${EUCA_KEY_DIR}/euca2-admin-16bd899c-pk.pem
export EC2_CERT=${EUCA_KEY_DIR}/euca2-admin-16bd899c-cert.pem

export EC2_JVM_ARGS=-Djavax.net.ssl.trustStore=${EUCA_KEY_DIR}/jssecacerts
export EUCALYPTUS_CERT=${EUCA_KEY_DIR}/cloud-cert.pem

# Query APIを利用するために必要なAccessKey、SecretKey
export EC2_ACCESS_KEY='WKy3rMzOWPouVOxXXXXXXXXXXXXXXXXXXX'
export EC2_SECRET_KEY='cBmp0N0y0jMjgEPXXXXXXXXXXXXXXXXXXXXXX'

# This is a bogus value; Eucalyptus does not need this but client tools do.
export EC2_USER_ID='339620359000000000000000000000000000000'
alias ec2-bundle-image="ec2-bundle-image --cert ${EC2_CERT} --privatekey ${EC2_PRIVATE_KEY} --user 339620359000000000000000000000000000000 --ec2cert ${EUCALYPTUS_CERT}"
alias ec2-upload-bundle="ec2-upload-bundle -a ${EC2_ACCESS_KEY} -s ${EC2_SECRET_KEY} --url ${S3_URL} --ec2cert ${EUCALYPTUS_CERT}"

 

APIの認証

 Amazon EC2のAPIが利用可能なコマンドラインクライアントやGUIクライアントは数多く作成されていますが、その多くはQuery APIを使用しています。これはSOAP APIで利用するSOAPメッセージが単純なSOAPメッセージではなくWS-Security仕様に準じたセキュアなSOAPメッセージである必要があるからです。

 具体的には、X.509証明書を使って生成した署名をSOAP-ENV内に同梱するBinarySecurityToken方式を採用しています。これらの詳しい情報はAmazon EC2の開発者ドキュメントに記載されています。

 WS-Security仕様に準じたSOAPメッセージを生成することは比較的難しい処理となるため、多くのクライアントではURIの形式でリクエストが作成できるQuery APIを利用しています。

 Query APIは、HTTP URLリクエストの形式で実行するAPI名やパラメータを指定しますが、このときURLリクエスト内にURLエンコードによって作成したSignatureを付与して送付します。受け取ったクラウド側でも同じようにSignatureを生成し、両者のSignatureが同じ文字列になるかどうかで認証を行っています。

Query APIの認証

 Query APIでは、Signatureの生成方式として3つの生成方式を用意しています。それぞれSignatureVersion0,1,2としてSignatureを生成するまでの手順は同じですが、Signature生成のために利用する情報が異なります。

【SignatureVersionの違い】
SignatureVersion署名を作るために必要なパラメータ
0実行するAPI名である”Action”と”Timestamp”
1HTTPパラメータすべて(HTTPメソッドや接続先のURIは含まない)
2HTTPリクエスト全体(HTTPメソッドから接続先のURIすべてを含む)

 Query APIでは実際に利用するAPI名の他に、どのバージョンのSignature生成方式を利用したか、暗号化のアルゴリズムとして何を利用したかをそれぞれサーバーに送付します。

 Amazon EC2では、SignatureVersion2を利用することが推奨されています。ただし、SignatureVersion2ではHTTPリクエスト全体が署名に利用されてしまうため、HTTPメソッドの違いやホスト名の違い、暗号化のアルゴリズム等で認証に失敗することがあります。

 Eucalyptusは、SignatureVersion1/Version2をサポートしていますが、バージョンによってSignatureVersion2は動作しないことがあります。たとえば、最新版のEucalyptus 2.0では、SignatureVersion2はEucalyptusのバグにより動作しません。

 

Eucalyptusで使えるライブラリ

 EucalyptusのAPIを実行するためには、Amazon EC2/S3ライブラリを利用することが簡単でしょう。さまざまな言語で利用できるライブラリがオープンソースとして公開されています。

【Eucalyptusで利用できるライブラリ】
ライブラリ説明
botoPython言語で記述されたEucalyptus APIを操作可能なライブラリです。euca2oolsも内部でこのbotoを利用しています。
right_awsRuby言語で記述されたEucalyptus API、Walrus APIを操作可能なライブラリです。
TypicaJava言語で記述されたEucalyptus APIを操作可能なライブラリ。
jetS3tJava言語で記述されたWalrus APIを操作可能なライブラリ。

 

Amazon EC2とEucalyptusのAPI

 Eucalyptusは、Amazon EC2 2009-04-04バージョンのAPIをサポートしています。ただし、一部のAPIは課金やモニタリングなど商用システムに特化したAPIであるため、Eucalyptusでは実装されていません。以下に、Eucalyptusで利用できるAmazon EC2互換のAPIをまとめておきます。

【Eucalyptusで利用できるAmazon EC2互換API】
Eucalyptus API説明
RegisterImageWalrusに登録されているイメージをEucalyptusに登録します。
DeregisterImage登録したイメージの登録を解除します。
RunInstances新しいインスタンスを起動します。
CreateKeyPair新しいキーペアを作成します。
DescribeKeyPairs所有するキーペアの一覧を表示します。
DeleteKeyPair指定したキーペアを削除します。
GetConsoleOutputインスタンス起動時のコンソール出力を取得します。
TerminateInstances指定したインスタンスを停止します。
RebootInstances指定したインスタンスを再起動します。
DescribeInstances稼働中のインスタンス一覧を返却します。
DescribeImages所有するイメージの一覧を返却します。
CreateSecurityGroup新しいセキュリティグループを作成します。
DeleteSecurityGroup指定したセキュリティグループを削除します。
DescribeSecurityGroups作成したセキュリティグループの一覧を表示します。
AuthorizeSecurityGroupIngressセキュリティグループに新しいファイアウォールルールを追加します。
RevokeSecurityGroupIngressセキュリティグループからファイアウォールルールを削除します。
ModifyImageAttribute起動権限などのイメージの属性を変更します。
ResetImageAttributeイメージの属性を初期化します。
DescribeImageAttributeイメージの属性を表示します。
ConfirmProductInstance商用イメージを使用するために確認コードを生成します。
DescribeAvailabilityZonesAvailability Zoneの一覧を表示します。EucalyptusではクラスタがAvailability Zoneに当たります。
AllocateAddressパブリックIPを確保します。
ReleaseAddress所有しているパブリックIPを開放します。
DescribeAddresses所有しているパブリックIPの一覧を表示します。
AssociateAddress指定したインスタンスにパブリックIPを割り当てます。
DisassociateAddress指定したインスタンスからパブリックIPを取り外します。
CreateVolume新しいEBSボリュームを作成します。
DeleteVolume指定したEBSボリュームを削除します。
DescribeVolumes所有するEBSボリュームの一覧を返却します。
AttachVolume指定したインスタンスにEBSボリュームを取り付けます。
DetachVolume指定したインスタンスからEBSボリュームを取り外します。
CreateSnapshot指定したボリュームから新しいスナップショットを作成します。
DeleteSnapshotスナップショットを削除します。
DescribeSnapshots所有するスナップショットの一覧を返却します。
BundleInstance稼働中のWindowsインスタンスをイメージとして保存します。
DescribeBundleTasksWindowsのイメージ保存の状態を確認します。
CancelBundleTaskWindowsのイメージ保存の実行をキャンセルします。
DescribeRegionsリージョンの一覧を返却します。EucalyptusではEucalyptus、Walrusになります。

 

Amazon S3とWalrusのAPI

 Eucalyptusのコンポーネントの1つであるWalrusは、Amazon S3と互換のネットワークストレージ機能を提供しています。Amazon EC2と同様に、Walrusも課金イメージに関するAPIは実装されていません。

 以下に、WalrusとAmazon EC3のAPIをまとめます。なお、表はAmazon S3 2006-03-01のWSDLをベースに記述しています。

【Walrusで利用できるAmazon S3互換API】
Walrus API説明
GET Serviceユーザが所有するすべてのバケットの一覧を返却します。
GET Bucket acl指定したバケットのアクセス権を取得します。
PUT Bucket acl指定したバケットのアクセス権を設定します。
GET Object acl指定したオブジェクトのアクセス権を取得します。
PUT Object acl指定したオブジェクトのアクセス権を設定します。
PUT Bucket新しいバケットを作成します。
DELETE Bucket指定したバケットを削除します。
PUT Object新しいオブジェクトをPUTでアップロードします。
PUT Object (Copy)指定したオブジェクトをコピーします。
POST Object新しいオブジェクトをPOSTでアップロードします。
GET Object指定したオブジェクトをダウンロードします。
HEAD Object指定したオブジェクトの拡張情報(最終更新日やEtagなど)を返却します。
DELETE Object指定したオブジェクトを削除します。
GET Bucket (List Objects)指定したバケット内のオブジェクト一覧を返却します。
GET Bucket loggingバケットのログステータスを取得します。
PUT Bucket loggingバケットのログステータスを有効/無効に設定します。ログを有効にすると、バケットの操作ログが送受信情報に追加されます。
GET Bucket location指定したバケットが配置されるデータセンターの名称が返却されます。Eucalyptusの場合はUSが返却されます。
GET Bucket Object versions指定したバケット、オブジェクトのバージョン情報を返却します。
GET Bucket versioning指定したバケットがバージョン管理設定が有効かどうかを返却します。
PUT Bucket versioning指定したバケットのバージョン管理設定を設定します。バージョン管理を有効にすると、オブジェクトを削除する際に実ファイルは削除されず、削除マーカーが設定されるようになります。

 

メタデータAPI

 インスタンスにeuca2oolsをインストールすることで、Eucalyptusで提供されているAPIをインスタンスの内部から発行することができます。これを利用することで、インスタンスの負荷が高まった場合に自動的に自分のクローンを起動するといった自律的なインフラストラクチャを構成することができます。

 このとき、インスタンス自身が自分がどのようなイメージで、どんなインスタンスIDで起動しているかといった情報を取得するAPIがメタデータAPIとなります。
このAPIはCLCがどのようなホスト名で起動しているのか、どのようなIPで起動しているのかにかかわりなく以下URLににGETリクエストを送付することで、インスタンスの様々な情報を取得することができます。

 http://169.254.169.254/latest/meta-data/[取得するメタデータ名]

 以下に、メタデータとして取得できる情報の一覧をまとめます。

【メタデータ一覧】
メタデータ名説明
ami-idインスタンスが起動しているイメージのイメージIDemi-4ABBHG6
ami-launch-indexインスタンスの起動番号。インスタンス起動時の同時起動数によって変わる1
ami-manifest-path起動イメージのWalrus上のでの保存先/bucket/image.manifest.xml
hostnameEucalyptusの場合はパブリックIPが返却される192.168.1.10
instance-idインスタンスのインスタンスIDi-88EADG45
instance-typeインスタンス起動時に指定したインスタンスタイプm1.large
local-hostnameプライベートIPに紐づいたホスト名。Eucalyptusでホスト名有効オプションを設定することeuca-10-1-1-10.eucalyptus.internal
local-ipv4インスタンスのプライベートIP10.1.1.10
public-hostnameパブリックIPに紐づいたホスト名。Eucalyptusでホスト名有効オプションを設定することeuca-192-168-1-10.eucalyptus.localhost
public-ipv4インスタンスのパブリックIP192.168.1.10
reservation-idインスタンス起動時に生成されるリザベーションIDr-A67FG231
kernel-idインスタンスが利用しているカーネルイメージのイメージIDeki-9345FEC
ramdisk-idインスタンスが利用しているラムディスクイメージのイメージIDeri-872EEFC
security-groupsインスタンスが所属するセキュリティグループ名default
placement/availability-zoneインスタンスが所属するクラスター名cluster1

 

それぞれのAPIの詳細は次回で

 今回はEucalyptusの提供するAPIの認証の仕組みと、それぞれのコンポーネントが提供するAPIの概要について説明しました。

 これらのAPIを効果的に利用することで、使っていない仮想マシンは節電のために自動停止する、スケジュールに従って自動的に仮想マシンを起動停止するなどインフラストラクチャの自動化を実現することができます。

 次回からはそれぞれのAPIの詳細と利用方法について説明します。

 


羽深 修
Eucalyptus歴はまだ1年ですが、周囲からはEucalyptus中毒と勘違いされているようです。Japan Eucalyptus User Groupの活動に参加し、オープンソースカンファレンスでネタなどを披露しています。度々Eucalyptusへのパッチも書いてます。ちなみに仕事ではCentOS + Xenという環境でEucalyptusを利用していますが、自宅のEucalyptus環境はGentoo Linux + KVMで動かしています。

志田 隆弘
主にEucalyptusやクラウドとはあまり関係のない分野でちょこちょこと活動していました。Eucalyptusはバージョン 1.3の頃からいじり始め、かれこれ2年近くEucalyptusに浸かった生活をしています。Eucalyptus 1.4が出たタイミングで、Tanacasinoという名前のGUIクライアントを作ったりしていました。最新のEucalyptusで動作するので、ぜひ使ってみてください。

田中 智文
志田さんとともに初期の頃からEucalyptusの調査・検証・使用してきました。志田さんの作成したTanacasinoのメンテナンスと機能拡張を行っています。新婚ほやほやなので家でのハック活動時間が少ないですが、Walrus Clientを作ってみたりbotoを使ってEucalyptusを操作して遊んでいます。
関連情報
(羽深 修/志田 隆弘/田中 智文)
2010/12/17 06:00