Bluemixログイン処理を早速APIキーで行ってみる

Bluemix Cloud Platformに対する久しぶりの投稿です。

Bluemix Platform (すなわちPaaSの方、IaaS ServicesであるSoftLayerのではないです)のユーザー管理にさりげない変更があったのでメモ。

# Bluemix Platformでの操作の自動化
Bluemix Cloud Platformでの各種操作の自動化はcfコマンドラインかbluemixコマンドライン・インターフェースで実装する、あるいはREST APIで実装するのが一般的です。主観ですが、REST APIの方がコマンドラインよりも小回りが利いて実装しやすいので、よくJavaやPythonで自動化スクリプトを作ったりします。

ただ、自動化していく上では、これまで一旦ユーザー認証を行ってから、発行される認証トークンを用いて処理を記述する、という2段構えの処理を書くことになります。ここでの認証情報はBluemixのユーザー・アカウントのユーザー名/パスワードを利用することになるため、ユーザーのパスワードの管理を考慮してのスクリプト作成が若干煩わしい状況だったりしていました。また、セキュリティー担保のために定期的に短時間で何度もログインし直すと、不正アクセス防止に引っかかり30分ほどアカウントが利用できなくなることもあり。。。APIキーがあればな〜と思っていたところの今回のアップデート!!早速試してみたいと思います。

# Bluemix PlatformでのAPIキー発行の流れ
アカウントの作成だったり、諸々のアプリのセットアップだったりは一旦今回は省きます。リクエストがあれば整理したいところです。

BluemixのUIにログインしたら、以下の手順でAPIキーを発行します:

1.右上の管理(Manage)からセキュリティー > Bluemix API Keysを選択します
<img width="409" alt="スクリーンショット 2017-05-03 9.06.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/8cead8af-dad9-6ab4-477c-132adf449a42.png">

2.APIキーの管理画面が表示されるので、「APIキーの作成」をクリックします
<img width="1435" alt="スクリーンショット 2017-05-03 9.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/06a82fc2-d3ee-bcb2-3367-511961838ccf.png">

3.APIキーの管理名と説明を入力し、「APIキーの作成」をクリックします
<img width="740" alt="スクリーンショット 2017-05-03 9.29.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/bda58d0e-0f9f-bbe7-07f7-396e05ba255e.png">

4.正常に処理が完了すると、APIキーが発行されますので、表示してメモするか「APIキーのダウンロード」でAPIキー・ファイルをダウンロードします
<img width="733" alt="スクリーンショット 2017-05-03 9.29.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/101771/64d154e4-113f-3dc7-6e63-93695e424d74.png">

5.画面上リストに表示されていることを確認します


以上で発行処理は終了です。選択項目がないので、非常にシンプルです。

# APIキーを使ってみる
では、発行したAPIキーを使ってみましょう。ざっと調べる限り、bluemixコマンドライン・インターフェースでの利用が簡単だったので、今回はbluemixコマンドライン・インターフェースで試してみます。

ダウンロードは以下で実施します。セットアップ方法含め以下を参照すれば簡単に導入できます。この記事では最新の0.5.2を利用しています。
https://clis.ng.bluemix.net/ui/home.html

導入が完了したら、早速ログインしてみます。「bluemix login --apikey」で指定可能です。APIキーはストリングで直接指定するか、発行時にダウンロードしたAPIキー・ファイルを@<ファイル名>で指定すれば良いです。組織やスペースをアカウント内に複数抱えている場合は、必要に応じて組織名, スペース名を指定することになりますが、これはこれまでのbluemixコマンドラインの操作と変わりません。

>$bluemix login --apikey <発行したAPIキーのストリング>
API エンドポイント: https://api.ng.bluemix.net
認証中です...
OK
>
ターゲットのアカウント XXXX's Account (xxxxxxxxxxxxxxxx)
>
組織を選択します (または Enter キーを押してスキップします):
1. XXXX@gmail.com
2. MyTest
:
>
スペースを選択します (または Enter キーを押してスキップします):
1. dev
2. share
:

あとは今まで通りの操作になります。例えばCloud Foundryアプリの一覧を取得したい場合は「bluemix cf apps」で取得できますが、、

>$bluemix cf apps
'cf apps' を起動しています...
>
XXXX@gmail.com として組織 XXXX@gmail.com / スペース dev 内のアプリを取得しています...
OK
>
名前                                 要求された状態   インスタンス   メモリー   ディスク   URL
IoT-Foundation-xxxx             started          1/1            512M       1G         xxxx.mybluemix.net
simple-toolchain-2017041903240xxxx   stopped          0/1            128M       1G         xxxx.mybluemix.net

はい、できましたね。

*** 補足 ***
なお、環境変数「BLUEMIX_API_KEY」にAPIキーを指定しておけば、ログイン時の「--apikey」の指定は不要です。
>$export BLUEMIX_API_KEY=<発行したAPIキーのストリング>
$bluemix login
API エンドポイント: https://api.au-syd.bluemix.net
環境変数 'BLUEMIX_API_KEY' の API キーでログイン中...
OK
:

# 使ってみての諸注意まとめ
以下試してみての気づきですが、2017年5月時点での話なので、将来的には変わっていく可能性大です。

1.APIキーの有効範囲
動作確認する限りアカウントです。特定の組織や、それに所属するスペース単位でのAPIキーの発行は少なくとも2017年5月現時点ではできない点に注意です。一方で、地域に関しては米国南部だろうがドイツだろうが、アカウントさえ同じであればAPIキーはそのまま使用可能です。

2.APIキーの有効期限
現時点では設定できませんが、複数APIキーを発行できるため、3ヶ月更新ルールなどがある場合は差し替えで運用すると良いと思います。

3.APIキーでできる操作
権限の設定はAPIキーに対して、というよりは従来通りユーザーに対してどのロール（役割）が与えられているかに依存しています。アプリの起動・停止処理を自動化したければ、アプリが属するスペースに対する開発者権限を有していること、これがユーザーに対して付与されていれば、そのユーザーに対するAPIキーとしてはアプリの起動・停止処理が行えるはずです。

4.Cloud Foundryコマンドライン・インターフェースでのAPIキーの利用
最新のコマンドライン・インターフェースを導入し、コマンド・リファレンスを確認してみましたが、bluemixコマンドライン・インターフェースと違い、「--apikey」のオプションがないようです。Bluemix固有の拡張と考えるべきでしょう。

5.REST APIでの実装
これがちょっと調べる限りよくわからず。。。判明次第追記します。

*** 2017/05/10 追記 ***
これまでとREST APIの発行の仕方は何も変わらず、認証のところのみ今までBluemixのアカウントのユーザー名/パスワードを指定した部分を、ユーザー名: apikey, パスワード: <APIキー>で指定してあげれば良いです。

他にも「Unified user management across Bluemix Platform and Infrastructure services」や「Fine-grained access control」など、Bluemix Platformとしては気になる更新がありますが、それはまたそのうち。

以上です!!