PowerVS IBM i 日記(24): Windows から IBM Cloud API で PowerVS のスナップショットを作成・復元する

# Windows から IBM Cloud API で PowerVS のスナップショットを作成・復元する

「[Windows から IBM Cloud API で PowerVS にアクセスする](https://qiita.com/6onoda/items/05104ace6fec8537ddf4)」では IBM Cloud API の基本を確認しました。

今回は、その続きとして CLI では操作できないスナップショットを API で操作します。

## スナップショットとは

スナップショット機能の解説は、下記にあります。

* [スナップショット作成、クローン作成、およびリストア](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-volume-snapshot-clone&locale=ja)

> スナップショット・インターフェースを使用すると、ソース・ディスクとターゲット・ディスク (ターゲット・ディスクはスナップショット API の一部として作成されます) 間の関係を T1 時に作成できます。スナップショット API は、T1 時以降にソース・ディスクに加えられたデルタ変更を追跡します。それでユーザーは、後の時点でソース・ディスクを T1 の状態にリストアすることができます。
>
スナップショット機能にはいくつかのユース・ケースがあります。例えば、ある管理者は、システム上のミドルウェアのアップグレードを計画していますが、アップグレード前の元の状態に戻せるように準備しておきたいと考えています。ミドルウェアで障害が発生しても、この管理者はソース・ディスクを前の状態にリストアできます。

素晴らしいですね。PTF 適用などのメンテナンスをして、うまくいかなかったら戻せるようです。

ブートイメージとの違いを考えてみましょう。

スナップショットは、特定の時点のボリュームイメージのコピーです。
エクスポートで作成されるブートイメージと似ていますが、スナップショットは取得したインスタンスに復元するものです。
一方、ブートイメージは別のインスタンスを作成するテンプレートになります。

スナップショットは取得したインスタンスに復元するため、ネットワーク環境の設定など、インスタンスに特有の設定も意味を持ちます。
一方、ブートイメージは別のインスタンスの作成に利用するため、インスタンスに特有の設定は意味は持ちません。

スナップショットはストレージの機能で取得する、ブートイメージは PowerVC のテンプレートとして取得するという作成方法の違いもあります。

使い分けが必要ですね。

IBM Cloud CLI からできない点と API が使えるリージョンが限られるのが残念です。

今回も Windows の PowerShell 環境で実行したいと思います。
API が使えるダラスのリージョンに作成した IBM i インスタンスでテストします。

## 準備 - 基本の認証情報を取得し操作ターゲットを指定する

IBM Cloud API の基本的な使い方は前回の「[Windows から IBM Cloud API で PowerVS にアクセスする](https://qiita.com/6onoda/items/05104ace6fec8537ddf4)」で確認しました。

IAM のアクセストークンとインスタンス ID (クラウド・リソース・ネーム:CRN)が認証に必要でした。

IAM のアクセストークンは Windows の PowerShell から下記のように取得しました。

```
$TOKEN = (ibmcloud iam oauth-tokens --output JSON | ConvertFrom-Json ).iam_token
```

ダラスの環境の CRN は PowerVS のサービスの名前の「DAL」を使って下記のように取得しました。
Where-Object コマンドレットで絞り込みを行います。

```
$CRN = (ibmcloud pi service-list --json | ConvertFrom-Json )
$CRN_DAL = ($CRN | Where-Object {$_.Name -eq "DAL"} ).CRN
```

CLI 操作のターゲットとしてダラスのサービスを指定しておきます。

```
ibmcloud pi service-target $CRN_DAL
```

なお、ダラスの API エンド・ポイントは「https://us-south.power-iaas.cloud.ibm.com」になります。


## スナップショット作成 API の確認

スナップショットを作成する API の説明は下記にあります。

* [Create a PVM instance snapshot](https://cloud.ibm.com/apidocs/power-cloud#pcloud-pvminstances-snapshots-post)

指定するパラメーターは下記になります。つまり、対象のインスタンスの cloud_instance_id、pvm_instance_id、接続されているボリュームの volumeID のリストを取得する必要があります。

* パスに指定するパラメーター
 * cloud_instance_id
 * pvm_instance_id
* ボディに指定するパラメーター
 * 名前
 * 記述
 * volumeID のリスト

### cloud_instance_id の取得

cloud_instance_id を返す API は、下記のようです。

* [Get a tenant's current state or information](https://cloud.ibm.com/apidocs/power-cloud#pcloud-tenants-get)

パス指定は、こうあります。

```
/pcloud/v1/tenants/{tenant_id}
```

cloud_instance_id を取得するには、その前に tenant_id を取得する必要があるようです。
しかし、これが何か、分かりませんでした。

「[Power Systems Virtual Server on IBM Cloud で FlashCopy (Snapshot, Restore, Clone) を操作する](https://qiita.com/khayama/items/f0bf62dc04677a321e0c)」を拝見しました。

> アカウント ID の取得
以下のコマンド、または https://cloud.ibm.com/account/settings から取得できます。

```
export TENANT_ID=$(ibmcloud account show --output JSON | jq -r '.account_id')
echo $TENANT_ID
```

tenant_id は、IBM Cloud のアカウント ID のことでした。
できるだけ用語を統一して欲しいものです。

アカウント情報を JSON で取得し、キー account_id を使って、アカウント ID を値を代入します。

```
$TENANT_ID = (ibmcloud account show --output JSON | ConvertFrom-Json ).account_id
```

アカウント ID をもとにテナントの状況を取得する API を 呼び出します。

```
$TENANT_STATE = ( `
curl.exe -X GET `
   https://us-south.power-iaas.cloud.ibm.com//pcloud/v1/tenants/$TENANT_ID `
  -H "Authorization: $TOKEN" `
  -H "CRN: $CRN_DAL" `
  -H "Content-Type: application/json"  `
| ConvertFrom-Json )
```

取得した結果の中から「cloudInstances」キーの部分を表示します。「cloudInstanceID」の値が表示されています。


```
PS C:\Users\YASUHIROOnoda> $TENANT_STATE.cloudInstances


capabilities    : {}
cloudInstanceID : 4e71cac6fe9e429fa8def21e736f9db6
enabled         : True
href            : /pcloud/v1/cloud-instances/4e71cac6fe9e429fa8def21e736f9db6
initialized     : False
limits          : @{instanceMemory=0; instanceProcUnits=0; instances=0; memory=0; peeringBandwidth=0; peeringNetworks=0; procUn
                  its=0; processors=0; storage=0; storageSSD=0}
name            : 64583f35-cc04-476b-b14d-486469561a31
region          : us-south

capabilities    : {}
cloudInstanceID : b1f0b27fee8b43658e8148321f4cfef4
enabled         : True
href            : /pcloud/v1/cloud-instances/b1f0b27fee8b43658e8148321f4cfef4
initialized     : False
limits          : @{instanceMemory=0; instanceProcUnits=0; instances=0; memory=0; peeringBandwidth=0; peeringNetworks=0; procUn
                  its=0; processors=0; storage=0; storageSSD=0}
name            : 8b97a1ed-437a-4bcf-bbad-207189c67caa
region          : syd04
```

name の値が「ibmcloud pi service-list」で取得した CRN の一部であることが分かります。

```
PS C:\Users\YASUHIROOnoda> $CRN

CRN                                                                                                                 Name
---                                                                                                                 ----
crn:v1:bluemix:public:power-iaas:syd04:a/e877c6e935024906adaa6336c7113334:8b97a1ed-437a-4bcf-bbad-207189c67caa::    SYD04
crn:v1:bluemix:public:power-iaas:us-south:a/e877c6e935024906adaa6336c7113334:64583f35-cc04-476b-b14d-486469561a31:: DAL
```

今回の DAL なら name は「**64583f35-cc04-476b-b14d-486469561a31**」です。
対応する CRN は「crn:v1:bluemix:public:power-iaas:us-south:a/e877c6e935024906adaa6336c7113334:**64583f35-cc04-476b-b14d-486469561a31**::」です。

この値は「ibmcloud resource service-instance サービス名」の GUID 値としても取得できます。

```
PS C:\Users\YASUHIROOnoda> $GUID = (ibmcloud resource service-instance DAL --output JSON | ConvertFrom-Json ).GUID
PS C:\Users\YASUHIROOnoda> $GUID
64583f35-cc04-476b-b14d-486469561a31
```

この GUID を使って、先ほど取得したテナント状況の情報から cloud_instance_id を取得しましょう。

```
PS C:\Users\YASUHIROOnoda> $CLOUD_INSTANCE_ID = ( $TENANT_STATE.cloudInstances |  Where-Object {$_.Name -eq $GUID} ).cloudInstanceID
PS C:\Users\YASUHIROOnoda> $CLOUD_INSTANCE_ID
4e71cac6fe9e429fa8def21e736f9db6
```

cloud_instance_id が取得できました。

### pvm_instance_id の取得

pvm_instance_id は、PowerVS のインスタンスの ID です。

現在、ターゲットに設定しているダラスには二つのインスタンスを保有しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/5948633c-aed3-e1e3-18cf-2a079fe668fb.png)

CLI「ibmcloud pi instances --json」でインスタンスの情報を取得します。

```
$INTANCES = ( ibmcloud pi instances --json | ConvertFrom-Json )
```

取得した変数の「Payload.pvmInstances」キーで各インスタンスの情報が確認できます。
「serverName」にサーバー名が「pvmInstanceID」に取得したい pvm_instance_id が入っています。

```
PS C:\Users\YASUHIROOnoda> $INTANCES.Payload.pvmInstances.serverName
DAL-V7R3
DAL-V7R4
PS C:\Users\YASUHIROOnoda> $INTANCES.Payload.pvmInstances.pvmInstanceID
cf7b7ff3-657e-4d67-a1e5-7858d6ec9138
df222d71-064f-46d8-a239-e9e12791a94b
```

serverName が今回対象の「DAL-V7R4」と等しい pvmInstanceID の値を取得します。

```
PS C:\Users\YASUHIROOnoda> $PVM_INSTANCE_ID = ( $INTANCES.Payload.pvmInstances |  Where-Object {$_.serverName -eq "DAL-V7R4"} ).pvmInstanceID
PS C:\Users\YASUHIROOnoda> $PVM_INSTANCE_ID
df222d71-064f-46d8-a239-e9e12791a94b
```
pvm_instance_id が取得できました。

### volumeID のリストの取得

CLI「ibmcloud pi instance-list-volumes インスタンス名 --json」でインスタンスに接続されたボリュームの情報が取得できます。

キー「Payload.volumes」に接続されたボリュームの情報がリストで入っています。
今回のインスタンスでは、ボリューム は 一つしかありませんので、[0] で最初の要素の name を取得しています。
ここには、その名も volumeID をいうキーがあるのですが。そちらではなく **name** キーを使います。
用語の統一が望まれます。

```
PS C:\Users\YASUHIROOnoda> $VOL_ID = ( ibmcloud pi instance-list-volumes DAL-V7R4 --json | ConvertFrom-Json ).Payload.volumes[0].name
PS C:\Users\YASUHIROOnoda> $VOL_ID
DAL-V7R4-df222d71-0000439a-boot-0
```

## スナップショット作成前の状態の確認

下記のコマンドで、ライブラリー「TESTLIB」が無いことを確認します。

```
WRKOBJAMT LIB(TESTLIB)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/7904dba2-e99b-0fd5-7893-7ca257c977cf.png)

## スナップショット作成 API の呼び出し

パラメーターはそろいました。このような変数に入っています。

* 認証情報
 * $TOKEN
 * $CRN_DAL
* パスに指定するパラメーター
 * $CLOUD_INSTANCE_ID
 * $PVM_INSTANCE_ID
* ボディに指定するパラメーター
 * 名前
 * 記述
 * $VOL_ID


資料の例では、このような呼び出しになっています。

```
curl -X POST \
https://us-east.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/{cloud_instance_id}/pvm-instances/{pvm_instance_id}/snapshots \
 -H 'Authorization: Bearer <>' \
 -H 'CRN: crn:v1...' \
 -H 'Content-Type: application/json' \
 -d '{
        "name": "VM1-SS"
        "description": "Snapshot for VM1"
        "volumeIDs": "VM1-7397dc00-0000035b-boot-0"
      }'
```

Windows の curl.exe は、POST の Body 送信に癖があることで評判です。
コマンドプロンプトからなら「"」を「\"」とエスケープすればいいと、いろいろなところに書かれているのですが、PowerShell との組み合わせのためか、いろいろ試行錯誤してもうまくいきませんでした。

そこでいったん Body の内容を、いったん変数にすることにしました。

```
$BODY = '{"name": "DAL-V7R4-SS", "description": "Snapshot-for-DAL-V7R4", "volumeIDs": ["' + $VOL_ID + '"] }'
```

実行結果はこちらです。

```
PS C:\Users\YASUHIROOnoda> $BODY = '{"name": "DAL-V7R4-SS", "description": "Snapshot-for-DAL-V7R4", "volumeIDs": ["' + $VOL_ID + '"] }'
PS C:\Users\YASUHIROOnoda> $BODY
{"name": "DAL-V7R4-SS", "description": "Snapshot-for-DAL-V7R4", "volumeIDs": ["DAL-V7R4-df222d71-0000439a-boot-0"] }
```

その変数をパイプでつなぎ、curl.exeの「-d @-」で標準入力から送信する Body を受け取るようにしました。
下記で「-d **`**@-」と「`」が入っているのは、「@」をPowerShell が解釈しないように、エスケープしているためです。


```
( $BODY | curl.exe -X POST `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
  -H "Authorization: $TOKEN" `
  -H "CRN: $CRN_DAL" `
  -H "Content-Type: application/json" `
  -d `@- )
```


snapshotID が返ってきました。正常に処理されたようです。

```
PS C:\Users\YASUHIROOnoda> ( $BODY | curl.exe -X POST `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
>>  -H "Authorization: $TOKEN" `
>>  -H "CRN: $CRN_DAL" `
>>  -H "Content-Type: application/json" `
>>  -d `@- )
Note: Unnecessary use of -X or --request, POST is already inferred.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   170  100    54  100   116      9     19  0:00:06  0:00:06 --:--:--    16
{"snapshotID":"d5733353-c4c2-424c-bd4d-7df04acb11a8"}
```

## 一度目の変更と、スナップショットの再取得

環境に手を加えます。
ライブラリー TESTLIB を作成します。

```
CRTLIB LIB(TESTLIB)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/2accd8ea-607d-7162-1e64-0fa30163ae56.png)

再度、スナップショットを作成します。

名前や記述を別のものにします。

```
$BODY = '{"name": "DAL-V7R4-SS-2", "description": "Snapshot-for-DAL-V7R4 No.2", "volumeIDs": ["' + $VOL_ID + '"] }'
```

今回は、結果を変数に代入ます。

```
$SS_ID = ( $BODY | curl.exe -X POST `
https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
  -H "Authorization: $TOKEN" `
  -H "CRN: $CRN_DAL" `
  -H "Content-Type: application/json" `
  -d `@- )
```

正常にスナップショットが取得され、作成されたスナップショットの ID が変数に取得できています。

```
PS C:\Users\YASUHIROOnoda> $BODY = '{"name": "DAL-V7R4-SS-2", "description": "Snapshot-for-DAL-V7R4 No.2", "volumeIDs": ["' + $VOL_ID + '"] }'
PS C:\Users\YASUHIROOnoda> $BODY
{"name": "DAL-V7R4-SS-2", "description": "Snapshot-for-DAL-V7R4 No.2", "volumeIDs": ["DAL-V7R4-df222d71-0000439a-boot-0"] }
PS C:\Users\YASUHIROOnoda> $SS_ID = ( $BODY | curl.exe -X POST `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
>>   -H "Authorization: $TOKEN" `
>>   -H "CRN: $CRN_DAL" `
>>   -H "Content-Type: application/json" `
>>   -d `@- )
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   177  100    54  100   123     10     24  0:00:05  0:00:05 --:--:--    12
PS C:\Users\YASUHIROOnoda> $SS_ID
{"snapshotID":"3ec75447-90ea-4f4b-83ef-357b96c5f93a"}
```

## スナップショットの一覧の取得

スナップショットの一覧を取得することができます。

* [Get all snapshots for this PVM instance](https://cloud.ibm.com/apidocs/power-cloud#pcloud-pvminstances-snapshots-getall)

資料の実行例は、このようになっています。

```
curl -X GET \
  https://us-east.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/{cloud_instance_id}/pvm-instances/{pvm_instance_id}/snapshots \
 -H 'Authorization: Bearer <>' \
 -H 'CRN: crn:v1...' \
 -H 'Content-Type: application/json'
```

今回の環境ではこう呼び出せばいいようです。

```
curl.exe -X GET `
https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
  -H "Authorization: $TOKEN" `
  -H "CRN: $CRN_DAL" `
  -H "Content-Type: application/json"
```

結果の JSON をパースして変数に代入するならこうです。

```
$SS_IDs = ( curl.exe -X GET `
https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
  -H "Authorization: $TOKEN" `
  -H "CRN: $CRN_DAL" `
  -H "Content-Type: application/json" | ConvertFrom-Json )
```

スナップショットの一覧が取得できています。

percentComplete で、スナップショット取得の進捗が確認できます。
今回はどちらも 100 になっているので完了しています。

```
PS C:\Users\YASUHIROOnoda> $SS_IDs = ( curl.exe -X GET `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
>>   -H "Authorization: $TOKEN" `
>>   -H "CRN: $CRN_DAL" `
>>   -H "Content-Type: application/json" | ConvertFrom-Json )
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   853  100   853    0     0    853      0  0:00:01  0:00:01 --:--:--   665

PS C:\Users\YASUHIROOnoda> $SS_IDs.snapshots

action          : snapshot
creationDate    : 2020-10-29T14:11:02.000Z
description     : Snapshot-for-DAL-V7R4 No.2
lastUpdateDate  : 2020-10-29T14:11:07.000Z
name            : DAL-V7R4-SS-2
percentComplete : 100
pvmInstanceID   : df222d71-064f-46d8-a239-e9e12791a94b
snapshotID      : 3ec75447-90ea-4f4b-83ef-357b96c5f93a
status          : available
volumeSnapshots : @{7d747dff-cbd4-4f97-98a6-e59008f5153c=409b420a-36d5-4a7a-bc2c-80a7df046704}

action          : snapshot
creationDate    : 2020-10-29T13:53:44.000Z
description     : Snapshot-for-DAL-V7R4
lastUpdateDate  : 2020-10-29T13:53:51.000Z
name            : DAL-V7R4-SS
percentComplete : 100
pvmInstanceID   : df222d71-064f-46d8-a239-e9e12791a94b
snapshotID      : d5733353-c4c2-424c-bd4d-7df04acb11a8
status          : available
volumeSnapshots : @{7d747dff-cbd4-4f97-98a6-e59008f5153c=e9ae6708-b855-4b45-b1ad-cedb442d1631}
```

なお、スナップショットは、ポータルのボリュームには表示されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/2e0f31a3-7908-5988-e317-fb2e9d2c894d.png)

ブートイメージにも表示されていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/c3d4b148-4cf9-3f1f-8838-76193e0b7f96.png)

## 2 度目の変更

さらに環境に手を加えます。
ライブラリー TESTLIB に ファイル PF を作成し、AMT がで確認します。

```
CRTPF FILE(TESTLIB/PF) RCDLEN(132)
WRKOBJAMT LIB(TESTLIB)
```

作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/e9da0734-3fa9-faae-03b7-0d0ed051e354.png)

## スナップショットの復元

スナップショットの復元に使う API は下記です。

* [Restore a PVM Instance snapshot](https://cloud.ibm.com/apidocs/power-cloud#pcloud-pvminstances-snapshots-restore-post)

実行例は、こうなっています。

```
curl -X POST \
  https://us-east.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/{cloud_instance_id}/pvm-instances/{pvm_instance_id}/snapshots/{snapshot_id}/restore \
    -H 'Authorization: Bearer <>' \
    -H 'CRN: crn:v1...' \
    -H 'Content-Type: application/json' \
    -d '{
       "force": "true"
       }'
```

今回の場合、ふたつめのスナップショットへ戻すなら、こうです。
なお「"force": "true"」は、インスタンスのシャットダウンを強制しないオプションです。
「"true"」としたらエラーになりましたので「"」外して論理値にしています。

```
$BODY = '{"force": true}'

$BODY | curl.exe -X POST `
https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots/3ec75447-90ea-4f4b-83ef-357b96c5f93a/restore `
  -H "Authorization: $TOKEN" `
  -H "CRN: $CRN_DAL" `
  -H "Content-Type: application/json" `
  -d `@-
```

実行結果は、こうなりました。

```
PS C:\Users\YASUHIROOnoda> $BODY = '{"force": true}'
PS C:\Users\YASUHIROOnoda> $BODY | curl.exe -X POST `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots/3ec75447-90ea-4f4b-83ef-357b96c5f93a/restore `
>>   -H "Authorization: $TOKEN" `
>>   -H "CRN: $CRN_DAL" `
>>   -H "Content-Type: application/json" `
>>   -d `@-
{"action":"restore","creationDate":"2020-10-29T14:11:02.000Z","description":"Snapshot-for-DAL-V7R4 No.2","lastUpdateDate":"2020-10-29T14:49:31.000Z","name":"DAL-V7R4-SS-2","pvmInstanceID":"df222d71-064f-46d8-a239-e9e12791a94b","snapshotID":"3ec75447-90ea-4f4b-83ef-357b96c5f93a","status":"available","volumeSnapshots":{"7d747dff-cbd4-4f97-98a6-e59008f5153c":"409b420a-36d5-4a7a-bc2c-80a7df046704"}}
```

対象のインスタンスにアクセスできなくなりました。コンソールから SRCを確認すると「C200 6xxx Secondary partition load LIC from load source phase」ですので、再起動しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/40c564f3-b333-6162-bd63-4ba033faa333.png)

## 復元の確認

SRC が 00000000 になったことを確認し、サインオンして、TESTLIB の状況を確認します。

```
WRKOBJAMT LIB(TESTLIB)
```

エラーになりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/53c2a7ab-5ebb-a9b6-3be4-94d272f60983.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/e4286858-785b-f867-5bdb-1a929e8aa2ce.png)


「WRKOBJAMT LIB(QGPL)」は処理できますので、TESTLIB が破損しているようです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/b396d165-9130-f80f-0a18-cacad21367a2.png)

## 再度の復元

先ほどは「{"force": true}」で IBM i の**稼働中**に復元を行いました。
そのため、ライブラリー作成後にファイルを作成したブートディスクと、ファイルを作成したいないスナップショットの状況が混じり、不整合が起きたようです。

「[資料](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-volume-snapshot-clone&locale=ja)」を確認すると、このような記述がありました。

> ブート・ディスクのリストアを予定している場合、VM をシャットダウンする必要があります。

一度、IBM i をシャットダウンして、再度、スナップショットから復元してみます。

```
PS C:\Users\YASUHIROOnoda> $BODY | curl.exe -X POST `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots/3ec75447-90ea-4f4b-83ef-357b96c5f93a/restore `
>>   -H "Authorization: $TOKEN" `
>>   -H "CRN: $CRN_DAL" `
>>   -H "Content-Type: application/json" `
>>   -d `@-
{"action":"restore","creationDate":"2020-10-29T14:11:02.000Z","description":"Snapshot-for-DAL-V7R4 No.2","lastUpdateDate":"2020-10-29T15:16:32.000Z","name":"DAL-V7R4-SS-2","percentComplete":25,"pvmInstanceID":"df222d71-064f-46d8-a239-e9e12791a94b","snapshotID":"3ec75447-90ea-4f4b-83ef-357b96c5f93a","status":"restoring","volumeSnapshots":{"7d747dff-cbd4-4f97-98a6-e59008f5153c":"409b420a-36d5-4a7a-bc2c-80a7df046704"}}
```

復元後 IBM i を起動すると、今度はファイルの作成前のライブラリーの状態が確認できました。

```
WRKOBJAMT LIB(TESTLIB)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/524ef5e6-9650-7279-1a62-32da4019e42f.png)


## スナップショットの復元の進捗を確認する

2 回の復元では「**"percentComplete":25**」のように進捗が表示されました。

{"action":"restore","creationDate":"2020-10-29T14:11:02.000Z","description":"Snapshot-for-DAL-V7R4 No.2","lastUpdateDate":"2020-10-29T15:16:32.000Z","name":"DAL-V7R4-SS-2",**"percentComplete":25**,"pvmInstanceID":"df222d71-064f-46d8-a239-e9e12791a94b","snapshotID":"3ec75447-90ea-4f4b-83ef-357b96c5f93a","status":"restoring","volumeSnapshots":{"7d747dff-cbd4-4f97-98a6-e59008f5153c":"409b420a-36d5-4a7a-bc2c-80a7df046704"}}

スナップショットの復元が完了したかは、スナップショットの状態一覧で確認できます。

下記の例では、復元に使った「name : DAL-V7R4-SS-2」は「action : restore」「percentComplete : 63」になっています。
これは、復元処理が 63 % まで進んだことを意味します。「action : restore」に対して「percentComplete : 100」になれば復元が完了しています。

起動するのは 復元の完了を確認してからにしましょう。

```
PS C:\Users\YASUHIROOnoda> $SS_IDs = ( curl.exe -X GET `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
>>   -H "Authorization: $TOKEN" `
>>   -H "CRN: $CRN_DAL" `
>>   -H "Content-Type: application/json" | ConvertFrom-Json )
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   851  100   851    0     0    851      0  0:00:01  0:00:01 --:--:--   812

PS C:\Users\YASUHIROOnoda> $SS_IDs.snapshots

action          : restore
creationDate    : 2020-10-29T14:11:02.000Z
description     : Snapshot-for-DAL-V7R4 No.2
lastUpdateDate  : 2020-10-30T00:53:31.000Z
name            : DAL-V7R4-SS-2
percentComplete : 63
pvmInstanceID   : df222d71-064f-46d8-a239-e9e12791a94b
snapshotID      : 3ec75447-90ea-4f4b-83ef-357b96c5f93a
status          : restoring
volumeSnapshots : @{7d747dff-cbd4-4f97-98a6-e59008f5153c=409b420a-36d5-4a7a-bc2c-80a7df046704}

action          : snapshot
creationDate    : 2020-10-29T13:53:44.000Z
description     : Snapshot-for-DAL-V7R4
lastUpdateDate  : 2020-10-29T13:53:51.000Z
name            : DAL-V7R4-SS
percentComplete : 100
pvmInstanceID   : df222d71-064f-46d8-a239-e9e12791a94b
snapshotID      : d5733353-c4c2-424c-bd4d-7df04acb11a8
status          : available
volumeSnapshots : @{7d747dff-cbd4-4f97-98a6-e59008f5153c=e9ae6708-b855-4b45-b1ad-cedb442d1631}
```

## スナップショットの削除

削除用の API はこちらです。

* [Delete a PVM instance snapshot of a cloud instance](https://cloud.ibm.com/apidocs/power-cloud#pcloud-cloudinstances-snapshots-delete)

実行例はこちらです。

```
curl -X DELETE \
  https://us-east.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/{cloud_instance_id}/snapshots/{snapshot_id} \
   -H 'Authorization: Bearer <>' \
   -H 'CRN: crn:v1...' \
   -H 'Content-Type: application/json' \
```

「snapshotID : 3ec75447-90ea-4f4b-83ef-357b96c5f93a」を削除する場合は、こうですね。
(変数代入をサボり、直接指定しています。)

```
curl.exe -X DELETE`
 https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/snapshots/3ec75447-90ea-4f4b-83ef-357b96c5f93a `
 -H "Authorization: $TOKEN" `
 -H "CRN: $CRN_DAL" `
 -H "Content-Type: application/json" 
```

実行します。

```
PS C:\Users\YASUHIROOnoda> curl.exe -X DELETE `
>>  https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/snapshots/3ec75447-90ea-4f4b-83ef-357b96c5f93a `
>>  -H "Authorization: $TOKEN" `
>>  -H "CRN: $CRN_DAL" `
>>  -H "Content-Type: application/json"
{}
```

状態を確認すると「status : deleting」になっています。

```
PS C:\Users\YASUHIROOnoda> $SS_ID = ( $BODY | curl.exe -X POST `
>> https://us-south.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUD_INSTANCE_ID/pvm-instances/$PVM_INSTANCE_ID/snapshots `
>>   -H "Authorization: $TOKEN" `
>>   -H "CRN: $CRN_DAL" `
>>   -H "Content-Type: application/json" `
>>   -d `@- )
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    64  100    49  100    15     49     15  0:00:01 --:--:--  0:00:01    74
PS C:\Users\YASUHIROOnoda> $SS_IDs.snapshots


action          : restore
creationDate    : 2020-10-29T14:11:02.000Z
description     : Snapshot-for-DAL-V7R4 No.2
lastUpdateDate  : 2020-10-30T05:36:47.000Z
name            : DAL-V7R4-SS-2
percentComplete : 100
pvmInstanceID   : df222d71-064f-46d8-a239-e9e12791a94b
snapshotID      : 3ec75447-90ea-4f4b-83ef-357b96c5f93a
status          : deleting
volumeSnapshots : @{7d747dff-cbd4-4f97-98a6-e59008f5153c=409b420a-36d5-4a7a-bc2c-80a7df046704}
(略)
```

しばらくすると、スナップショットは表示されなくなります。


## まとめ

今回は IBM Cloud API で PowerVS のスナップショットを Windows の PowerShell から操作しました。

API のパラメーターにする情報は、PowerShell では下記の方法で取得ししました。

* CLI で JSON 形式で取得
* ConvertFrom-Json コマンドレットで PowerShell のオブジェクトに変換
* Where-Object  コマンドレット でオブジェクトを検索

REST 呼び出しには curl.exe を使いました。
Windows の crul.exe の POST 呼び出しは Body の処理に癖があるので、いったん変数にし、パイプで curl.exe に渡し 「-d `@-」で処理しました。

スナップショットは、有効な機能です。CLI の対応、東京での利用可能化が待ち遠しいです。

---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。