VMインスタンスをERROR状態からACTIVE状態に手動復旧させる方法

nova resize に何らかの理由で失敗すると、VMインスタンスのステータスがERRORのまま nova からは一切操作できなくなってしまいます。
※ぼくの場合はmigrate&resizeに必要な設定漏らしててERRORになりましたが、他にもケースはいくつかあるでしょうきっと。

$ nova resize vm00 m1.medium
$

■ resizeコマンドは実行されたように見えますが、実は...

リストを見てみるとステータスがERRORとなっている...まぁOpenStackではよくありますよね。

$ nova list
+--------------------------------------+------+--------+---------------------+
| ID                                   | Name | Status | Networks            |
+--------------------------------------+------+--------+---------------------+
| bfd70cf1-5caf-4bda-8ea1-9a4d25dd4cd4 | vm00 | ERROR  | network00=10.0.0.12 |
| e2e8d400-d590-4d18-8333-dc699ef85325 | vm01 | ACTIVE | network00=10.0.0.13 |
+--------------------------------------+------+--------+---------------------+

■ こうなるとrebootも効きません

$ nova reboot vm00
ERROR: Cannot 'reboot' while instance is in vm_state error (HTTP 409)
(Request-ID: req-4a21e77e-9af3-4f76-bfcb-97d7e6b07f01)

失敗の原因は、この設定を忘れていたことでした。
みなさんもコレをお忘れなく。

いやぁ LiveMigration はテストしてたんだけどな...

■ Hypervisor上でステータスを確認してみると...

shut off状態

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     instance-000000aa              shut off

■ startさせてみましょうかね

virshでVMインスタンスを手動startさせてみます。

# virsh start instance-000000aa
Domain instance-000000aa started

無事に startに成功したようです。
これで該当VMインスタンスは無事に起動し、sshログインできるようになりました。

■ ただし、nova上のステータスとしてはERRORのまま

novaコマンドで見てみると残念ながらERRORのままです...

$ nova list
+--------------------------------------+------+--------+---------------------+
| ID                                   | Name | Status | Networks            |
+--------------------------------------+------+--------+---------------------+
| bfd70cf1-5caf-4bda-8ea1-9a4d25dd4cd4 | vm00 | ERROR  | network00=10.0.0.12 |
| e2e8d400-d590-4d18-8333-dc699ef85325 | vm01 | ACTIVE | network00=10.0.0.13 |
+--------------------------------------+------+--------+---------------------+

novaを経由せずにVMインスタンスの状態を変更したために構成管理DBとの不整合が発生しています。この状態では novaコマンドではVMの削除操作しかきません。
実際のVMインスタンスはACTIVE状態ですから、構成管理DB上のStatusだけACTIVEにしてやれば構成管理DBと実際のVMの状態が整合されるので、novaコマンドで通常通り操作できるようになるハズ。

■ VMインスタンスの状態について

しかたがないのでinstancesテーブルのvm_stateの状態を直接修正します。
そのまえに、vm_stateが表す状態にはどのようなものがあるのかというと、主なものだけですが以下のようになります。

+---------+--------------+
|vm_state | 状態         |
+---------+--------------+
|active   |起動状態      |
|stopped  |停止状態      |
|deleted  |削除済        |
|suspended|サスペンド状態|
+---------+--------------+

■ 構成管理データベース修正作業を実施する

□ instancesテーブル構造を確認する

まずは構成管理DB上のVMインスタンスを管理しているテーブルの情報を確認してみましょう。

$ mysql -u nova -p
Enter password: ********
mysql> use nova
mysql> desc instances;
+--------------------------+--------------+------+-----+---------+----------------+
| Field                    | Type         | Null | Key | Default | Extra          |
+--------------------------+--------------+------+-----+---------+----------------+
| created_at               | datetime     | YES  |     | NULL    |                |
| updated_at               | datetime     | YES  |     | NULL    |                |
| deleted_at               | datetime     | YES  |     | NULL    |                |
| deleted                  | tinyint(1)   | YES  |     | NULL    |                |
| id                       | int(11)      | NO   | PRI | NULL    | auto_increment |
| internal_id              | int(11)      | YES  |     | NULL    |                |
| user_id                  | varchar(255) | YES  |     | NULL    |                |
| project_id               | varchar(255) | YES  | MUL | NULL    |                |
| image_ref                | varchar(255) | YES  |     | NULL    |                |
| kernel_id                | varchar(255) | YES  |     | NULL    |                |
| ramdisk_id               | varchar(255) | YES  |     | NULL    |                |
| server_name              | varchar(255) | YES  |     | NULL    |                |
| launch_index             | int(11)      | YES  |     | NULL    |                |
| key_name                 | varchar(255) | YES  |     | NULL    |                |
| key_data                 | mediumtext   | YES  |     | NULL    |                |
| power_state              | int(11)      | YES  |     | NULL    |                |
| vm_state                 | varchar(255) | YES  |     | NULL    |                |
| memory_mb                | int(11)      | YES  |     | NULL    |                |
| vcpus                    | int(11)      | YES  |     | NULL    |                |
| hostname                 | varchar(255) | YES  |     | NULL    |                |
| host                     | varchar(255) | YES  | MUL | NULL    |                |
| user_data                | mediumtext   | YES  |     | NULL    |                |
| reservation_id           | varchar(255) | YES  | MUL | NULL    |                |
| scheduled_at             | datetime     | YES  |     | NULL    |                |
| launched_at              | datetime     | YES  |     | NULL    |                |
| terminated_at            | datetime     | YES  | MUL | NULL    |                |
| display_name             | varchar(255) | YES  |     | NULL    |                |
| display_description      | varchar(255) | YES  |     | NULL    |                |
| availability_zone        | varchar(255) | YES  |     | NULL    |                |
| locked                   | tinyint(1)   | YES  |     | NULL    |                |
| os_type                  | varchar(255) | YES  |     | NULL    |                |
| launched_on              | mediumtext   | YES  |     | NULL    |                |
| instance_type_id         | int(11)      | YES  |     | NULL    |                |
| vm_mode                  | varchar(255) | YES  |     | NULL    |                |
| uuid                     | varchar(36)  | YES  | UNI | NULL    |                |
| architecture             | varchar(255) | YES  |     | NULL    |                |
| root_device_name         | varchar(255) | YES  |     | NULL    |                |
| access_ip_v4             | varchar(255) | YES  |     | NULL    |                |
| access_ip_v6             | varchar(255) | YES  |     | NULL    |                |
| config_drive             | varchar(255) | YES  |     | NULL    |                |
| task_state               | varchar(255) | YES  | MUL | NULL    |                |
| default_ephemeral_device | varchar(255) | YES  |     | NULL    |                |
| default_swap_device      | varchar(255) | YES  |     | NULL    |                |
| progress                 | int(11)      | YES  |     | NULL    |                |
| auto_disk_config         | tinyint(1)   | YES  |     | NULL    |                |
| shutdown_terminate       | tinyint(1)   | YES  |     | NULL    |                |
| disable_terminate        | tinyint(1)   | YES  |     | NULL    |                |
| root_gb                  | int(11)      | YES  |     | NULL    |                |
| ephemeral_gb             | int(11)      | YES  |     | NULL    |                |
| cell_name                | varchar(255) | YES  |     | NULL    |                |
+--------------------------+--------------+------+-----+---------+----------------+
50 rows in set (0.00 sec)

結構なカラム数ですね。

□ 該当VMインスタンスのステータスを確認してみる

必要なフィールドとしてはuuid,hostname,host,vm_modeがあれば問題なさそうです。

mysql> select uuid,hostname,host,vm_state from instances where uuid='bfd70cf1-5caf-4bda-8ea1-9a4d25dd4cd4';
+--------------------------------------+----------+----------+----------+
| uuid                                 | hostname | host     | vm_state |
+--------------------------------------+----------+----------+----------+
| bfd70cf1-5caf-4bda-8ea1-9a4d25dd4cd4 | vm00     | server00 | error    |
+--------------------------------------+----------+----------+----------+
□ vm_stateを修正する

実際の状態は active なので、該当VMインスタンスのvm_stateを修正します。

mysql> update instances set vm_state='active' where uuid='bfd70cf1-5caf-4bda-8ea1-9a4d25dd4cd4';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

成功したようです。

□ 最後に念のためnovaコマンドで確認する
$ nova list
+--------------------------------------+------+---------+---------------------+
| ID                                   | Name | Status  | Networks            |
+--------------------------------------+------+---------+---------------------+
| bfd70cf1-5caf-4bda-8ea1-9a4d25dd4cd4 | vm00 | ACTIVE  | network00=10.0.0.12 |
| e2e8d400-d590-4d18-8333-dc699ef85325 | vm01 | ACTIVE  | network00=10.0.0.13 |
+--------------------------------------+------+---------+---------------------+

無事に復旧しました。以降はnovaコマンドで操作できます。