🔔

Google Cloud Pub/Subのサブスクリプションが自動削除される件について調査してみた

に公開

Terraformで管理しているGoogle Cloud Pub/Subのサブスクリプションについて、terraform planを実行したところ、既存のサブスクリプションが存在しないという差分が検出されました。

# サブスクリプションが見つからないという差分
  + resource "google_pubsub_subscription" "my_subscription" {
      + ack_deadline_seconds       = 10
      + id                         = (known after apply)
      + name                       = "my-subscription"
      + project                    = "my-project"
      + topic                      = "projects/my-project/topics/my-topic"
      ...
    }

Terraformの状態ファイルには存在するのに、実際の環境では消えているという状況でした。意図的に削除した覚えはないため、この原因を調査することにしました。

原因:31日間の非アクティブで自動削除される仕様

調査の結果、Google Cloud Pub/Subには「サブスクリプションが31日間非アクティブだと自動的に削除される」という仕様があることが分かりました。

Google Cloudの公式ドキュメントには以下のような記載があります:

サブスクリプションが31日間アクティブでなかった場合、そのサブスクリプションは自動的に削除されます。

非アクティブの定義

以下の活動がない場合、サブスクリプションは「非アクティブ」と見なされます:

  • オープンな接続がない
  • プルリクエストがない
  • プッシュ配信が成功していない(プッシュサブスクリプションの場合)
  • サブスクリプションのプロパティが更新されていない

検証

実際にこの動作を確認するため、以下の環境で検証を行いました。

1. Terraformでリソースを作成

resource "google_pubsub_topic" "test_topic" {
  name = "test-topic"
}

resource "google_pubsub_subscription" "test_subscription" {
  name  = "test-subscription"
  topic = google_pubsub_topic.test_topic.name

  ack_deadline_seconds = 20

  # expiration_policyは設定しない(デフォルト)
}

対処法1:expiration_policyを設定する(推奨)

最も確実な方法は、サブスクリプション作成時にexpiration_policyを設定することです。

無期限に設定する場合

resource "google_pubsub_subscription" "production_subscription" {
  name  = "production-subscription"
  topic = google_pubsub_topic.main.name

  # 自動削除を無効化
  expiration_policy {
    ttl = ""  # 空文字列で無期限
  }

  ack_deadline_seconds = 20
  message_retention_duration = "604800s"  # 7日間

  retry_policy {
    minimum_backoff = "10s"
    maximum_backoff = "600s"
  }
}

環境別の推奨設定

# 本番環境:無期限
variable "is_production" {
  type    = bool
  default = false
}

resource "google_pubsub_subscription" "main" {
  name  = var.subscription_name
  topic = google_pubsub_topic.main.name

  expiration_policy {
    ttl = var.is_production ? "" : "2592000s"  # 本番:無期限、それ以外:30日
  }
}

まとめ

Google Cloud Pub/Subのサブスクリプションは、31日間非アクティブだと自動削除される仕様があります。これを防ぐには:

  1. 本番環境では必ずexpiration_policyを無期限に設定する
  2. 定期的なキープアライブの仕組みを実装する
  3. 監視・アラートを設定して削除を検知する

特にテスト環境や待機系のサブスクリプションなど、メッセージ頻度が少ない環境では注意が必要です。

参考資料

Discussion