twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル OpenStack API 入門

OpenStack API 入門

原文は こちらです。

OpenStack は、オープン ソースの標準的なクラウド コンピューティング プラットフォームです。OpenStack の API を利用して、クラウドを管理するソフトウェアを開発することができます。スクリプトを書いて、自動的にサーバーを割り当てるジョブとして実行したり、ユーザーが自分用のクラウド サーバーを管理するためのアプリケーションを開発したりできます。無限の可能性があります。そのようなタスクをこなすためには、OpenStack の API を使ってソフトウェアを開発する必要があります。本チュートリアルでは、OpenStack API を使って仕事を進める方法を学びます。

OpenStack API と SDK を使う 2 つの方法があり、これらについて混乱が見られるので、説明をしておきます。基本的に、OpenStack サービスは、アプリケーションがサービスと連携するための API を提供します。API は、RESTful インタフェース、つまり、コマンドとして URL 形式のリクエストを送信するインタフェースとなっています。URL のパス形式によって、コマンドが決まります。これらの URL は、ブラウザが使用する HTTP プロトコルと同じものを使用します。リクエストに追加情報が不要の場合に限り、ブラウザのアドレス バーにコマンド相当の RESTful インタフェースの URL を書くことができます (これは、本来のブラウザの目的ではありません)。通常はこのようなことはありません。普通は、プログラム内でリクエストを生成するか、cURL というコマンドライン ユーティリティを使います。cURL は、サービスにリクエストを送るための簡単な方法です。

ここで解説する内容は、OpenStack 以外の多数の RESTful インタフェースについて適用できます。たとえば Amazonは、売り手がサイトの商品の管理をするための API を提供しています。この API は、RESTful  APIと SDK の両方を提供しています。

OpenStack を含むこのような API は、コマンド名の後ろに ”/” で区切られたパラメーターから構成される URL パスを組み立て、HTTP GET または HTTP POST で送信する仕組みをとっています。GET や POST 以外の方法もあり得ますが、まれです。URL 以外に、GET リクエストを使ってヘッダーに追加データを含ませることもあります。POST の場合も、POST データの形で追加データを送信することができます。

URL の最初のパートは、エンドポイントと呼ばれています。サービス毎に異なるエンドポイントを用います。オンライン ドキュメントに、エンドポイントの説明が書かれています。

OpenStack-API-SDK

SDK について

サービスとの連携の基本的手段にもかかわらず、API の使い方は難しい点があります。リクエスト量が少ない時は、cURL を使うのも良いでしょう。しかし、大量に使用する場合、アプリケーション内に同じコードを何回も書かなければなりません。使用する言語にもよりますが、リクエストと送信データをひとまとめにして URL を組み立て、HTTP リクエストを出すライブラリを呼び出します。HTTP のステータス コードとレスポンスを受信したら、それらをデコードして、プログラミング言語が理解できる形式にしなければなりません。

SDK はこのためにあります。URL を組み立て HTTP リクエストにする代わりに、関数を呼び出します。これらの関数は、URL とデータの組み立て、API コールまでやってくれます。アプリケーションで使用する他のコードと同じように見えるでしょう。

通常は、プログラミング言語が提供する SDK を使います。SDK がない時だけ API を直接使用します。OpenStack では、ほとんどの言語用に SDK が用意されています。しかし、SDKを使う前に API のドキュメントを勉強し、SDK の動きを理解しておくことを勧めます。SDK を使用した際に何か間違っていたら、何が問題かすぐわかります。ここではオープン ソースの話をしていますから、もし SDK が期待どおりに動作しなかったら、改良したり、新しい SDK を作ったりしても良いのです。

OpenStack API application call

OpenStack API を理解する

直接 API を使うところから、OpenStack を始めましょう。OpenStack サービスを使うためには、認証を取る必要があります。これは、サービスによって違います。ここでは、Rackspace を使うことにしました。Rackspace は、OpenStack の完全なインプリメンテーションの 1 つだからです (Rackspace は、NASA と一緒に OpenStack を始めた会社です)。

他のプロバイダーでは手続きが異なるので、ウェブサイトで API のドキュメントを調べてください。

Rackspace では、(cURL かプログラムのどちらかで) リクエストを送付し、認証トークンを入手します。Rackspace クラウド コントロール パネルでアカウントを設定した時に使用したユーザー名とパスワードを、リクエストとともに送付します。次に、以下のエンドポイントを使ってリクエストを送信します。

https://identity.api.rackspacecloud.com/v2.0

Linux コマンド ラインから、cURL を使って送信します。これはエンドポイントのみなので、ユーザー名とパスワードを追加情報として送信します。ユーザー名とパスワードは、JSON オブジェクトの形式にして、POST データとして送信します (つまり、ここでは GET ではなく、POST リクエストを使います)。JSON 仕様に従った形式である必要があります。つまり、各メンバーはダブル引用符 (") で囲みます。JSON オブジェクトは、以下のようになります。

{
    "auth": {
        "passwordCredentials": {
            "username": "MyRackspaceAcct",
            "password": "MyRackspacePwd"
        }
    }
}

MyRackspaceAcct と MyRackspacePwd をユーザー名とパスワードで置き換えます。これを POST データとして、cURL で送信するために、”-d” オプションを使用します。シングル引用符 (') で JSON オブジェクトを囲み、シェルが 1 つのパラメーターと認識するようにします。これらに加えて、エンドポイント、コンテント タイプが必要です。また、cURL に POST 送信であることを指定します。まとめると以下のようになります。

curl -s https://identity.api.rackspacecloud.com/v2.0/tokens -X 'POST' \
     -d '{"auth":{"passwordCredentials":{"username":"MyRackspaceAcct", "password":"MyRackspacePwd"}}}' \
     -H "Content-Type: application/json"

The cURL command will then make the HTTP request and print out the results of the request. RackcURL コマンドは、HTTP リクエストを実行してリクエスト結果を表示します。Rackspace からは認証トークンが戻ります。トークンを使うことで、引き続き実行したい API のエンドポイントを使ってリクエストできます (有効期間は 24 時間です。期限が切れたら、このリクエストをもう一度発行する必要があります)。

この cURL コマンドを実行すると、大量のオブジェクトが戻ってきます。ここでは省略します。重要な部分は、オブジェクトの先頭の ”access” メンバーで、トークンを含んでいます。トークン オブジェクトは、メンバーとして今後リクエストを出すときに使う ”id” を含んでいます。メンバー ”tenant” は、リクエスト内で使用します。他に有効期限が日付と時刻で含まれており、この期限までに再リクエストを出す必要があります。

{
    "access": {
        "token": {
            "id": "1234567890abcdef",
            "expires": "2015-01-13T21:48:11.877Z",
            "tenant": {
                "id": "1234",
                "name": "1234"
            },
            "RAX-AUTH:authenticatedBy": ["PASSWORD"]
        },
...

“access” オブジェクト以降に ”serviceCatalog” オブジェクトがあります。これは、すべてのエンドポイントを含みます。使用可能な各サービスのエンドポイント、たとえば cloudBlockStorage、cloudImages、 autoscale、cloudDatabases、cloudBackup、cloudMonitoring、cloudDNS、cloudServers、, cloudFilesCDN、cloudFiles などです。これらは JSON オブジェクトの形式で、エンドポイントを提供する ”publicURL” メンバーに含まれています。Rackspace のネットワーク内のサーバーで実行している時に、使用可能な ”internalURL” メンバーもあります。さらにリージョンごとの URL もあります。リージョンには、ORD  (Chicago)、SYD (Sydney)、DFW (Dallas)、HKG (Hong Kong)、IAD (Northern Virginia) があります。これらのリージョンは、OpenStack の一部ではなく、Rackspace に属しています。詳しくは、Rackpsace のドキュメントを参照してください。

API コールの作成

認証トークンとエンドポイントが入手できたので、API コールを作成します。サーバーをリストしましょう。URL は、サービスにより異なります。サービスの完全なリストは、API ドキュメントに記載されています。サーバーのリストは、Compute セクションにあります。”List Servers” という次のようなコマンドがあります。

/v2/{tenant_id}/servers

“tenant_id” は、認証の応答内の ”access” セクションにあります。Rackspace は、応答内のエンドポイントのリスト内に次のように埋め込んでくれています。

https://iad.servers.api.rackspacecloud.com/v2/1234

“/server” を URL の最後に追加します。

https://iad.servers.api.rackspacecloud.com/v2/1234/servers

まだ送信できません。認証情報を使います。”List Servers” は、GET メソッドを使うようにドキュメントに記載されています。GET メソッドでは、追加情報は、ヘッダーに記載します。認証トークンを渡すために、ヘッダー X-Auth-Token を利用します。次のようになります。

curl -s https://iad.servers.api.rackspacecloud.com/v2/1234/servers \
    -H 'X-Auth-Token: 1234567890abcdef'

送信結果は、次のようにリストがきます。著者は、1 台のサーバーを持っています。

{
    "servers": [{
        "id": "abcdef123456",
        "links": [{
            "href": "https://iad.servers.api.rackspacecloud.com/v2/1234/servers/abcdef123456",
            "rel": "self"
        },
        {
            "href": "https://iad.servers.api.rackspacecloud.com/1234/servers/abcdef123456",
            "rel": "bookmark"
        }],
        "name": "Cloud-Server-01"
    }]
}

各サーバー欄には、サーバーへアクセスするための情報へのリンクが記載されています。先ほどと同様に-H オプションを付けて、このリンクをたどるリクエストを出すと、サーバーに関する大量の情報が JSON 形式で入手できました。情報には、IP アドレス (v4 と v6)、サーバーを作成したときに利用したイメージに関する情報、サーバー名などが含まれていました。

これで、GET と POST の基本を理解することの重要性がわかりました。GET は情報のリクエスト、POST は情報の送信です。サーバーの情報を入手するために、GET を使いました。サーバーを作成する時は、同様の URL でも POSTを使います。

結論

API を使うためのさわりを説明しました。今後、もっとたくさんの API、プロビジョン サーバーの作成と管理を解説するつもりです。それができたら、SDK に挑戦します。期待してください。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/12/03 2018年 12月 02日
  2. Today's Linux 2018/12/04 2018年 12月 03日
  3. Today's Linux 2018/12/06 2018年 12月 05日
  4. Today's Linux 2018/12/07 2018年 12月 06日
  5. Today's Linux 2018/12/10 2018年 12月 09日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!