AWS互換APIや外部ツールでOpenStackを操作する

OpenStackではRESTベースのAPIを使用してインスタンスやオブジェクトストレージの操作や管理が行える。提供されるAPIは独自のものだけでなくAmazon Web Services(AWS)互換のものもあり、EC2やS3に対応するクライアントなどからの操作が可能だ。本記事では、OpenStackでこのようなAPIを利用する方法や、OpenStackの操作に利用できるツールを紹介する。

IaaSのメリットの1つであるAPIを活用する

Amazon Web Services(AWS)やGoogle App Engineのようなクラウドサービスの特徴の1つに、外部からクラウドを操作できるAPIが提供されている点がある。これらを利用することで、クラウドを管理・操作するための独自ツールを容易に作成できる。たとえばAWSではこれらAPIを使ったサードパーティ製の管理用ツールが複数リリースされており、またスクリプトを利用したバッチ処理なども広く行われている。

OpenStackでもこのような外部からアクセスできるAPIが用意されており、その一覧はOpenStackのWebサイトで確認できる。基本的にこれらのAPIはOpenStack独自の仕様になっているが、AWS互換のAPIも一部提供されている。これにより、OpenStackで構築されたクラウド環境をAWS対応のツールやライブラリで操作することが可能になっている。ただし、OpenStackとAWSは完全な互換性があるわけではないため、一部利用できないAPIもある点には注意が必要だ。また、逆にAWSのAPIでは操作できないOpenStackの機能もある。

OpenStackで利用できるAWSのAPI

OpenStackでは、AWSのうちOpenStackのNovaに相当する「EC2」と、Swiftに相当する「S3」の互換APIが提供されている。EC2のAPIでは仮想マシンの起動や停止と行った操作やボリュームの割り当てといった操作が行える。また、S3のAPIではオブジェクトのアップロード/ダウンロードや一覧取得、コンテナの作成といった処理が可能だ。

EC2のAPIはNovaのAPIサービスであるnova-apiによって提供されている。また、S3のAPIはSwiftのプロクシサービスであるswift-proxyによって提供されている。そのため、互換APIを利用するためにはこれらのサービスが動作している必要がある。また、それぞれいくつかの追加設定も必要だ。以下では、まずこれらの設定について説明しておこう。

OpenStackでEC2互換APIを利用するための設定

OpenStackでEC2互換APIを利用するには、まずKeystoneでEC2サービス用のユーザーおよびサービスを作成しておくとともに、エンドポイントを登録しておく必要がある。これらの作業は、以下のようにコマンドを実行することで実行できる。

export OS_USERNAME=<管理用ユーザー>
export OS_TENANT_NAME=<管理用のテナント名>
export OS_PASSWORD=<管理用ユーザーのパスワード>
export OS_AUTH_URL=http://<keystoneが稼働しているホスト名>:5000/v2.0/

EC2_HOST_PUB=<nova-apiサービスが稼働しているホスト名(パブリックネットワーク側>
EC2_HOST_INT=<nova-apiサービスが稼働しているホスト名(プライベートネットワーク側>
PASSWORD=<ec2ユーザーのパスワード>
TENANT_NAME=<サービス用のテナント名>

# 管理者ロールIDおよびテナントIDの取得
ADMIN_ROLE=$(keystone role-list | awk '/admin/ {print $2}')
TENANT_ID=$(keystone tenant-list | awk "/$TENANT_NAME/ {print \$2}")

# ec2ユーザーの作成
keystone user-create --tenant-id $TENANT_ID --name ec2 --pass $PASSWORD
EC2_USER=$(keystone user-list | awk '/ ec2 / {print $2}')
keystone user-role-add --user-id $EC2_USER --tenant-id $TENANT_ID --role-id $ADMIN_ROLE

# ec2サービスの登録
keystone service-create --name=ec2 --type=ec2 --description="EC2 Compatibility Layer"
EC2_ID=$(keystone service-list | awk '/ ec2 / {print $2}')

# エンドポイントの作成
keystone endpoint-create --region RegionOne --service_id $EC2_ID --publicurl=http://$EC2_HOST_PUB:8773/services/Cloud --internalurl=http://$EC2_HOST_INT:8773/services/Cloud --adminurl=http://$EC2_HOST_INT:8773/services/Admin

ここで、EC2_HOST_PUB変数にはnova-apiサービスが稼働しているホストのパブリックネットワーク側ホスト名もしくはIPアドレスを、EC2_HOST_INT変数にはほかのOpenStackコンポーネントが稼働しているホストからアクセスできるプライベートネットワーク側ホスト名もしくはIPアドレスを指定している。

EC2互換APIを提供するNovaの設定も確認しておこう。nova-apiサービスが稼働しているホストの/etc/nova/nova.confファイルを確認し、以下のように「enabled_apis」設定項目に「ec2」が含まれていればOKだ。

enabled_apis = ec2,osapi_compute,metadata

もしenabled_apis設定項目に「ec2」が含まれていなかった場合、上記の例を参考に「ec2」を追加し、nova-apiサービスを再起動する。

また、EC2互換APIはTCPの8773番ポートを利用する。このポートにアクセスできるようファイアウォールなどを設定しておこう。

EC2互換APIが利用できることを確認する

設定が完了したら、実際にEC2互換APIが利用できるかどうかを確認しておこう。ここでは、EC2互換APIにアクセスして各種操作を行う機能を持つコマンドラインツール「Euca2ools」を利用する。

まず、次のようにyumコマンドで「euca2ools」パッケージをインストールする。

# yum --enablerepo=epel install euca2ools

続いて、keystone ec2-credentials-createコマンドでEC2互換APIを利用するのに必要なアクセスキーおよび秘密アクセスキーを作成する。

$ export OS_USERNAME=<使用するユーザー名>
$ export OS_TENANT_NAME=<使用するテナント名>
$ export OS_PASSWORD=<ユーザーのパスワード>
$ export OS_AUTH_URL=http://<keystoneが稼働しているホスト名>:5000/v2.0/

$ keystone ec2-credentials-create +-----------+----------------------------------+ | Property | Value | +-----------+----------------------------------+ | access | d40181d5424240cdb36faebd3171c957 | | secret | d4c5d782ba8a433b96648a6a10bffb31 | | tenant_id | eb7380b7990d4eb8a27bc9a1b80bf386 | | user_id | 4537dd6a5b7e4609979a7fe26856c522 | +-----------+----------------------------------+

ここで「access」に対応する文字列がアクセスキー、「secret」に対応する文字列が秘密アクセスキーだ。なお、これらは「keystone ec2-credentials-list」コマンドでも確認できる。

$ keystone ec2-credentials-list
 +---------+----------------------------------+----------------------------------+
 | tenant  | access                           | secret                           |
 +---------+----------------------------------+----------------------------------+
 | Default | d40181d5424240cdb36faebd3171c957 | d4c5d782ba8a433b96648a6a10bffb31 |
 +---------+----------------------------------+----------------------------------+

これらのキーとec2サービスのエンドポイントを「EC2_ACCESS_KEY」および「EC2_SECRET_KEY」、「EC2_URL」環境変数に設定する。

$ export EC2_ACCESS_KEY=d40181d5424240cdb36faebd3171c957
$ export EC2_SECRET_KEY=d4c5d782ba8a433b96648a6a10bffb31
$ export EC2_URL=http://<nova-apiサービスが稼働しているホスト名>:8773/services/Cloud

以上で、euca2oolsを実行するための準備が完了した。正しく設定が完了していれば、euca2oolsでOpenStackを操作できるはずだ。たとえば、次の例は、登録されているイメージ一覧を取得するeuca-describe-imagesコマンドを実行したものだ。

$ euca-describe-images
 IMAGE ami-00000001 None (cirros-0.3.0-x86_64) eb7380b7990d4eb8a27bc9a1b80bf386 available private machine instance-store

SwiftでS3互換APIを利用するための設定

SwiftでS3互換APIを利用するには、プロクシノードに「openstack-swift-plugin-swift3」パッケージがインストールされている必要がある。まずはこのパッケージをインストールしておこう。

# yum --enablerepo=epel install openstack-swift-plugin-swift3

続いて、プロクシノードでswift-proxyサービスの設定ファイルである/etc/proxy-server.confをエディタで開き、次の太字の部分を追加しておく。

[DEFAULT]
 bind_port = 8080
 workers = 8
 user = swift

[pipeline:main]
 pipeline = healthcheck cache swift3 s3token authtoken keystone proxy-server

[filter:swift3]
use = egg:swift3#swift3

[filter:s3token]
paste.filter_factory = keystone.middleware.s3_token:filter_factory
auth_host = <keystoneが稼働しているホスト名>
auth_port = 35357
auth_protocol = http



最後にswift-proxyを再起動すれば設定は完了だ。

# swift-init proxy restart

なお、SwiftのS3互換APIではSwiftのAPIと同様、8080番ポートを利用する。プロクシノードのこのポートにアクセスできるよう設定しておこう。

S3互換APIが利用できることを確認する

設定が完了したら、S3 APIをコマンドラインから利用できるツール「s3cmd」を使用して実際にAPIにアクセスできるかを確認しておこう。まず、yumコマンドでs3cmdパッケージをインストールする。

# yum --enablerepo=epel install s3cmd

続いて、s3cmd --configureコマンドを実行してs3cmdの初期設定を行う。ここでAWSのアクセスキーおよび秘密アクセスキーの入力が求められるが、これらはEC2互換APIを利用する場合と同様、keystone ec2-credentials-listコマンドで確認できる。

$ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: <アクセスキー>
Secret Key: <秘密アクセスキー>

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: <適当な文字列>
Path to GPG program [/usr/bin/gpg]: ←なにも入力せずにEnterキーを押す

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]: ←なにも入力せずにEnterキーを押す

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't conect to S3 directly
HTTP Proxy server name: ←なにも入力せずにEnterキーを押す

New settings:
Access Key: d40181d5424240cdb36faebd3171c957
Secret Key: d4c5d782ba8a433b96648a6a10bffb31
Encryption password: hogehoge
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name:
HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] n

以上を実行すると、ユーザーのホームディレクトリに「.s3cfg」という設定ファイルが作成される。続いてこのファイルをエディタで開き、以下の太字の個所を修正する。

[default]
 access_key = <アクセスキー>
 bucket_location = US
 cloudfront_host = cloudfront.amazonaws.com
 cloudfront_resource = /2010-07-15/distribution
 default_mime_type = binary/octet-stream
 delete_removed = False
 dry_run = False
 encoding = UTF-8
 encrypt = False
 follow_symlinks = False
 force = False
 get_continue = False
 gpg_command = /usr/bin/gpg
 gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
 gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
 gpg_passphrase = hogehoge
 guess_mime_type = True
 host_base = <swift-proxyが稼働しているホスト>:8080
 host_bucket = <swift-proxyが稼働しているホスト>:8080
 human_readable_sizes = False
 list_md5 = False
 log_target_prefix =
 preserve_attrs = True
 progress_meter = True
 proxy_host =
 proxy_port = 0
 recursive = False
 recv_chunk = 4096
 reduced_redundancy = False
 secret_key = <秘密アクセスキー>
 send_chunk = 4096
 simpledb_host = sdb.amazonaws.com
 skip_existing = False
 socket_timeout = 300
 urlencoding_mode = normal
 use_https = False
 verbosity = WARNING

これでs3cmdの設定は完了だ。いくつかコマンドを実行して、正常にコマンドが実行できているかを確認してみよう。たとえば、使用しているストレージ容量を確認する「s3cmd du」コマンドを実行すると以下のようになる。

$ s3cmd du
 --------
 0 Total

なお、SwiftのS3互換APIは一部機能の挙動が異なるようで、s3cmdの多くのコマンドはそのままでは動かない。これを解決するパッチが公開されているので、s3cmdを本格的に利用したい場合はこちらを利用してほしい。

OpenStackにアクセスできるクライアントを利用する

最後に、AWS互換APIを利用してOpenStackにアクセスできるクライアントをいくつか紹介しておこう。

Hybridfox

Amazon EC2の管理をGUIで行えるツールとして、「Elasticfox」というツールが有名だ。ElasticfoxはFirefoxの拡張として動作するツールで、仮想マシンの起動や各種イメージの管理といった操作を行える。ただし、ElasticfoxはAmazon EC2以外のクラウドサービスについては正式にはサポートしていない。このElasticfoxをEC2以外のクラウドサービスに対応させたものがHybridfoxとなる。

HybridfoxもElasticFoxと同様、Firefoxの拡張として提供されている。Firefoxにインストールすると、メニューバーの「ツール」項目に「Hybridfox」が追加され、そこから起動できる。

HybridfoxでOpenStackを管理するには、まず「リ―ジョン」ボタンをクリックして接続先を登録する。「リージョン名」には適当な識別用文字列を、「クラウド種別」では「OpenStack」を選択し、「エンドポイントURL」に「http://<nova-apiサービスが稼働しているホスト>:8773/services/Cloud」を指定して「追加」をクリックする(図1)。

図1 クラウド・リージョンの管理画面
図1 クラウド・リージョンの管理画面

 続いて「証明書」ボタンをクリックし、接続用アカウントを登録する。「アカウント名」には適当な識別用文字列を、「AWSアクセスキー」と「AWSシークレットキー」にはアクセスキーおよび秘密アクセスキーを入力し、「追加」をクリックする(図2)。

図2 アカウントの登録画面
図2 アカウントの登録画面

 するとツールバーで登録した接続先やアカウントを指定できるようになるので、それぞれを選択する。この状態で「インスタンス」や「マシン・イメージ」といったタブを選択するとOpenStackに登録されている状況が表示され、「マシン・イメージ」タブから仮想マシンを作成したり、「インスタンス」タブで仮想マシンの停止といった操作が可能になる(図3、4)。

図3 「マシン・イメージ」タブから仮想マシンインスタンスを起動できる
図3 「マシン・イメージ」タブから仮想マシンインスタンスを起動できる
図4 「インスタンス」タブで仮想マシンインスタンス情報を確認できる
図4 「インスタンス」タブで仮想マシンインスタンス情報を確認できる

Cyberduck

S3のAPIを利用できるGUIツールとしては、「*[CyberDuck http://cyberduck.ch/]」が有名だ(図5)。WindowsおよびMac OS X版が用意されている。ただし、現バージョンのCyberDuckではSSLを利用した接続のみがサポートされており、またKeystoneを利用した認証には対応していないので注意が必要だ。

図5 CyberDuck
図5 CyberDuck

CloudBerry Explorer for OpenStack Storage

CloudBerry Explorerは、さまざまなクラウドストレージサービスに対応するWindows向けのクライアントだ。無料版と、有料のPro版が用意されている。無料版では、「CloudBerry Explorer for OpenStack Storage」を利用してSwiftへのアクセスが可能だ(図6)。

図6 CloudBerry Explorer for OpenStack Storage
図6 CloudBerry Explorer for OpenStack Storage

 CloubBerry Explorerでは、「File」メニューで接続に使用するアカウントを登録する(図7)。

図7 「File」メニューから「OpenStack Account」を選択してOpenStackアカウントを登録する
図7 「File」メニューから「OpenStack Account」を選択してOpenStackアカウントを登録する

 アカウント設定画面では、「Display Name」に適当な表示用識別名を、「User name」にユーザー名を、「Api key」にパスワードを入力する。「AUthentication Service」には「http://<keystoneサービスが稼働しているホスト名>:5000/v2.0/tokens」を指定し、「Use Keystone authentication」にチェックを入れて「Tenant name」で使用するテナント名を指定すれば良い(図8)。

図8 CloudBerry Explorer for OpenStack Storageのアカウント設定画面
図8 CloudBerry Explorer for OpenStack Storageのアカウント設定画面

完全な互換性はないものの、既存ツールからのマイグレーションなどには有用

OpenStackとAWSとは完全な互換性があるわけではないため、APIについても一部互換性のない機能がある。そのため、AWSのAPIを使用するツールすべてが正しく動作するわけではない。また、OpenStackにはWebブラウザ経由で利用できるGUI管理ツールであるOpenStack Dashboard(Horizon)があるため、あえてEC2向けの管理ツールを使用する意義は少ない。ただし、AWSで利用していたツールやスクリプトを移行したい、といった用途では有用だろう。うまく活用してほしい。