GoogleCloud ランタイムのEOLチェックツールを作った話

に公開

はじめに

tokadev です。

担当するプロジェクトが増えてきて Cloud Functions、Cloud Run、Cloud SQL などサービスのランタイムを把握するのが 面倒くさい 難しくなってきたので、ランタイム EOLをチェックして Slack に通知する仕組みを作りました。

https://endoflife.date/

要件

Decommission か Deprecation かそれ以外かがわかる形で覚知がされれば良しとします。
なお対象APIが有効化されていなければ問題なしとします。

  • 通知フォーマット

Decommission, Deprecation 対象のインスタンスについてはコンソールURLも通知させます。

Runtime EOL Check Report

🔴 Decommission: 3
  my-legacy-func (ProjectA / Cloud Functions) nodejs 18 — EOL: 2025-04-30
  https://console.cloud.google.com/functions/details/...

🟡 Deprecation: 5
  api-server (ProjectB / Cloud Run) go 1.21 — EOL: 2026-08-01
  https://console.cloud.google.com/run/detail/...

🟢 OK: 42
  ProjectA: Cloud Functions x3 / Cloud SQL x1
  ProjectB: Cloud Run x2 / App Engine x1
  ...

📎 Full Report: https://storage.cloud.google.com/...

対象

GCP サービス 検出対象
Cloud Functions 関数のランタイム(nodejs22, python312, go122 等)
Cloud Run コンテナのベースイメージから推定
App Engine サービスのランタイム
Compute Engine OS イメージ(debian-12, cos 等)
Cloud SQL データベースバージョン(POSTGRES_15, MYSQL_8_0 等)

アーキテクチャ

Scheduler で発火し対象プロジェクトの各サービスランタイムを確認して結果を Slack に通知します。
覚知が目的なので発火の頻度は月1とします。

構成

確認結果を Cloud Storage に保存していますが、通知だけで十分なので削っても良さそう

レイヤー 技術
言語 Go 1.25
コンピュート Cloud Functions 2nd gen
スケジューリング Cloud Scheduler
シークレット管理 Secret Manager
ストレージ Google Cloud Storage(gocloud.dev/blob)
外部 API endoflife.date
通知 Slack Webhook
IaC Terraform
CI GitHub Actions

シークレット管理

Slack Webhook URL は Secret Manager で管理、Cloud Functions の secret_environment_variables で注入します。

secret_environment_variables {
key        = "SLACK_WEBHOOK_URL"
project_id = var.project_id
secret     = google_secret_manager_secret.slack_webhook.secret_id
version    = "latest"
}

認証フロー

権限管理

ServiceAccount には、スキャン対象プロジェクトに対して以下の読み取り専用パーミッションのみを持つカスタムロールを付与します。

  • Cloud Functions / Cloud Run / App Engine / Cloud SQL / Compute Engine
    の各リソース一覧の取得(ランタイムバージョンの検出に使用)
  • プロジェクトメタデータの取得(プロジェクト名の解決に使用)
resource "google_organization_iam_custom_role" "eol_checker_scanner" {
  role_id     = "eolCheckerScanner"
  org_id      = var.org_id
  title       = "EOL Checker Scanner"
  description = "Minimal read-only permissions for runtime EOL scanning"
  permissions = [
    "cloudfunctions.functions.list",
    "run.services.list",
    "appengine.services.list",
    "appengine.versions.list",
    "cloudsql.instances.list",
    "compute.instances.list",
    "resourcemanager.projects.get",
  ]
}

動作確認

Decommission, Deprecation 検出用の Functions を作成してデプロイします。

  • eol-test-deprecated: Node.js 20
const functions = require("@google-cloud/functions-framework");
functions.http("helloWorld", (req, res) => {
  res.send("Hello from deprecated nodejs20 runtime (test)");
});
  • eol-test-decommission: Python 3.9
import functions_framework

@functions_framework.http
def hello_world(request):
    return 'Hello from decommissioned python39 runtime (test)'

Slack 通知はこんな感じ。必要十分。

おわりに

省力化というか意識しなくても覚知出来る仕組みをもっと増やしたいですが、日々のタスク優先で中々手が回っていない状態でした。 Vibe Coding を利用してもう少し手を広げたいところさんです。

おまけ

Claude に校正を依頼してみました。

ブログ記事を確認しました。全体的にシンプルにまとまっていて読みやすいです。
いくつか気になった点を挙げます。

文章の修正点

1. 「おわりに」の誤字

もう少し手を広げたいところさんです。

🤬🤬🤬🤬🤬

参考

https://endoflife.date/

https://cloud.google.com/functions/docs/runtime-support

https://docs.cloud.google.com/run/docs/runtime-support

https://cloud.google.com/compute/docs/images/os-details

https://cloud.google.com/appengine/docs/standard/lifecycle/support-schedule

https://cloud.google.com/sql/docs/db-versions

レスキューナウテックブログ

Discussion