til/applied-sciences/engineering/cloud-db-tenant-safe-writes
cloud-db-tenant-safe-writes.mdupdated 2026-07-163052 words
ダブルクリックで英日反転
Applied Sciences · Engineering

Safe Tenant-Scoped Writes to a Cloud Database

EN

Writing to a shared (multi-tenant) cloud database safely requires three layers working together: a secure tunnel, secrets management, and tenant isolation — skipping any one layer risks cross-tenant data corruption.

Connect Safely

  • Cloud SQL Auth Proxy: proxies DB traffic through Google auth — no exposed port, appears as localhost.
  • ADC (Application Default Credentials): auto-selects credentials for the runtime environment; set up with `gcloud auth application-default login`.
  • quota-project mismatch causes 403 errors — set it explicitly with `gcloud auth application-default set-quota-project`.

Handle Secrets

  • Store passwords and API keys in Secret Manager (encrypted cloud vault), never in plaintext code or config.
  • Fetch secrets at runtime only; never print, log, or hard-code them.

Isolate by Tenant

  • Multi-tenant design: all tables carry a `customer_id` column; every operation must filter by it.
  • RLS (Row-Level Security): DB policy auto-filters rows by tenant — application just does a plain INSERT.
  • Without RLS, the app must add `WHERE customer_id = '<target>'` manually; omitting it risks overwriting other tenants' data.

Safe Write Discipline

  • Self-check first: SELECT to confirm target tenant, table, and row count before any write.
  • One-row test: write a single row, verify the result, then proceed in small batches.
  • Audit log: record what was written, when, and how many rows — on your local machine.
  • Production lockdown: destructive ops (DELETE/TRUNCATE/DROP) require explicit prior approval.
In a multi-tenant environment, one unchecked write touches every customer — connection, secrets, and filtering must all be correct before you touch production.
Applied Sciences · Engineering

クラウドDBへの​テナント安全​書き込み

JP

マルチテナント​(複数顧客が​同一DBを​共有する​設計)の​クラウドDBに​安全に​書き込むには、​「安全な​接続」​「シークレット管理」​「テナント分離」の​3層が​揃っている​必要が​ある。​どれか​一つが​欠けると​他テナントの​データを​汚染する​リスクが​ある。

安全に​接続する

  • Cloud SQL Auth Proxy​(=Googleが​提供する​DB接続用の​安全な​トンネル)​:ポートを​公開せずlocalhostと​して​見えるように​する。
  • ADC​(Application Default Credentials=実行環境に​応じて​認証情報を​自動選択する​仕組み)​:`gcloud auth application-default login` で​設定。
  • quota-projectの​ズレは​403エラーの​原因に​なる。​`set-quota-project` で​明示的に​設定する。

シークレットを​扱う

  • Secret Manager​(=パスワードや​APIキーを​暗号化して​保管する​クラウドの​金庫)を​使い、​コードや​ファイルに​平文で​書かない。
  • シークレットは​実行時に​のみ​取り出す。​画面・ログ・スクリプト内への​印字・ハードコードは​禁止。

テナントを​分離する

  • マルチテナント設計では​全テーブルに​ `customer_id` 列を​持ち、​操作の​たびに​この​列で​フィルタリングする。
  • RLS​(Row-Level Security=行レベルセキュリティ)が​有効なら、​DBポリシーが​テナントを​自動フィルタ。​アプリ側は​通常の​INSERTだけで​よい。
  • RLSが​無効な​環境では、​アプリ側で​ `WHERE customer_id = '<対象>'` を​必ず付ける。​条件なし​書き込みは​他テナントへの​誤​書き込みの​原因に​なる。

安全な​書き込み手順

  • 事前自己確認:SELECTで​対象テナント・テーブル・件数を​目視してから​書き込む。
  • 1件テスト​書き込み→確認→小バッチで​進める。​大量一括​書き込みは​禁止。
  • 監査ログ:何を​・いつ・​何件書いたかを​ローカルに​記録する。
  • 本番ロックダウン:DELETE/TRUNCATE/DROPなど​破壊的操作は​事前に​内容・​影響範囲を​示して​承認を​得てから​実行する。
マルチテナント環境での​1回の​ミスは​全顧客に​波及する。​接続・シークレット・フィルタリングの​3層が​揃って​初めて​本番に​触れてよい。
148 notestil