OpenStack Keystoneのendpoint URLの更新方法

OpenStack Keystoneでサービスのendpoint URLを設定したあと、そのURLを更新する必要に迫られました。きっと`keystone endpoint-update`とかいうコマンドがあるのだろう。。。と思ったのですが、サポートされているのは`endpoint-create`と`endpoint-delete`のみ。設定を更新する、というコマンドはありませんでした（OpenStack Junoで検証）。Googleで調べてみると、どうやら同じ問題で悩んでいる人は他にもいるようなのですが、DBを直接いじって解決しているようでした。この記事ではDBの更新によるendpoint URLの変更方法についてお伝えします。

    1. Databaseサーバーに接続する。
```shell-session
mysql -u root -p
```

    2. keystone DBに接続する。
```shell-session
MariaDB [(none)]> connect keystone;
```

    3. endpointテーブルを表示する。
```shell-session
MariaDB [keystone]> select * from endpoint;
+----------------------------------+----------------------------------+-----------+----------------------------------+-----------------------------------------+-------+---------+-----------+
| id                               | legacy_endpoint_id               | interface | service_id                       | url                                     | extra | enabled | region_id |
+----------------------------------+----------------------------------+-----------+----------------------------------+-----------------------------------------+-------+---------+-----------+
| 024c7a0d2734456cbcbec529b8dec3f8 | ef81cd642ef94ada960c08c79388b3b6 | internal  | 7eb8c12a399c42f9bf8af02b8f949ad5 | http://xxxxxx:5000/v2.0                  | {}    |       1 | regionOne |
| 832f7fcac1234879aa6b1e688d39c22d | ef81cd642ef94ada960c08c79388b3b6 | admin     | 7eb8c12a399c42f9bf8af02b8f949ad5 | http://xxxxxx:35357/v2.0                 | {}    |       1 | regionOne |
| 84ee7820fadc4d3ab7b4758762b9a4ec | f7a0da4c046f4d3890294a20fb048666 | internal  | 72f3a3d6717d4371a1eedfb82a1b5fbd | http://xxxxxx:8080/v1/AUTH_%(tenant_id)s | {}    |       1 | regionOne |
| b789b9d3af774ea298b917607baa3a0a | f7a0da4c046f4d3890294a20fb048666 | public    | 72f3a3d6717d4371a1eedfb82a1b5fbd | http://xxxxxx:8080/v1/AUTH_%(tenant_id)s | {}    |       1 | regionOne |
| ca67c7cb5b0b4086914f1662a7d7ed97 | f7a0da4c046f4d3890294a20fb048666 | admin     | 72f3a3d6717d4371a1eedfb82a1b5fbd | http://xxxxxx:8080                       | {}    |       1 | regionOne |
| df76cb0e66e4468cb1db4381fba3a07b | ef81cd642ef94ada960c08c79388b3b6 | public    | 7eb8c12a399c42f9bf8af02b8f949ad5 | http://xxxxxx:5000/v2.0                  | {}    |       1 | regionOne |
+----------------------------------+----------------------------------+-----------+----------------------------------+-----------------------------------------+-------+---------+-----------+

```

    4. 変更したいURLの行を選び、新しいURLを設定する。
```shell-session
MariaDB [keystone]> update endpoint set url='http://yyyyyy:8080/v1/AUTH_%(tenant_id)s' where id='b789b9d3af774ea298b917607baa3a0a';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

    5. 新しいURLが設定されたことを確認する。
```shell-session
MariaDB [keystone]> select * from endpoint;
+----------------------------------+----------------------------------+-----------+----------------------------------+-----------------------------------------+-------+---------+-----------+
| id                               | legacy_endpoint_id               | interface | service_id                       | url                                     | extra | enabled | region_id |
+----------------------------------+----------------------------------+-----------+----------------------------------+-----------------------------------------+-------+---------+-----------+
| 024c7a0d2734456cbcbec529b8dec3f8 | ef81cd642ef94ada960c08c79388b3b6 | internal  | 7eb8c12a399c42f9bf8af02b8f949ad5 | http://xxxxxx:5000/v2.0                  | {}    |       1 | regionOne |
| 832f7fcac1234879aa6b1e688d39c22d | ef81cd642ef94ada960c08c79388b3b6 | admin     | 7eb8c12a399c42f9bf8af02b8f949ad5 | http://xxxxxx:35357/v2.0                 | {}    |       1 | regionOne |
| 84ee7820fadc4d3ab7b4758762b9a4ec | f7a0da4c046f4d3890294a20fb048666 | internal  | 72f3a3d6717d4371a1eedfb82a1b5fbd | http://xxxxxx:8080/v1/AUTH_%(tenant_id)s | {}    |       1 | regionOne |
| b789b9d3af774ea298b917607baa3a0a | f7a0da4c046f4d3890294a20fb048666 | public    | 72f3a3d6717d4371a1eedfb82a1b5fbd | http://yyyyyy:8080/v1/AUTH_%(tenant_id)s | {}    |       1 | regionOne |
| ca67c7cb5b0b4086914f1662a7d7ed97 | f7a0da4c046f4d3890294a20fb048666 | admin     | 72f3a3d6717d4371a1eedfb82a1b5fbd | http://xxxxxx:8080                       | {}    |       1 | regionOne |
| df76cb0e66e4468cb1db4381fba3a07b | ef81cd642ef94ada960c08c79388b3b6 | public    | 7eb8c12a399c42f9bf8af02b8f949ad5 | http://xxxxxx:5000/v2.0                  | {}    |       1 | regionOne |
+----------------------------------+----------------------------------+-----------+----------------------------------+-----------------------------------------+-------+---------+-----------+
```

    6. DBの接続を切る
```shell-session
MariaDB [keystone]> quit
Bye
```

    7. keystone endpoint-listコマンドで新しいURLが設定されたことを確認する。
```shell-session
keystone endpoint-list
+----------------------------------+-----------+------------------------------------------------------------+-----------------------------------------+-------------------------+----------------------------------+
|                id                |   region  |                         publicurl                          |               internalurl               |         adminurl        |            service_id            |
+----------------------------------+-----------+------------------------------------------------------------+-----------------------------------------+-------------------------+----------------------------------+
| ef81cd642ef94ada960c08c79388b3b6 | regionOne |         http://xxxxxx:5000/v2.0          |          http://xxxxxx:5000/v2.0         | http://xxxxxx:35357/v2.0 | 7eb8c12a399c42f9bf8af02b8f949ad5 |
| f7a0da4c046f4d3890294a20fb048666 | regionOne | http://yyyyyy:8080/v1/AUTH_%(tenant_id)s | http://xxxxxx:8080/v1/AUTH_%(tenant_id)s |    http://xxxxxx:8080    | 72f3a3d6717d4371a1eedfb82a1b5fbd |
+----------------------------------+-----------+------------------------------------------------------------+-----------------------------------------+-------------------------+----------------------------------+

```

以上で、endpointのURLを更新することができました。