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)。
続いて「証明書」ボタンをクリックし、接続用アカウントを登録する。「アカウント名」には適当な識別用文字列を、「AWSアクセスキー」と「AWSシークレットキー」にはアクセスキーおよび秘密アクセスキーを入力し、「追加」をクリックする(図2)。
するとツールバーで登録した接続先やアカウントを指定できるようになるので、それぞれを選択する。この状態で「インスタンス」や「マシン・イメージ」といったタブを選択するとOpenStackに登録されている状況が表示され、「マシン・イメージ」タブから仮想マシンを作成したり、「インスタンス」タブで仮想マシンの停止といった操作が可能になる(図3、4)。
Cyberduck
S3のAPIを利用できるGUIツールとしては、「*[CyberDuck http://cyberduck.ch/]」が有名だ(図5)。WindowsおよびMac OS X版が用意されている。ただし、現バージョンのCyberDuckではSSLを利用した接続のみがサポートされており、またKeystoneを利用した認証には対応していないので注意が必要だ。
CloudBerry Explorer for OpenStack Storage
CloudBerry Explorerは、さまざまなクラウドストレージサービスに対応するWindows向けのクライアントだ。無料版と、有料のPro版が用意されている。無料版では、「CloudBerry Explorer for OpenStack Storage」を利用してSwiftへのアクセスが可能だ(図6)。
CloubBerry Explorerでは、「File」メニューで接続に使用するアカウントを登録する(図7)。
アカウント設定画面では、「Display Name」に適当な表示用識別名を、「User name」にユーザー名を、「Api key」にパスワードを入力する。「AUthentication Service」には「http://<keystoneサービスが稼働しているホスト名>:5000/v2.0/tokens」を指定し、「Use Keystone authentication」にチェックを入れて「Tenant name」で使用するテナント名を指定すれば良い(図8)。
完全な互換性はないものの、既存ツールからのマイグレーションなどには有用
OpenStackとAWSとは完全な互換性があるわけではないため、APIについても一部互換性のない機能がある。そのため、AWSのAPIを使用するツールすべてが正しく動作するわけではない。また、OpenStackにはWebブラウザ経由で利用できるGUI管理ツールであるOpenStack Dashboard(Horizon)があるため、あえてEC2向けの管理ツールを使用する意義は少ない。ただし、AWSで利用していたツールやスクリプトを移行したい、といった用途では有用だろう。うまく活用してほしい。