🔔
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日間非アクティブだと自動削除される仕様があります。これを防ぐには:
- 本番環境では必ず
expiration_policy
を無期限に設定する - 定期的なキープアライブの仕組みを実装する
- 監視・アラートを設定して削除を検知する
特にテスト環境や待機系のサブスクリプションなど、メッセージ頻度が少ない環境では注意が必要です。
Discussion