1. はじめに
IBM CloudのサービスをAPIで呼び出す際には、IAMトークンが必要になります。よくAPI referenceやIBM Cloud docsにBearer $ACCESS_TOKEN
とか記載がある箇所です。頻繁に出てくる割には、効率よくIAMトークンを取得する方法がすぐには見つからなかったのでまとめました。
2. ユーザー or Service ID ?
IBM Cloudでは、IAMトークンはユーザー
もしくはService ID
のどちらかのものを利用することになります。
-
ユーザー
は、Customer Portalにログインする際に利用し、IBMid
に紐づいています。気をつけなければいけないのは、もしこのユーザーが(チームから抜けたりして)このアカウントからいなくなった場合には、このIDは利用できなくなってしまうということです。もちろん、そういう事態を避けるために特定の人に紐づかない運用用途のユーザーを作成することで代替することも可能ですが、本来ユーザ-
はCustomer Portalにログインして使うエンドユーザーを想定しているため、その度にIBMidを取得・管理したり適切な権限を与えて行くのは大変かもしれません。ただし、十分な権限を持っているユーザー
が、自身のIAMトークンを使って、開発・検証目的でAPIを実行するのには十分だと思います。 -
Service ID
は上記の問題を回避することができます。Service ID
とは、サービスを呼び出すことに特化した一種のシステムユーザーのことです。Functional IDとかService ID
の作成にはIBMidは不要です。このService ID
に対して、様々なアクセスポリシーを設定することで、「あるサービスに対しては読み書きができるが、こちらのサービスに対しては読み取りしかできない」などの操作のみを許可したID管理が可能になります。
3. IAMトークン取得方法
3.1 ibmcloudコマンドを使う
この方法は、自分のユーザーのIAMトークンが取得できます。
$ ibmcloud iam oauth-tokens
実際は、以下のようにしておくと楽だと思います。
$ iam_token=`ibmcloud iam oauth-tokens | awk '{printf $4}'`
$ echo ${iam_token}
3.2 APIで呼び出す(API Keyが必要)
こちらはより汎用的な方法のため、ユーザー
に対してもService ID
に対しても利用可能です。
$ APIKEY=xxxxxx
$ curl -sX POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${APIKEY}" \
https://iam.cloud.ibm.com/identity/token
ただ、上記だとjsonファイルのままなので読みづらいです。jqコマンドでフォーマットしてあげると使い勝手が上がります。
(CentOS7では、epelを入れればyumで導入できます)
$ APIKEY=xxxxxx
$ iam_token=`curl -sX POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${APIKEY}" \
https://iam.cloud.ibm.com/identity/token | jq -r '.access_token' `
$ echo ${iam_token}
$ APIKEY=xxxxxx
$ iam_token=`curl -sX POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=${APIKEY}" \
https://private.iam.cloud.ibm.com/identity/token | jq -r '.access_token' `
$ echo ${iam_token}
(参考)
https://cloud.ibm.com/docs/account?topic=account-iamtoken_from_apikey
https://cloud.ibm.com/docs/account?topic=account-iamapikeysforservices
https://cloud.ibm.com/docs/account?topic=account-serviceidapikeys
3.3 APIで呼び出す(API Keyを使わずにTrusted Profileを使用)
IBM Cloud: Trusted Profileを使ったVSI for VPCからの安全なAPI/CLI呼び出し方法を参照。