第21回:Eucalyptusの仕組み(1)


 本連載では読者の皆様に「まずはEucalyptusに触れて理解して頂こう」という趣旨のもとで進めてきたため、Eucalyptusの詳細についてはあまり触れてきませんでした。今回から、Eucalyptusの各機能の仕組みについて触れていき、それによってEucalyptusに対する理解を深めていきたいと思います。

想定シナリオ

 Eucalyptusで構築されたIaaS環境を利用者が使う場合は色々な利用シナリオがあると思いますが、今回から数回にわけて解説するEucalyptusの仕組みは以下の操作および作業を想定し解説していきます。

想定シナリオの概要図

 今回はこの図の「マシンイメージの登録」と「ユーザーの登録」と「キーペアの作成」と「インスタンスの保存」を説明します(後で述べるように「マシンイメージの登録」と「インスタンスの保存」の処理は重なる部分が多いため、今回の解説で「インスタンスの保存」を扱います)。

 Eucalyptusが扱うLinuxのマシンイメージは「マシンイメージ本体」「カーネルイメージ」「RAMディスクイメージ」の3つから成り、マシンイメージ本体は一般ユーザでも登録が可能ですが、カーネルイメージとRAMディスクイメージは管理者権限を持つユーザーでないと登録ができないようになっています。したがって、Eucalyptus環境を構築したあとは、まず最初にカーネルイメージとRAMディスクイメージを登録し、そのシステムでのデフォルトイメージにします。なお、システムでのデフォルトのカーネルイメージとRAMディスクイメージはWeb管理画面にて確認および変更ができます。

 本連載の第3回でも少し触れましたが、マシンイメージをEucalyptusに登録する場合は「バンドル」「アップロード」「登録」という3つの作業が必要となります。まず最初の「バンドル」の仕組みについて説明します(正確には「バンドル」の作業はEucalyptusが行なうのではなくeuca2oolsが行なう処理ですが併せて説明します)。

 

マシンイメージのバンドルの仕組み

 「バンドル」にはイメージファイルをバンドルするeuca-bundle-imageコマンドと、稼動しているLinuxをバンドルする──つまりインスタンスを保存するeuca-bundle-volコマンドの2つがあります(euca2oolsにはコマンドだけ用意されていてEucalyptus 2.0系には実装されていませんが、稼動しているWindowsをバンドルするeuca-bundle-instanceというコマンドもあります)。

 euca-bundle-imageはイメージファイルを「圧縮」→「暗号化」→「分割」という順番で処理し、一方のeuca-bundle-volは「イメージファイル化」→「圧縮」→「暗号化」→「分割」という手順で処理します。最初の「イメージファイル化」を除けばeuca-bundle-imageとeuca-bundle-volはほぼ同じ処理をします。

euca-bundle-imageとeuca-bundle-vol

◆イメージファイル化

 まずはeuca-bundle-volがイメージファイルを作成する仕組みですが、空のイメージファイルを作成し指定されたパス(デフォルトは/)配下のファイルを格納します。このときに作成する空のイメージファイルは指定されたサイズもしくはデフォルト値の10GBで作成されますが、当然ながら指定されたパス配下が指定されたサイズもしくは10GB以上あるとエラーになります(Eucalyptusおよびeuca2oolsは過去のAmazon EC2に倣い、扱えるマシンイメージの最大サイズは10GBまでとなっています)。

 euca-bundle-volコマンドは--no-inheritオプションが指定されない限り、メタデータのURL「http://169.254.169.254/latest/meta-data/」へアクセスしインスタンス情報を取得します。これにより、現在使用しているカーネルディスクやRAMディスクをインスタンス情報から求めたり、作成するマシンイメージの元になる──つまり現在euca-bundle-volを実行しているインスタンスIDを取得します。逆にeuca-bundle-volコマンドをインスタンス以外、例えば物理マシンなどで実行している場合は、--no-inheritオプションを指定しないとエラーになります。

◆圧縮→暗号化→分割

 圧縮処理では指定されたイメージファイルをtar+gzipします。暗号化処理では圧縮されたイメージファイルをAES-128-CBCという方式で暗号化します。分割処理では暗号化処理を施されたファイルを10MB単位で分割し、「[イメージファイル名].part.連番」というファイル名で出力していきます。

◆マニフェストファイルの生成

 「バンドル」作業の一番最後に「マニフェストファイル」を生成します。このファイルは以下のような内容になっており、マシンイメージに関する各種パラメータや前述の10MB単位で分割処理されたファイルのチェックサムが記述されています。

<?xml version="1.0"?>
<manifest>
  <version>2007-10-10</version>
  <bundler>
    <name>euca-tools</name>
    <version>1.3</version>
    <release>31337</release>
  </bundler>
  <machine_configuration>
    <architecture>x86_64</architecture>
    <kernel_id>eki-6FB512F5</kernel_id>
    <ramdisk_id>eri-A9C013DE</ramdisk_id>
  </machine_configuration>
  <image>
    <name>ubuntu-11.04-server-amd64-Base-20110730.img</name>
    <user>339620359306901985561958186406435160074</user>
    <type>machine</type>
    <digest algorithm="SHA1">da39a3ee5e6b4b0d3255bfef95601890afd80709</digest>
    <size>1610612736</size>
    <bundled_size>377790416</bundled_size>
    <ec2_encrypted_key algorithm="AES-128-CBC">7060~(省略)~b44b</ec2_encrypted_key>
    <user_encrypted_key algorithm="AES-128-CBC">7d2d~(省略)~d244</user_encrypted_key>
    <ec2_encrypted_iv>69d4~(省略)~e027</ec2_encrypted_iv>
    <user_encrypted_iv>5fdd~(省略)~b2b1</user_encrypted_iv>
    <parts count="37">
      <part index="0">
        <filename>ubuntu-11.04-server-amd64-Base-20110730.img.part.0</filename>
        <digest algorithm="SHA1">047c1ae61c7e6221c8551157542ec0813d36702e</digest>
      </part>
    </parts>
  </image>
  <signature>60e7~(省略)~48cd</signature>
</manifest>

 

ちなみにバンドルではインスタンスがメタデータを取得する場合を除き、Eucalyptusには何らアクセスしません。

 

マシンイメージのアップロードの仕組み

 マシンイメージをeuca-upload-bundleでWalrusにアップロードする際は、まずeuca-upload-bundleがオプションで指定されたバケット名が既にWalrusに存在するか否かをチェックします。指定されたバケットが既に存在し、アクセス権限があれば処理を継続しますが、アクセス権限がない場合はエラーになり処理が中断します。なお、指定されたバケットが存在しない場合はバケットを作成します。

 バケットの準備が整ったら、まずマニフェストファイルをアップロードし次に分割されたファイルをアップロードします。

 ちなみに、マシンイメージのアップロードではEC2 APIは使わず、S3 APIのみ使用します。

 

マシンイメージの登録の仕組み

 マシンイメージの登録にはeuca-registerコマンドを使用するか、EC2 APIのRegisterImageを使用します。RegisterImageが発呼されるとEucalyptusは指定されたマニフェストに従って、アップロードされている分割マシンイメージの整合性チェックを行ないます。チェックの結果に問題がなければ分割マシンイメージを結合→複号→展開という処理を行ない、キャッシュファイルとして素のマシンイメージをWalrusに保持します。

 なお、このキャッシュファイルとしての素のマシンイメージを作成する際に、Web管理画面の「Walrus Configuration」の項目「Space reserved for unbundling images (MB)」に設定されている値(デフォルト値は30720MB)をチェックし、キャッシュファイルが消費しているディスクサイズがその値以上であれば古いキャッシュファイルを削除します。

 ちなみに、Walrusがキャッシュファイルとして素のマシンイメージを作成/保持するタイミングには、このRegisterImageが発呼された場合やもしくはインスタンス起動時にWalrusにキャッシュファイルが存在しない場合などがあります。

 

ユーザの登録

 次にEucalyptusを利用するユーザの登録についてですが、ユーザを登録する方法には以下の3つの方法があります。

・CLC上で管理コマンド「euca-add-user」で登録
・Eucalyptusの管理者がWeb管理画面で登録
・Eucalyptusを利用したいユーザがWeb管理画面でユーザ登録を申請

 以下に、それぞれの処理の流れを示します。

ユーザ登録の流れ

 Eucalyptusに登録できるユーザ名の文字種は英数字とハイフンとドットとアットマークとアンダースコアで、文字長は30文字までとなっています。なお、「eucalyptus」というユーザ名は予約名になっているため使用できません。

 

キーペアの作成

 ユーザがインスタンスを起動する際にはキーペアの指定が必要なため、事前にキーペアを作成しておきます。正確には指定しなくても起動できますが、インスタンスがLinuxの場合で公開鍵認証を用いてSSH接続する場合は、このキーペアの仕組みを利用することをお勧めします。

 キーペアを作成するにはeuca-add-keypairコマンドを使用するか、もしくはEC2 APIのCreateKeyPairを使用します。

 euca-add-keypairコマンドで作成する場合は、標準出力に秘密鍵が出力されるため、以下のように任意のファイルにリダイレクトします。なお、euca-add-keypairコマンドは出力の1行目に鍵のフィンガープリントを出力しますが、PuTTYgenで秘密鍵を変換する場合はこの1行目の情報が邪魔になるため削除してください。

euca-add-keypair KEYPAIR_NAME > ~/.ssh/KEYPAIR_NAME.pk

 

 ちなみに、キーペア名には任意の文字列が指定でき文字長にも制限がありませんが、あまり長すぎたりeuca2oolsなどで利用するのに不便な名前をキーペア名に指定すると後々取り回しが不便になります。

 

次回はインスタンスを起動する仕組みについて

 今回はユーザがインスタンスを起動するまでに必要となる準備作業に関する仕組みについて解説しました。次回は登録したマシンイメージを起動する仕組みについて解説します。

 なお、報告が遅くなりましたが、去る6月24日に国立情報学研究所で第52回GRACEセミナーが開催されました。筆者も「Eucalyptusで作るプライベートクラウド構築」というタイトルで講演させていただきました。また、そのときの様子がedubaseStreamというサービスで公開されていますので、あわせてご覧いただければと存じます。


羽深 修
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を操作して遊んでいます。

 

関連情報
(羽深 修/志田 隆弘/田中 智文)
2011/8/5 06:00