Azure PostgreSQL Flexible Server がFailedで削除できないときの対処法とゴーストリソースの消し方

Azure Database for PostgreSQL Flexible Server をデプロイしようとして、プロビジョニングが Failed のまま固まり、その後もサーバーがポータルから削除できない――そんな “幽霊リソース” に悩むことがあります。本記事では、実際に遭遇した事例をベースに、原因の切り分けと安全な解決手順を詳しく解説します。

目次

症状:PostgreSQL Flexible Server が「Failed」のまま削除できない

まず、この記事で扱う典型的な症状を整理します。Azure Portal から PostgreSQL Flexible Server を作成しようとしたところ、デプロイが次のようなメッセージで失敗します。

The resource operation completed with terminal provisioning state 'Failed'.

その後、ポータル上では次のような状態になります。

  • Azure CLI の az postgres flexible-server list にもサーバーが出てこない
  • ポータルの概要ページを開こうとすると、画面上部に
    Cannot read properties of undefined (reading ‘createdAt’) といった JavaScript エラーが表示され、操作不能
  • リソースのコマンドバーに 削除 ボタンが表示されず、ポータルから消せない

このように「実体は無いのにポータル上だけに何か残っている」状態は、いわゆる ゴーストリソース(幽霊リソース) と呼ばれることがあります。

先に結論を書くと、今回のケースでは Azure サポートに依頼し、ARM(Azure Resource Manager)のキャッシュをリフレッシュ してもらうことで、ポータル上から該当サーバーの表示が完全に消えました。実際には ARM 上にリソースの実体は存在せず、ポータル側のキャッシュ不整合 が原因だったと考えられます。

とはいえ、毎回すぐにサポートに投げてしまうと、原因の切り分けも進まず対応も長引きがちです。そこで以下では、自力で確認できる範囲の切り分けと対処フロー を実務的な手順として整理していきます。

全体像:ゴーストリソース対応フロー

最初に、この記事で紹介する対応の流れを俯瞰しておきます。

ステップ目的主な手段
1. 実体の有無を確認リソースが ARM 上に存在するか切り分けるAzure CLI / Resource Graph / Resource Explorer
2. 実体がある場合通常の削除手順と削除を妨げる要因の解消CLI で削除、ロック・ポリシー・依存リソースを確認
3. 実体が無い場合ポータルにだけ残る表示を消すポータル設定リセット & サポートに ARM キャッシュ刷新を依頼

次のセクションから、この流れに沿って詳細を解説していきます。

ARM 上に実体があるかの切り分け

最初に必ず行うべきなのが、「その PostgreSQL Flexible Server が ARM 上に本当に存在するのか」 という切り分けです。ここを曖昧にしたまま進めると、ポータルの表示不具合なのか、本当に消しきれていないのかが分からなくなります。

Azure CLI で存在確認する

最も手軽で確実なのは、Azure CLI を使ってリソースを列挙・参照する方法です。事前に az login と az account set で対象サブスクリプションを選択しておきましょう。

# PostgreSQL Flexible Server の一覧を取得
az postgres flexible-server list -g <ResourceGroupName>

# 個別リソースを参照(見つかれば resourceId が取れる)
az resource show \
  -g <ResourceGroupName> \
  -n <ServerName> \
  --resource-type Microsoft.DBforPostgreSQL/flexibleServers

よくあるミスとして、次のようにコマンドを打ち間違えてしまうパターンがあります。

# ❌ 誤りの例(末尾の "-server" が抜けている)
az postgres flexible list

正しくは az postgres flexible-server list です。意外とケアレスミスしやすいので注意してください。

上記コマンドで、対象のサーバー情報が返ってくるかどうかを確認します。

  • 情報が返ってくる → ARM 上にリソースの実体がある
  • 何も返ってこない / Not Found → 少なくとも ARM からは見えていない

Azure Resource Graph で全サブスクリプションを横断確認

複数サブスクリプションを扱っている環境では、単に CLI でリソースグループ単位で見るだけでは取りこぼす可能性があります。その場合、Azure Resource Graph を使って、サブスクリプションをまたいで検索してしまうのが便利です。

Azure Portal から「Resource Graph Explorer」を開き、次のようなクエリを実行します。

resources
| where type == "microsoft.dbforpostgresql/flexibleservers"
| where name == "<ServerName>"

これでどのサブスクリプション / リソース グループに存在しているのか、あるいはそもそも存在していないのかを素早く確認できます。

Azure Resource Explorer(resources.azure.com)で直接確認

さらに踏み込んで確認したい場合は、Azure Resource Explorer を使う方法もあります。ARM に対して直接 REST 相当の参照を行うツールで、次のような手順で確認できます。

  1. Azure アカウントで Resource Explorer にサインインする
  2. 左ペインから対象サブスクリプション → リソースグループ → Microsoft.DBforPostgreSQL → flexibleServers を展開
  3. 該当の ServerName が存在するかどうかを確認

CLI・Resource Graph・Resource Explorer のいずれを使っても、どこにもリソースが見つからない 場合は、ARM 上には実体が存在しておらず、ポータル表示だけが残っている状態 と判断できます。

実体の有無を整理するチェック表

ここまでの内容を、判断に使える簡易チェック表としてまとめておきます。

確認項目結果考えられる状態
az postgres flexible-server list に表示されるかはいARM 上に実体あり。通常の削除フローで対応可能
az postgres flexible-server list に表示されるかいいえ実体が無い可能性。次の確認へ進む
Resource Graph で microsoft.dbforpostgresql/flexibleservers が見つかるかはいARM 上に実体あり。ID を特定して削除を試みる
Resource Graph / Resource Explorer いずれにも存在しないはいポータル表示のみのゴーストリソースの可能性が高い

実体が存在する場合の削除手順

CLI や Resource Graph でリソースが見えている場合は、通常の削除手順で対応できます。ただし、削除をブロックしている要因 があると、削除コマンドが失敗し、結果として「消えないリソース」に見えてしまいます。

Azure CLI から通常削除を行う

もっともシンプルなのは、Azure CLI を使った削除です。

# 名前で削除
az postgres flexible-server delete \
  -g <ResourceGroupName> \
  -n <ServerName> \
  --yes

# ResourceId が分かっている場合は直接削除
az resource delete --ids <ResourceId>

コマンド実行後、アクティビティ ログ で結果と詳細なエラーメッセージを確認しておきましょう。ここでエラーになっている場合は、何らかのブロック要因が存在します。

削除ロック・ポリシー・ネットワークリソースを確認する

PostgreSQL Flexible Server は、ネットワークやポリシーなど周辺の設定に依存しているため、途中でデプロイが失敗すると中途半端な状態のリソースが残ることがあります。代表的なブロック要因を整理しておきます。

カテゴリ確認ポイント対処の方向性
削除ロックリソースグループ / サブスクリプションに「削除ロック」が設定されていないか一時的にロックを解除してから削除を実行
Azure Policy作成や削除を拒否するポリシー(Deny)が適用されていないかポリシーを確認し、対象リソースに対する例外や一時的な緩和を検討
ネットワーク委任サブネット / Private Endpoint / Private DNS Zone が中途半端に残っていないか関連リソースの残骸をクリーンアップした上で削除を再実行
RBAC 権限自分のアカウントに「削除」権限(Contributor 以上)があるかロール割り当てを確認し、必要な権限を付与してもらう
クォータ / 名前重複サーバー名の重複やクォータ超過による中途半端な状態になっていないか別名で作り直すか、クォータ調整を依頼

ネットワーク周りの残骸をクリーンアップする

とくに Flexible Server は VNet 統合や Private Endpoint を使う構成が多く、作成に失敗した場合に次のようなリソースだけが残りやすくなります。

  • 委任されたサブネット(Microsoft.DBforPostgreSQL/flexibleServers への委任)
  • Private Endpoint(接続先が中途半端な状態)
  • Private DNS Zone と VNet リンク

これらを手作業で削除したあと、改めて本体のサーバー削除を試みると、あっさり消えるケースも多いです。

実体が無いのにポータルにだけ見える場合(ゴーストリソース)

CLI・Resource Graph・Resource Explorer などで確認しても、該当の PostgreSQL Flexible Server がどこにも見つからない。それにもかかわらず、Azure Portal には中途半端なリソースとして表示され、“Cannot read properties of undefined (reading ‘createdAt’)” などのエラーとともに操作不能――これが今回のような ゴーストリソース の典型です。

まずはポータル側の設定をリセットする

単純な UI 側のキャッシュやブラウザの問題である可能性もあるので、次のような対処を最初に試してみましょう。

  • Azure Portal 右上の「Portal 設定」から「リセット」実行
  • 別ブラウザ、またはシークレットウィンドウで Azure Portal を開き直す
  • ブラウザのキャッシュや Cookie を削除したうえで再ログインする

それでも対象リソースの表示が消えない場合は、ポータルの UI と ARM の状態が不整合を起こしている 可能性が高くなります。

Azure サポートに ARM キャッシュのリフレッシュを依頼する

ARM 上に実体が無いことが確認でき、かつポータル側のリセットでも解消しない場合は、Azure サポートに「ARM キャッシュのリフレッシュ」 を依頼するのが現実的な解決策です。

サポートチケットを起票する際、以下の情報を添えておくと対応がスムーズになります。

  • サブスクリプション ID
  • リソース グループ名(表示されているもの)
  • 問題の PostgreSQL Flexible Server 名
  • リージョン(例:japaneast, japansouth など)
  • 発生日時と、ポータル上に表示されるエラーメッセージ(例:Cannot read properties of undefined (reading 'createdAt'))
  • アクティビティ ログから取得できる場合は、相関 ID(Correlation ID)
  • CLI および Resource Graph でリソースが見つからないことを確認した旨

実際の事例では、サポート側で ARM キャッシュのリフレッシュ等を実施してもらった結果、ポータル上のゴースト表示が消え、何もなかったかのようにリソース一覧から消えた、という形で解決しました。

サポート依頼文のサンプル

実務でそのまま使えるよう、サポートチケットに記載する内容のイメージを簡単にまとめておきます。

Azure Portal 上で PostgreSQL Flexible Server のデプロイに失敗し、
その後もリソースが「Failed」状態のまま削除できない事象が発生しています。

・サブスクリプション ID: <SubscriptionId>
・リソース グループ: <ResourceGroupName>
・サーバー名: <ServerName>
・リージョン: <Region>
・発生時刻: <Time>

現象:
・ポータルの概要ページで「Cannot read properties of undefined (reading 'createdAt')」と表示され、操作不能
・削除ボタンが表示されず、自力で削除できない
・Azure CLI (az postgres flexible-server list / az resource show) では当該リソースが表示されない
・Azure Resource Graph でも microsoft.dbforpostgresql/flexibleservers にリソースが見つからない

上記より、ARM 上には実体が存在せず、ポータル表示のみが残っていると考えています。
ARM キャッシュのリフレッシュなど、本事象の解消についてご支援いただけないでしょうか。

ここまで書いておくと、サポート側も「まずは CLI で確認してください」といったやり取りを省略しやすくなり、結果的に解決までの時間短縮につながります。

なぜ「Failed 固着 + ゴーストリソース」が起きるのか

少し技術寄りの観点から、今回のような事象が起きる背景を簡単に整理しておきます。理解しておくことで、今後のトラブルシューティングもしやすくなります。

ARM テンプレートとバックエンドプロビジョニング

Azure の多くのリソースは、ARM(Azure Resource Manager)を経由して作成・更新・削除されます。PostgreSQL Flexible Server の場合も同様で、

  1. ARM に「Flexible Server を作ってほしい」というリクエストが送られる
  2. バックエンドでネットワークやストレージなど複数のコンポーネントが順次プロビジョニングされる
  3. すべて成功すると、プロビジョニング状態が「Succeeded」になる

何らかの理由で途中のステップが失敗すると、最終的に terminal provisioning state ‘Failed’ で止まります。この時点で、「一部だけ作られて残っている」状態になることが多く、削除時にはその不整合の影響を受けることがあります。

“Cannot read properties of undefined (reading ‘createdAt’)” の意味

ポータル上のエラーメッセージである Cannot read properties of undefined (reading 'createdAt') は、JavaScript の典型的なエラーで、「createdAt プロパティを持っているはずのオブジェクトが undefined だった」という意味です。

すなわち、

  • ポータル側は「Resource の詳細情報に createdAt があるはず」と期待している
  • しかし実際には ARM から返ってきたデータにそのプロパティが含まれていない

という 状態不整合 が発生していることを示しています。今回のように、ARM 上に実体が存在しないのに、ポータルが古いキャッシュや途中までの情報を表示しようとすると、この手のエラーが発生しがちです。

再発防止のためのチェックポイント

最後に、同様のトラブルを避けるために、PostgreSQL Flexible Server を新規作成する前に確認しておきたいポイントと、失敗時の後片付けのコツをまとめます。

作成前に確認したいポイント

  • サブネットの委任設定
    • VNet 統合の構成では、対象サブネットが Microsoft.DBforPostgreSQL/flexibleServers に正しく委任されているかを確認
    • 同じサブネットに他のサービスの委任が設定されていないか(1 サブネット 1 委任が基本)
  • Private DNS Zone と名前解決
    • Private Endpoint を使うかどうか、その場合の Private DNS Zone 名やリンク構成を事前に設計
    • オンプレ環境からの名前解決が必要な場合は、DNS フォワーダー等の構成も検討
  • リソース グループ / サブスクリプションのロック・ポリシー
    • 「誤削除防止」のための削除ロックが、逆に今回のような障害時の削除も妨げてしまわないか
    • ポリシーで特定リージョン・SKU が禁止されていないか
  • サーバー名 / クォータ / RBAC 権限
    • 同じサーバー名が別リージョンや別サブスクリプションで既に使われていないか
    • PostgreSQL サーバーのクォータが上限に達していないか
    • 自分のアカウントに必要な権限(少なくとも Contributor)が付与されているか

デプロイ失敗時の後片付けのコツ

PostgreSQL Flexible Server の作成が失敗した場合は、次の順番で後片付けを行うと事故を減らせます。

  1. アクティビティ ログで失敗した操作の詳細を確認
  2. 関連するネットワークリソース(Private Endpoint, DNS Zone, サブネットの委任など)の「残骸」を確認
  3. 削除しても問題ないことを確認したうえで、残骸を手動削除
  4. 本体の PostgreSQL Flexible Server の削除(あるいは RG 全体の削除)を実施

この際、すぐにリソースグループごと削除してしまうのも手ですが、RG を共有している他のシステムがある場合は影響範囲が大きくなるので、慎重に判断しましょう。

まとめ:Failed 固着時の最短ルート

ここまでの内容を、あらためて要点として整理します。

  • PostgreSQL Flexible Server が “Failed” 固着 + 削除できない 場合、まずは ARM 上に実体があるかどうか を切り分ける
  • 実体がある場合は、Azure CLI や Resource Graph で resourceId を特定し、
    • az postgres flexible-server delete / az resource delete で削除を試行
    • 削除ロック・ポリシー・ネットワークリソース・権限など、削除をブロックする要因を解消する
  • CLI や Resource Graph でもリソースが見つからず、ポータルにだけ残っている場合は、
    • ポータル設定リセットやブラウザ変更を試す
    • それでも解消しなければ、Azure サポートに ARM キャッシュのリフレッシュ を依頼する

要するに、

① 実体の有無を切り分け → ② 実体があれば CLI で削除 & 依存を解消 → ③ 実体がなく表示だけならサポートに ARM キャッシュのリフレッシュを依頼

という三段構えが、PostgreSQL Flexible Server の「Failed 固着」問題を手早く解消するための最短ルートです。

同様のトラブルで悩んでいる方の、原因切り分けと再発防止の一助になれば幸いです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次