プライベート・エンドポイントでPowerVS APIをcurlで実行する際の環境変数設定


#### はじめに

PowerVS の API を プライベート・ エンドポイントで curl コマンドで実行するための環境変数設定ログです。


参考：[IBM Cloud Docs Power Cloud API](https://cloud.ibm.com/apidocs/power-cloud)


当記事記載時点(2023年2月) ibmcloud コマンドの power-iaas プラグインはプライベート・エンドポイントをサポートしていないそうです。
そのためプライベート・エンドポイントで操作したい場合は、APIを直接実行となるようです。

```
# ibmcloud pi service-target crn:v1:bluemix:public:power-iaas:osa21:a/52xxxxxde69144428266:97xxxxa7-xxxx-xxxx-xxxx-f87xxxxd::
失敗
プラグイン 'power-iaas 0.4.6' はプライベート・エンドポイントをサポートしていません。 'ibmcloud api' を実行してパブリック API エンドポイントを設定してやり直してください。
````

----
#### 対象読者

PowerVS の API を プライベート・エンドポイントで実施したい方

----
#### 環境

PowerVS API のプライベート・エンドポイント実行は、
IBM Cloud Kubernetes Service (Classic) の Linux コンテナから実施しました。


----
#### 環境変数の設定

以下の環境変数を設定します。

・*APIKEY*
・*TOK_CRN* (Tokyo Region のClond Resource Name(CRN))
・*TOK_CLOUD_INSTANCE_ID* (Tokyo Region の PowerVS Cloud Instance ID)
・*ACCESS_TOKEN*

---
##### APIキーの設定


APIキーの作成は以下を参照

[IBM Cloud Docs: ユーザーのAPIキーの管理](https://cloud.ibm.com/docs/account?topic=account-userapikey&locale=ja&interface=ui)

>  IBM Cloud コンソールで**「管理」** > 「アクセス (IAM)」 > **「API キー」**に移動します。
　　　 **「IBM Cloud API キーの作成」**をクリックします。
    　　　API キーの名前と説明を入力します。
    　　　　「作成」 をクリックします。
   　　　　　　 次に、**「表示」をクリックして API キーを表示します。または、「コピー」をクリックして後で使用するためにコピーして保存するか、または「ダウンロード」**をクリックします。


作成したAPIキーを変数に設定します。


```
# export APIKEY=< API Key> 
```


---
##### Cloud Resource Name(CRN) の設定

CRNの取得は以下を参照

[クラウド・リソース名](https://cloud.ibm.com/docs/account?topic=account-crn)

CRNは **ibmcloud pi service-list** コマンドで確認可能です。

一例

```
$ ibmcloud pi service-list
ID                                                                                                             　  名前
crn:v1:bluemix:public:power-iaas:us-south:a/xxxxxb0f3a4109xxxxx144428266:ef5xxxxx-0xxc-4287-xxxx-45b96870xxxx::   psvs-dal
crn:v1:bluemix:public:power-iaas:osa21:a/xxxxxcb0f3a41xxxxx69144xxxxxx66:976c66a7-xxxx-4432-xxxx-f876cce6db0d::   psvs-osa21
crn:v1:bluemix:public:power-iaas:tok04:a/xxxxxf3a4109ac0xxxxx4428266xxxx:xxxxxdx0-26e5-xxxx-xxdf-728xxxxbxxxx::   psvs-tok04
```

また対象のワークスペースの表示からも確認できます。

<img width=3%><img width="55%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/c1f4fb07-08f4-eb64-bf4f-fafbdca7d4b7.png">


確認した値を変数として設定します。

```
# export TOK_CRN="xxxxxf3a4109ac0xxxxx4428266xxxx:xxxxxdx0-26e5-xxxx-xxdf-728xxxxbxxxx::"
```


---
##### CLOUD INSTANCE ID の取得

CLOUD INSTANCE IDは CRN の後方部分から取得が可能です。

例

```
export TOK_CLOUD_INSTANCE_ID=`echo $TOK_CRN | awk -F '[:]' '{print $8}'`
```


---

##### ACCESS TOKENの取得

ACCESS TOKEN は iam.cloud.ibm.com/identity/token のAPIを実行します。

以下の実行で直接変数"ACCESS_TOKEN"に入力します。

```
$ export ACCESS_TOKEN=$(curl -X POST "https://private.iam.cloud.ibm.com/identity/token" -H "content-type: application/x-www-form-urlencoded" -H "accept: application/json" -d "grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey&apikey=${APIKEY}" --insecure | jq -r '.access_token')
```



ACCESS_TOKEN 取得確認

```
# echo $ACCESS_TOKEN
xxxxxxxxxxxxxxxiOiJSUzI1NiJ9.eyJpYW1faWQiOxxxxxxxxxxxxxxxyNzAwMDFNUktTIiwicmVhbG1pZCI6IklCTWlkIiwianRpIjoiMmE2MWU4NDMtNjljZS00NzgzLThjNWItNjM5ZDZiZjM0ZjMyIiwiaxxxxxxxxxxxxxxxMU1SS1MiLCJnaXZlbl9uYW1lIjoiQ2hpeW9rbyxxxxxaGl5b2tvIFVzaGlvZ2kiLCJlbWFpbCI6IkFIQTAzNjQwQGpwLmlibS5jb20iLCJzdWIiOiJBSEEwMzY0MEBqcC5pYm0uY29tIiwiYXV0aG4iOnsic3ViIjoiQUhBMDxxxxxTWlkLTI3MDAwMU1xxxxxxxxxxxxxxx2hpb2dpIiwiZ2l2ZW5fbmFtZSI6IkNoaXlva28iLCJmYW1pbHlfbmFtZSI6IlVzaGlvZ2kiLCJlbWFpbCI6IkFIQTAzNjQwQGpwLmlibS5jb20ifSwiYWNjb3VudCI6eyJib3VuZGFyeSI6Imdsb2JhbCIsInZhbGlkIjp0cnVlLCJic3xxxxxiIxxxxxxxxxxxxxxxSIsImZyb3plbiI6dHJ1ZSwiaW1zIjoiMTM3ODk0MyJ9LCJtZmEiOnsiaW1zIjxxxxxxxxxxxxxxxmlibS5jb20vaWRlbnRpdHkiLCJncmFudF90eXBlIjoidXJuOmlibTpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTphcGlrZXkiLCJzY29wZSI6ImlibSxxxxx19.vO70LKQ3-NH4tR1esXKt0i59H5UkVKlKbSUAwqaDf2E6oxIyLxxxxxxxxxxxxxxxxxxEiJ1SIk-NSC3IEs2LpGFJurwa9vebknzCgS1jfHnPBDrFrWuSY-Ohv9MYyXfwUW2k4QCz1GJxYziEtr4VayP-xxxxxxxxxxxxxxxOzqmM0QFwaJlqbepjjYgCPUfD-XqbpeGOfg3A5D2tODJQf1WUlFp519TwqNq872F_1uWC2I5_qUlTh9Fb485s7uFpWdkTNSox5xxxxxxxxxxxxxxx
```


これで PowerVS API プライベート・エンドポイントで curl での操作が可能となりました。

---

##### (参考実行) ボリュームの情報取得

PowerVS API 実行のボリュームの情報取得の例です。
プライベート・エンドポイントで、**"private.jp-tok.power-iaas.cloud.ibm.com"** を指定しています。

[PowerVS API : List all volumes attached to a PVM Instance](https://cloud.ibm.com/apidocs/power-cloud#pcloud-pvminstances-volumes-getall)

```
# curl -sSfX GET https://private.jp-tok.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/${TOK_CLOUD_INSTANCE_ID}/volumes -H "Authorization: Bearer ${ACCESS_TOKEN}" -H "CRN: ${TOK_CRN}" -H 'Content-Type: application/json' | jq -r
{
  "volumes": [
    {
      "bootVolume": false,
      "bootable": false,
      "creationDate": "2022-03-07T07:57:53.000Z",
      "diskType": "tier3",
      "href": "/pcloud/v1/cloud-instances/xxxxxx080031f60c3e6fac3/volumes/e6exxx5-413c-495e-91dc-5bxxxxxx6",
      "lastUpdateDate": "2022-03-09T01:50:00.000Z",
      "name": "bkdisk",
      "pvmInstanceIDs": [],
      "shareable": false,
      "size": 80,
      "state": "available",
      "volumeID": "e6xxxxx45-413c-4xxx-91dc-5bb0xxxxxxx",
      "volumePool": "Tier3-Flash-2",
      "volumeType": "Tier3-Flash-2",
      "wwn": "600507xxxxxxx0000001958"
    },
    {
      "bootVolume": false,
      "bootable": false,
      "creationDate": "2022-02-02T08:45:37.000Z",
      "diskType": "tier3",
      "href": "/pcloud/v1/cloud-instances/0b02xxxxxxx1f60c3e6fac3/volumes/2sssss-7bc8-452d-a081-0xxxxxxc0",
      "lastUpdateDate": "2022-02-02T11:19:34.000Z",
      "name": "vol10",
      "pvmInstanceIDs": [],
      "shareable": false,
      "size": 80,
      "state": "available",
      "volumeID": "xxxxxef2-7bc8-xxxx-a081-0ebfxxxxxx0",
      "volumePool": "Tier3-Flash-2",
      "volumeType": "Tier3-Flash-2",
      "wwn": "6005xxxxxxx18000000000014BE"
    },

~ 省略 ~ 


````

ここからさらに jq コマンドや awk コマンドを使って取得したい情報だけ抜き出します。


以下は ボリューム名 "bkdisk" の Volume ID を抜き出す例

```
# curl -sSfX GET https://private.jp-tok.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/${TOK_CLOUD_INSTANCE_ID}/volumes -H "Authorization: Bearer ${ACCESS_TOKEN}" -H "CRN: ${TOK_CRN}" -H 'Content-Type: application/json' | jq -r '.volumes[] | [.volumeID,.name] | @tsv' | grep -w bkdisk | awk '{print $1}'
e6xxxxx45-413c-4xxx-91dc-5bb0xxxxxxx
```



以上です。