IBM Cloud: VPCのregional snapshot機能を試してみた

#1. はじめに

VPCのregional snapshot機能のBetaが始まっていたので試してみた（2021/03/30時点でBetaですが、利用いただきたい場合はIBMの営業にご相談いただき、snapshot機能の有効化の許可を得る必要があります）
https://cloud.ibm.com/docs/vpc?topic=vpc-snapshots-vpc-create&locale=en

なお、[ここ](https://cloud.ibm.com/docs/vpc?topic=vpc-snapshots-vpc-manage#snapshots-vpc-delete-snapshot-cli&locale=en)に記載があるように、ベータであっても東京リージョンではまだUIが利用できないようだ。UIでの作業は簡単に構成できるので、UIは画面キャプチャーをメインに紹介し、CLIでのステップを詳細に追ってみた。
>In the UI, you can create a snapshot of a Block Storage for VPC volume that's attached to a running virtual server instance.
The snapshots UI is available only in these regions: Sydney (au-syd), France (eu-fr2), and Japan (jp-osa).

以下に主な特徴を記す。

- Regional Snapshotと呼ばれているように、同一Region内であればZone1で作られたSnapshotを元にZone2やZone3のVolumeとして展開することができる。
- 同一Regionであれば、別VPCへの展開にも利用できる。（さすがに別アカウントのVPCには利用できなさそう）
- Snapshotを取得する対象のVSIは起動中である必要がある。VSIが停止している場合は以下のエラーが発生する。

```shell:VSI停止中にsnapshotを取得しようとした場合のエラー
$ ibmcloud is snapshot-create --name syasuda-tok1-vpc1-boot-snap3 --volume r022-47b737a7-5fdb-47da-9b1e-09726a0966cc --resource-group-name Common
Creating snapshot syasuda-tok1-vpc1-boot-snap3 in resource group Common under account IBM as user shiyasu@jp.ibm.com...
FAILED
Failed to create snapshot.

FAILED
Response HTTP Status Code: 409
Error code: snapshots_attached_instance_not_running
Error message: The attached instance is not running
More information: Ensure the attached instance is powered on
Trace ID: 4db45f17-eafe-42f7-b907-c5cfa47a8e9b
```


#2. UI（大阪リージョン）での使用例

##2-1. Snapshot作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c3f96cd3-27df-2164-bf06-f30349016c20.png)

##2-2. リストア例1: Snapshotから新規VSIを作成する場合
選択肢として、`Snapshot`というカテゴリーが表示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ebd41321-08bc-fcad-ed9c-44a6f75b43c4.png)

##2-3. リストア例2: Snapshotから作成したVolumeを既存VSIに追加する場合
稼働中のVSIにAttachすることが可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e8d42524-f345-470f-189b-92f522186eb8.png)

#3. CLI（東京リージョン）での使用例

CLIについてのガイドは、（若干わかりづらいが）以下のタブを選択する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6491412d-f970-0a5c-b2da-496332c5b7f3.png)

##3-1. 事前準備

```shell:事前準備
#英語表示
$ export LANG=C

#CLIの最新化
$ ibmcloud update
Checking for updates...
No update required. Your CLI is already up-to-date.

#ログイン
$ibmcloud login
or
$ibmcloud login -sso

#東京リージョンにスイッチ
$ ibmcloud target -r jp-tok

#VPC Gen2がCLIのtargetになっていることを確認
$ ibmcloud is target
Target Generation: 2

```

このままでも、snapshotのCLIは使えるのだが、コマンド一覧には見えてこない。コマンド一覧への表示を有効化するためには以下の環境変数を設定する。

```shell:（オプション）コマンド一覧への表示の有効化
$ ibmcloud is --help|grep snapshot

#ヘルプの有効化
$ export IBMCLOUD_IS_FEATURE_SNAPSHOT=true

$ibmcloud is --help|grep snapshot
    snapshot                                                    [Beta] View details of a snapshot
    snapshot-create, snapshotc                                  [Beta] Create a snapshot from a volume
    snapshot-delete, snapshotd                                  [Beta] Delete snapshots
    snapshot-delete-from-source, snapshotsd, snapshots-delete   [Beta] Delete snapshots by source volume
    snapshot-update, snapshotu                                  [Beta] Update a snapshot
    snapshots                                                   [Beta] List all snapshots
```

##3-2. Snapshotの作成

```shell:Volumeの確認
$ ibmcloud is volumes
Listing volumes for generation 2 compute in all resource groups and region jp-tok under account xxx as user xxxxxxx@xx.xxx.xxx...
ID                                          Name                                           Status      Capacity   IOPS   Profile           Attachment type   Zone       Resource group
r022-47b737a7-5fdb-47da-9b1e-09726a0966cc   syasuda-tok1-vpc1-boot                         available   100        3000   general-purpose   boot              jp-tok-1   Common
r022-08541c07-c825-4918-9ae1-3b94cd7e7d6e   syasuda-webserver1-boot-1611015072000          available   100        3000   general-purpose   boot              jp-tok-1   Common
```

```shell:Snapshotの作成
#resource groupに何も指定をしないとDefaultで作られてしまうので、今回は指定をした。
$ ibmcloud is snapshot-create --name syasuda-tok1-vpc1-boot-snap --volume r022-47b737a7-5fdb-47da-9b1e-09726a0966cc --resource-group-name Common
Creating snapshot syasuda-tok1-vpc1-boot-snap in resource group Common under account xxx as user xxxxxx@xx.xxx.xxx...

ID                 r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6
Name               syasuda-tok1-vpc1-boot-snap
CRN                crn:v1:bluemix:public:is:jp-tok:a/039dbe6794084c7cb514a276dd2345da::snapshot:r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6
Status             pending
Source Volume      ID                                          Name
                   r022-47b737a7-5fdb-47da-9b1e-09726a0966cc   syasuda-tok1-vpc1-boot

Progress           0
Bootable           true
Deletable          false
Encryption         provider_managed
Encryption key     -
Minimum Capacity   100
Size               1
Source Image       ID                                          Name
                   r022-6f153a5d-6a9a-496d-8063-5c39932f6ded   ibm-centos-7-6-minimal-amd64-2

Operating System   Name             Vendor   Version                 Family   Architecture   Display Name
                   centos-7-amd64   CentOS   7.x - Minimal Install   CentOS   amd64          CentOS 7.x - Minimal Install (amd64)

Resource group     ID                                 Name
                   89e3e245955e4c59a83bc9d0db590082   Common

Created            2021-03-30T09:06:45+09:00

#Snapshot取得直後のステータスはpending
$ ibmcloud is snapshots
Listing snapshots for generation 2 compute in all resource groups and region jp-tok under account xxx as user xxxxxx@xx.xxx.xxx...
ID                                          Name                          Status    Progress   Source Volume                               Bootable   Resource group   Created
r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6   syasuda-tok1-vpc1-boot-snap   pending   0          r022-47b737a7-5fdb-47da-9b1e-09726a0966cc   true       Common           2021-03-30T09:06:45+09:00

#Snapshot取得30秒後ぐらいのステータスはstable
$ ibmcloud is snapshots
Listing snapshots for generation 2 compute in all resource groups and region jp-tok under account xxx as user xxxxxx@xx.xxx.xxx...
ID                                          Name                          Status   Progress   Source Volume                               Bootable   Resource group   Created
r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6   syasuda-tok1-vpc1-boot-snap   stable   -          r022-47b737a7-5fdb-47da-9b1e-09726a0966cc   true       Common           2021-03-30T09:06:45+09:00

#詳細情報
$ ibmcloud is snapshot r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6
Getting snapshot r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6 under account xxx as user xxxxxx@xx.xxx.xxx...

ID                 r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6
Name               syasuda-tok1-vpc1-boot-snap
CRN                crn:v1:bluemix:public:is:jp-tok:a/039dbe6794084c7cb514a276dd2345da::snapshot:r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6
Status             stable
Source Volume      ID                                          Name
                   r022-47b737a7-5fdb-47da-9b1e-09726a0966cc   syasuda-tok1-vpc1-boot

Progress           -
Bootable           true
Deletable          true
Encryption         provider_managed
Encryption key     -
Minimum Capacity   100
Size               2
Source Image       ID                                          Name
                   r022-6f153a5d-6a9a-496d-8063-5c39932f6ded   ibm-centos-7-6-minimal-amd64-2

Operating System   Name             Vendor   Version                 Family   Architecture   Display Name
                   centos-7-amd64   CentOS   7.x - Minimal Install   CentOS   amd64          CentOS 7.x - Minimal Install (amd64)

Resource group     ID                                 Name
                   89e3e245955e4c59a83bc9d0db590082   Common

Created            2021-03-30T09:06:45+09:00
```

##3-3. Snapshotのリストア

CLIでも実行できそうだが、より細かいカスタマイズを簡単に実施したいため、
https://qiita.com/testnin2/items/337bc02892024fb684a3
で紹介したように、sample APIを生成させた後に、volumeの箇所に`source_snapshot`の項を追加。また、imageは指定する必要がないので削除。

```json:追記例
   "volume":{
      （省略）
      "source_snapshot":{
         "id":"r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6"
      }
   }
```
```json:削除内容
  "image": {
    "id": "r022-2c5a6b07-1e34-420c-8361-286c8ba178dc"
  }
```


```shell:createVSIfromSnapshot.sh
# 実際の生成したスクリプトを、今回取得したsnapshotに合わせて置き換えた例
# Create a virtual server instance

curl -X POST \
  "https://jp-tok.iaas.cloud.ibm.com/v1/instances?version=2021-03-09&generation=2" \
  -H "Authorization: Bearer $iam_token" \
  -H "User-Agent: IBM_One_Cloud_IS_UI/5.35.0" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "accept: application/json" \
  -H "x-proxy-from: https://cloud.ibm.com/vpc-ext/data/graphql?bss_account=039dbe6794084c7cb514a276dd2345da&ims_account=1756623&country=JPN" \
  -d '{
  "zone": {
    "name": "jp-tok-3"
  },
  "resource_group": {
    "id": "89e3e245955e4c59a83bc9d0db590082"
  },
  "name": "snapshottest1",
  "vpc": {
    "id": "r022-85621b2c-a349-4ae6-87e3-767ddeac7298"
  },
  "user_data": "",
  "profile": {
    "name": "bx2-2x8"
  },
  "keys": [
    {
      "id": "r022-b2ea5471-72f1-454a-9d3c-c865ad02545d"
    }
  ],
  "primary_network_interface": {
    "name": "eth0",
    "allow_ip_spoofing": false,
    "subnet": {
      "id": "02g7-a65939b2-6b69-443a-b149-d7f241d7a6c1"
    },
    "security_groups": [
      {
        "id": "r022-1a2bb9f2-7647-4332-8a1b-eb925fb6e160"
      }
    ]
  },
  "network_interfaces": [],
  "volume_attachments": [],
  "boot_volume_attachment": {
    "volume": {
      "name": "snapshottest1-boot-1617064484000",
      "capacity": 100,
      "profile": {
        "name": "general-purpose"
      },
      "source_snapshot":{
         "id":"r150-4d5a7b24-98ba-4cb9-b6fb-215cc79c69e6"
      }
    },
   "delete_volume_on_instance_delete": true
  }
}'
```

```shell:プロビジョニング
$ export iam_token=`ibmcloud iam oauth-tokens | awk '{printf $4}'`
$ sh createVSIfromSnapshot.sh
```

これで、このsnapshotを元にVSIが作成される。


#4. UUIDの比較

- System UUIDは変更される。これは、[ここ](https://qiita.com/testnin2/items/0e9c71da44781797f813)でも記載した通り、別VSIとして起動してくるので仕方がないことかも。。。
- Storage領域は、SWAP領域を除きUUIDは変更されていない。

```shell:snashot元のVSI
[root@new-syasuda-tok1-vpc1 ~]# dmidecode -s system-uuid
1ef7e055-d4b5-46e9-ac5f-014af031a808
[root@new-syasuda-tok1-vpc1 ~]# cat /sys/devices/virtual/dmi/id/product_uuid
1EF7E055-D4B5-46E9-AC5F-014AF031A808
[root@new-syasuda-tok1-vpc1 ~]# lsblk -o +LABEL,UUID,FSTYPE,SIZE,OWNER,MODE
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT LABEL      UUID                                 FSTYPE   SIZE OWNER MODE
vda    253:0    0  100G  0 disk                                                                     100G root  brw-rw----
├─vda1 253:1    0    1G  0 part /boot      BOOT       fa4c5ff7-f540-40a1-be62-347aa246a856 ext3       1G root  brw-rw----
└─vda2 253:2    0   99G  0 part /          ROOT       ddac8416-8037-4b93-a480-71c74b7ee6e7 ext3      99G root  brw-rw----
vdb    253:16   0  368K  0 disk            cidata     2021-03-30-03-31-23-00               iso9660  368K root  brw-rw----
vdc    253:32   0   44K  0 disk [SWAP]     SWAP-xvdb1 f824a6dd-8300-4295-83b4-11dfd06bbd71 swap      44K root  brw-rw----

```

```shell:snashotをリストアしたVSI
[root@snapshottest1 ~]# dmidecode -s system-uuid
98961c37-2d03-426f-8b9c-d09d9c646842
[root@snapshottest1 ~]# cat /sys/devices/virtual/dmi/id/product_uuid
98961C37-2D03-426F-8B9C-D09D9C646842
[root@snapshottest1 ~]# lsblk -o +LABEL,UUID,FSTYPE,SIZE,OWNER,MODE
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT LABEL      UUID                                 FSTYPE   SIZE OWNER MODE
vda    253:0    0  100G  0 disk                                                                     100G root  brw-rw----
├─vda1 253:1    0    1G  0 part /boot      BOOT       fa4c5ff7-f540-40a1-be62-347aa246a856 ext3       1G root  brw-rw----
└─vda2 253:2    0   99G  0 part /          ROOT       ddac8416-8037-4b93-a480-71c74b7ee6e7 ext3      99G root  brw-rw----
vdb    253:16   0  368K  0 disk            cidata     2021-04-01-00-57-29-00               iso9660  368K root  brw-rw----
vdc    253:32   0   44K  0 disk [SWAP]     SWAP-xvdb1 3c2b9f6e-cfc1-488e-b01e-93349db98cc3 swap      44K root  brw-rw----

```