第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 | 署名を作るために必要なパラメータ |
0 | 実行するAPI名である”Action”と”Timestamp” |
1 | HTTPパラメータすべて(HTTPメソッドや接続先のURIは含まない) |
2 | HTTPリクエスト全体(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ライブラリを利用することが簡単でしょう。さまざまな言語で利用できるライブラリがオープンソースとして公開されています。
ライブラリ | 説明 |
boto | Python言語で記述されたEucalyptus APIを操作可能なライブラリです。euca2oolsも内部でこのbotoを利用しています。 |
right_aws | Ruby言語で記述されたEucalyptus API、Walrus APIを操作可能なライブラリです。 |
Typica | Java言語で記述されたEucalyptus APIを操作可能なライブラリ。 |
jetS3t | Java言語で記述されたWalrus APIを操作可能なライブラリ。 |
■Amazon EC2とEucalyptusのAPI
Eucalyptusは、Amazon EC2 2009-04-04バージョンのAPIをサポートしています。ただし、一部のAPIは課金やモニタリングなど商用システムに特化したAPIであるため、Eucalyptusでは実装されていません。以下に、Eucalyptusで利用できるAmazon EC2互換のAPIをまとめておきます。
Eucalyptus API | 説明 |
RegisterImage | Walrusに登録されているイメージをEucalyptusに登録します。 |
DeregisterImage | 登録したイメージの登録を解除します。 |
RunInstances | 新しいインスタンスを起動します。 |
CreateKeyPair | 新しいキーペアを作成します。 |
DescribeKeyPairs | 所有するキーペアの一覧を表示します。 |
DeleteKeyPair | 指定したキーペアを削除します。 |
GetConsoleOutput | インスタンス起動時のコンソール出力を取得します。 |
TerminateInstances | 指定したインスタンスを停止します。 |
RebootInstances | 指定したインスタンスを再起動します。 |
DescribeInstances | 稼働中のインスタンス一覧を返却します。 |
DescribeImages | 所有するイメージの一覧を返却します。 |
CreateSecurityGroup | 新しいセキュリティグループを作成します。 |
DeleteSecurityGroup | 指定したセキュリティグループを削除します。 |
DescribeSecurityGroups | 作成したセキュリティグループの一覧を表示します。 |
AuthorizeSecurityGroupIngress | セキュリティグループに新しいファイアウォールルールを追加します。 |
RevokeSecurityGroupIngress | セキュリティグループからファイアウォールルールを削除します。 |
ModifyImageAttribute | 起動権限などのイメージの属性を変更します。 |
ResetImageAttribute | イメージの属性を初期化します。 |
DescribeImageAttribute | イメージの属性を表示します。 |
ConfirmProductInstance | 商用イメージを使用するために確認コードを生成します。 |
DescribeAvailabilityZones | Availability 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インスタンスをイメージとして保存します。 |
DescribeBundleTasks | Windowsのイメージ保存の状態を確認します。 |
CancelBundleTask | Windowsのイメージ保存の実行をキャンセルします。 |
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 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 | インスタンスが起動しているイメージのイメージID | emi-4ABBHG6 |
ami-launch-index | インスタンスの起動番号。インスタンス起動時の同時起動数によって変わる | 1 |
ami-manifest-path | 起動イメージのWalrus上のでの保存先 | /bucket/image.manifest.xml |
hostname | Eucalyptusの場合はパブリックIPが返却される | 192.168.1.10 |
instance-id | インスタンスのインスタンスID | i-88EADG45 |
instance-type | インスタンス起動時に指定したインスタンスタイプ | m1.large |
local-hostname | プライベートIPに紐づいたホスト名。Eucalyptusでホスト名有効オプションを設定すること | euca-10-1-1-10.eucalyptus.internal |
local-ipv4 | インスタンスのプライベートIP | 10.1.1.10 |
public-hostname | パブリックIPに紐づいたホスト名。Eucalyptusでホスト名有効オプションを設定すること | euca-192-168-1-10.eucalyptus.localhost |
public-ipv4 | インスタンスのパブリックIP | 192.168.1.10 |
reservation-id | インスタンス起動時に生成されるリザベーションID | r-A67FG231 |
kernel-id | インスタンスが利用しているカーネルイメージのイメージID | eki-9345FEC |
ramdisk-id | インスタンスが利用しているラムディスクイメージのイメージID | eri-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を操作して遊んでいます。 |