Azure DB for PostgreSQL Single ServerをFlexible Serverに移行する際の検討ポイント

## はじめに

私が保守を担当しているプロジェクトでは、Azure DB for PostgreSQL Single Serverを利用していますが、公式アナウンスの通り、Azure DB for PostgreSQL Single Serverは2025年3月にサービス終了となり、後継のAzure DB for PostgreSQL Flexible Serverへの移行が必要となります。

https://azure.microsoft.com/ja-jp/updates/azure-database-for-postgresql-single-server-will-be-retired-migrate-to-flexible-server-by-28-march-2025/

移行においては、Azure側での自動移行機能等は提供されず、以下の対応が必要となります。
* Azureリソース(Azure DB for PostgreSQL Flexible Server)の新規構築
* 旧サーバ(Single Server)内部に構築したユーザやテーブル、ビューなどのオブジェクトやデータの移行

現在、プロジェクト内では移行対応中であり、その中で知見が溜まってきましたので、共有します。今後移行を予定している方の助けになれば幸いです。

### 対象読者
Azure DB for PostgreSQL Single Serverを使用中であり、Flexible Serverへの移行を検討している方

<!-- 各チャプター -->
## 主な検討ポイント
移行対応時、主に検討が必要になったポイントは以下です。

* インフラ構成
* 移行方法
* 移行ツールの仕様
* アプリケーション側への影響

以下、順に見ていきます。

### インフラ構成
#### サーバ(高可用性)構成
Single ServerとFlexible Serverでは高可用性に関する考え方が変更されています。

https://learn.microsoft.com/ja-jp/azure/reliability/reliability-postgresql-flexible-server#availability-zone-support

https://learn.microsoft.com/ja-jp/azure/postgresql/single-server/concepts-high-availability#unplanned-downtime-mitigation

Single Serverにおける高可用性は、「計画外のダウンタイムを検出すると新たなデータベースサーバが自動でプロビジョニングされる」というものでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688810/e75fd878-ad56-3555-ec34-32846480631f.png)
(画像の出典：https://learn.microsoft.com/ja-jp/azure/postgresql/single-server/concepts-high-availability#unplanned-downtime-mitigation)

Flexible Serverにおいては、Primary/Secondaryの2系統をあらかじめプロビジョニングしておき、計画外のダウンタイムが検出された際に自動で系統を切り替える構成が可能になりました。本構成をとると、Secondaryがホットスタンバイのため、障害時のフェイルオーバーにかかる時間を短縮することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688810/341276ee-5710-a578-0ba8-5fc645dda2b7.png)
(画像の出典：https://learn.microsoft.com/ja-jp/azure/reliability/reliability-postgresql-flexible-server#availability-zone-support)

一方で、Primary系のみのプロビジョニングとする構成も可能で、この場合、Single Server同様に計画外のダウンタイム時は新たなデータベースサーバが自動でプロビジョニングされます。公式ドキュメントではこの構成について「高可用性が無効の構成」のような記載となっており少々混乱しましたが、Single Serverにおける高可用性と同じ動きになります。

移行に伴ってFlexible Serverの「高可用性構成」を採用することも考えられましたが、以下の理由から今回は現行に合わせ、高可用性を「無効」としました。
* 高可用性「無効」の構成が現行の構成と同等の挙動であり、現行の構成でサービス提供上の支障はない
* 採用するとランニングコストが約2倍となる(Secondaryのコストが増える)

#### ネットワーク構成
Flexible ServerではVNetとの接続に関する構成が変更されており、VNetとの接続がある場合は検討ポイントとなります。

https://learn.microsoft.com/ja-jp/azure/postgresql/flexible-server/concepts-networking-private#private-access-vnet-integration

Single ServerでVNetと接続するためには、サービスエンドポイントかプライベートエンドポイントが必要でしたが、Flexible Serverでは、VNet内に直接Flexible Serverをプロビジョニングする構成になりました。

VNetへのプロビジョニング時、Flexible Server専用のサブネットが必要となるため、新たにサブネット領域を確保し、その中にプロビジョニングを行いました。

また、VNet内のFlexible ServerへDNSネームによるアクセスをする場合、プライベートDNSゾーンが必要なので、新たに作成しました。

### 移行方法

##### 移行ツールの選択
移行に使用するツールとして、公式ドキュメントでは「Single to Flex Migration ツール」というAzure公式の移行ツールとPostgreSQLの一般的ツールである「pg_dump/pg_restore」が紹介されています。

https://learn.microsoft.com/ja-jp/azure/postgresql/migrate/concepts-single-to-flexible

公式ドキュメントでも「Single to Flex Migration ツール」の使用が推奨されているため、基本的にはそちらを使用し、移行検証の中でどうしても「Single to Flex Migration ツール」が使用できないケースにあたってしまった場合のみpg_dump/pg_restoreを使用する方針としました。

移行検証の結果、問題がなかったため、「Single to Flex Migration ツール」を使用することとしました。

##### オンライン移行とオフライン移行
移行中にデータベースを停止しないオンライン移行と停止するオフライン移行が選択できます。一般的にオンライン移行は難易度が高くリスクも大きいのでオフライン移行を選択しました。

:::note
「Single to Flex Migration ツール」ではオンライン移行は[プレビュー機能](https://learn.microsoft.com/ja-jp/azure/postgresql/migrate/concepts-single-to-flexible#:~:text=%E3%81%AA%E3%83%80%E3%82%A6%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%80%82-,%E6%B3%A8%E6%84%8F,%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%20%E3%83%AC%E3%83%99%E3%83%AB%E3%81%A7%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E7%A7%BB%E8%A1%8C%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82,-%E3%81%93%E3%81%AE%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE)になっており、オフライン移行を推奨しています。
:::

### 移行ツールの仕様

##### 移行対象
「Single to Flex Migration ツール」の移行対象となるデータは以下です。
* スキーマ/テーブル/インデックス/プロシージャ/ファンクション等のオブジェクト
* テーブルのデータ
* ユーザー/ロール、所有権、特権
* 拡張機能

::: note info
拡張機能の移行には[許可リスト](https://learn.microsoft.com/ja-jp/azure/postgresql/migrate/concepts-single-to-flexible#allowlist-required-extensions)の設定が必要な場合があります。
:::

昨年まで「ユーザー/ロール、所有権、特権」は移行の対象外だったのですが、2023年末のアップデートにより対象となりました。ただし、アップデート直後ごろは正常に移行がされない不具合等ありましたので、移行検証時によく確認することをおすすめします。

また、以下はツールの移行対象外のため、Azure Portal/Azure CLI/ARM Template等を使用して別途設定する必要があります。
* Azureリソース
    * サーバ/ネットワーク構成やアラート等
* サーバパラメータ

::: note info
サーバパラメータに関して、Single ServerとFlexible Serverで以下が異なりますので、確認が必要です。
* 設定可能なサーバパラメータ
* サーバパラメータの初期値
:::

今回は、ARM TemplateとAzure CLIを組み合わせでこれらの設定を自動化しました。
##### 照合順序
Flexible Serverでは照合順序のデフォルトが変更されています

https://learn.microsoft.com/ja-jp/azure/postgresql/flexible-server/concepts-compare-single-server-flexible-server#comparison-table:~:text=%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,lc_collate,en_US.utf8,-%E6%8E%A5%E7%B6%9A%E3%83%9D%E3%83%BC%E3%83%88

移行ツールを使用すると、Flexible Server側のデフォルトである「en_US.utf8」が適用されます。今回はほぼ影響なしと判断し、照合順序の変更を許容しましたが、変更したくない場合、「pg_dump/pg_restore」等での移行を検討する必要があります。

##### 移行ツールの実行バージョン
こちらは少々困った仕様ではあるのですが、「Single to Flex Migration ツール」は随時アップデートが実施される、かつ移行ツールの実行バージョンを指定することができません。極端なことを言えば、検証を実施した翌日にはツールの挙動が変わってしまう可能性があります。

根本的な対策はありませんが、検証から移行実施までの期間をできるだけ短くすること、日頃から公式ドキュメントを注視しておくことが基本的な対策となります。

### アプリケーション側への影響
アプリケーション側への影響は現在確認中ですが、現時点では以下の影響が判明しています。

##### 接続文字列のユーザ名指定
Single Serverの接続文字列のユーザ名を<user_name>@<server_name>の形式にする必要がありましたが、Flexible Serverでは@以下の指定が不要になるためアプリケーション側の設定ファイル等の修正が必要になります。
| Server | 接続文字列のユーザ名 | 例 |
|:-----------|:------------|:------------|
| Single Server|[user_name]@[server_name] |pg_adm_user@pgServer|
| Flexible Server|[username]| pg_adm_user|

# 終わりに
データベースの移行というと大変なイメージがありますが、公式ツールがかなりの部分を吸収してくれるため、うまく活用することで作業負荷を軽減できるとおもいます。

今回のプロジェクトでも、実際にツールを使用して開発環境では問題なく移行が完了しています。あとは本番環境の移行を残すのみなので、しっかりとやりきりたいと思います！

本記事が移行検討されている方の助けになれば幸いです！

## We Are Hiring!

https://www.biprogy.com/recruit/recruiting/