最終更新: 2026/06/22 18:56
MAS-215: GCP プロジェクトを bizlp 組織配下に整備 (dev/prod 分離)
概要
| 項目 | 値 |
|---|---|
| 案件ID | MAS-215 |
| カテゴリ | プラットフォーム |
| 優先度 | P2 ★★ |
| ステータス | 完了 (2026-04-21) |
| 関連 ADR | ADR-0008 本番 AI API を Vertex AI に集約 |
| 対象ファイル | 000_infra/001_env.js (Env モジュール拡張)、GCP 管理コンソール (手動作業) |
| 前提案件 | — |
| 後続案件 | MAS-216 (Vertex AI 移行) は本案件完了後に着手 |
| 仕様書作成日 | 2026-04-21 |
目的
ADR-0008 の前提として、Google AI Studio が自動生成した「default gemini project」を廃止し、bizlp.co.jp 組織配下に法人管理下の GCP プロジェクトを dev / prod 分離で新規作成する。商用 SaaS 化 (ADR-0009 Phase 3) に向けた法人ガバナンス基盤を確立し、IAM 監査・請求分離・dev/prod 事故防止の前提条件を揃える。
現状
現状の GCP プロジェクト構成
- プロジェクト名: "default gemini project" (Google AI Studio 自動生成)
- 所属: 組織配下かどうか不明 (要確認)
- 請求: 代表者個人の請求先アカウントの可能性
- 利用実態:
500_import/502_receipt_reader.jsの Gemini API 呼び出し (generativelanguage.googleapis.com経由)- スクリプトプロパティ
GEMINI_API_KEY経由でアクセス
- 問題点: 法人ガバナンス外・dev/prod 区別なし・監査証跡が取りにくい
目標構成
- bizlp.co.jp 組織配下に 2 プロジェクトを新設:
bizlp-gas-accounting-dev(開発環境)bizlp-gas-accounting-prod(本番環境)
- 請求: bizlp 法人 billing アカウントに紐付け
- IAM: 代表者をオーナー、将来の協業者向けに編集者・閲覧者ロールを定義可能な構造
- API: Vertex AI API / Cloud Audit Logs / Cloud Monitoring 等を有効化
- Env モジュール:
GCP_PROJECT_ID_DEV/GCP_PROJECT_ID_PRODを参照できるように拡張
修正方針
Part 1: GCP 管理コンソール作業 (手動、手順書化)
GAS コードの変更は不要。 代表者が Google Cloud Console で設定する運用手順。
Step 1: プロジェクト新設 (dev)
- Google Cloud Console にスーパー管理者でサインイン
- 画面上部のプロジェクト選択 → 新しいプロジェクト
- 以下を入力して作成:
- プロジェクト名:
bizlp-gas-accounting-dev - プロジェクト ID:
bizlp-gas-accounting-dev(自動生成なら編集で合わせる) - 場所 (親組織):
bizlp.co.jpを選択 ← 重要 - 請求先アカウント: 法人 billing アカウントを選択
- プロジェクト名:
- 作成後、プロジェクト ID を控えておく
Step 2: プロジェクト新設 (prod)
Step 1 と同手順で bizlp-gas-accounting-prod を作成。
Step 3: 必要な API を有効化 (両プロジェクト)
各プロジェクトで以下を有効化:
- Vertex AI API (
aiplatform.googleapis.com) — MAS-216 の前提 - Cloud Audit Logs — 監査証跡 (通常デフォルト有効)
- Cloud Monitoring API — 運用監視
- Cloud Logging API — ログ集約
有効化しない (明示的に除外):
- ❌ Generative Language API (
generativelanguage.googleapis.com) — ADR-0008 方針に基づき、本番 AI API は Vertex AI のみ使用する。既存の Gemini 呼び出し (502_receipt_reader.js→generativelanguage.googleapis.com) は MAS-216 完了まで既存の "default gemini project" 側で継続稼働させるため、新プロジェクト側への有効化は不要
Step 4: IAM 設計
各プロジェクトで以下のロールを設定:
| ロール | 対象 | 備考 |
|---|---|---|
オーナー (roles/owner) | 代表者 ([email protected]) | フルアクセス |
(将来) 編集者 (roles/editor) | 協業者・業務委託先 | 必要時に追加 |
(将来) 閲覧者 (roles/viewer) | 外部監査人 | 必要時に追加 |
| サービスアカウント | [email protected] | GAS から Vertex AI 呼び出し用 (MAS-216 で使用) |
本案件では代表者をオーナーに設定するまでを範囲とする。サービスアカウント作成は MAS-216 で対応。
Step 5: 既存 "default gemini project" の扱い
- 当面は 維持 (Gemini API キーで既存機能が動作中のため)
- MAS-216 (Vertex AI 移行) 完了後に段階的に廃止:
- 新 prod プロジェクト経由で Gemini API 呼び出しが安定稼働していることを 2 週間検証
- "default gemini project" のシャットダウン手続き (GCP 上で 30 日猶予で削除予約)
- 完全削除
Part 2: GAS コード変更 (000_infra/001_env.js)
Env モジュールに GCP プロジェクト ID への一元アクセスメソッドを追加。MAS-216 で Vertex AI クライアント実装時にこの情報を参照する。
Step A: Env.gcpProjectId() の追加
Env オブジェクトの末尾に以下を追加:
/** @returns {string} 現在の環境に対応する GCP プロジェクト ID (未設定なら空文字) */
gcpProjectId: function () {
var key = _load().isDev ? 'GCP_PROJECT_ID_DEV' : 'GCP_PROJECT_ID_PROD';
return _getProps().getProperty(key) || '';
},
/** @returns {string} 現在の環境に対応する Vertex AI リージョン (未設定なら asia-northeast1) */
vertexRegion: function () {
return _getProps().getProperty('VERTEX_REGION') || 'asia-northeast1';
},
Step B: ヘッダーコメントの更新
ファイル冒頭の「必須スクリプトプロパティ」リストを更新:
// 必須スクリプトプロパティ (環境ごとに設定):
// SPREADSHEET_ID — 対象スプレッドシートID
// GEMINI_API_KEY — Gemini API キー
// RECEIPT_FOLDER_ID — 領収書フォルダID(任意)
+ // GCP_PROJECT_ID_DEV — dev 環境の GCP プロジェクト ID (N-40 Vertex AI 移行時から使用)
+ // GCP_PROJECT_ID_PROD — prod 環境の GCP プロジェクト ID (N-40 Vertex AI 移行時から使用)
+ // VERTEX_REGION — Vertex AI リージョン (任意、デフォルト asia-northeast1)
Part 3: スクリプトプロパティ登録 (手動、dev/prod 両環境で実施)
GAS エディタのプロジェクト設定画面で以下を設定:
dev 環境の GAS スクリプトプロパティ (必須)
| キー | 値 |
|---|---|
GCP_PROJECT_ID_DEV | bizlp-gas-accounting-dev (Step 1 で控えたプロジェクト ID) |
VERTEX_REGION | asia-northeast1 (任意、未設定でもデフォルト値が使われる) |
prod 環境の GAS スクリプトプロパティ (必須)
| キー | 値 |
|---|---|
GCP_PROJECT_ID_PROD | bizlp-gas-accounting-prod (Step 2 で控えたプロジェクト ID) |
VERTEX_REGION | asia-northeast1 (任意、未設定でもデフォルト値が使われる) |
任意 (デバッグ用): 各環境に反対側のキーも設定できる (dev に GCP_PROJECT_ID_PROD、prod に GCP_PROJECT_ID_DEV) が、現時点の運用では Env.isDev() に応じて片方のみ参照されるため必須ではない。明示的に他環境の ID をコードから参照したいテスト/デバッグ時のみ設定。
影響範囲
| 対象 | ファイル | 変更量 | 既存動作への影響 |
|---|---|---|---|
| GCP 管理コンソール設定 | (GCP 側) | 2 プロジェクト新設 | 既存 "default gemini project" には影響なし (並行稼働期間中) |
| Env モジュール拡張 | 000_infra/001_env.js | 約 10 行追加 | 既存 Env.name() / Env.spreadsheetId() 等のメソッドは変更なし |
| スクリプトプロパティ追加 | dev/prod の GAS | 各 2〜3 キー追加 | 既存キーには影響なし |
| 既存 "default gemini project" | (GCP 側) | 維持 (MAS-216 完了後に段階廃止) | 現行の Gemini API 呼び出しは継続稼働 |
注意事項
- 既存 "default gemini project" を即削除しない — 既存の Gemini API (
502_receipt_reader.js) が動作中のため、MAS-216 の Vertex AI 移行完了まで並行稼働させる - 請求先アカウントの確認 — プロジェクト作成時に必ず bizlp 法人 billing を選択する (個人 billing と混在しないよう注意)
- プロジェクト ID は不変 — プロジェクト ID は作成後変更不可。名前とほぼ同じにするが、重複時は
-2026等で suffix 付与 - Env モジュールのキャッシュ —
_cacheはスクリプト実行のたびにリセットされるため、スクリプトプロパティ追加後はスプレッドシートを開き直すかclasp pushで反映確認 - Env モジュールは MAS-216 着手までテストコードから呼び出されない —
Env.gcpProjectId()の戻り値は本案件では使用しない。MAS-216 の Vertex AI クライアントから初めて参照される - 組織配下確認 — プロジェクト作成後、組織 (
bizlp.co.jp) 配下に配置されていることを必ず確認 (個人 Google アカウント配下だと法人ガバナンスの意味がなくなる)
エッジケース
| 条件 | 挙動 | 理由 |
|---|---|---|
GCP_PROJECT_ID_DEV / GCP_PROJECT_ID_PROD 未設定 | Env.gcpProjectId() が空文字を返す | graceful degradation。MAS-216 の Vertex AI 呼び出し側でエラーハンドリング |
VERTEX_REGION 未設定 | Env.vertexRegion() が asia-northeast1 を返す (デフォルト) | 日本リージョン優先の方針 |
| dev / prod で異なるプロジェクト ID を参照したい場合 | Env.isDev() で自動切替 | gcpProjectId() が環境に応じて _DEV / _PROD を選択 |
| bizlp.co.jp 組織が GCP 上で存在しない | プロジェクト作成時に「組織なし」として作成されてしまう | 事前に Google Workspace 管理コンソールで組織が認識されているか確認 (通常は自動) |
| 法人 billing アカウントが未設定 | プロジェクト作成時に課金警告が出る | 事前に console.cloud.google.com/billing で法人アカウント作成済み (ADR-0008 前提で確認済み) |
| 既存 "default gemini project" と新 dev/prod の API キーが重複 | 並行稼働期間中は両方有効 | MAS-216 移行完了後に既存キー (GEMINI_API_KEY) を削除 |
実データ検証
設定完了後、以下を確認する:
- GCP コンソールの組織セレクタで
bizlp.co.jp配下にbizlp-gas-accounting-dev/bizlp-gas-accounting-prodが表示される devプロジェクトの請求アカウントが bizlp 法人 billing (株式会社ビズリンクパートナーズ) にリンクされている- API ライブラリで Vertex AI API がステータス「有効」になっている
- IAM 画面で代表者 (
[email protected]) がオーナー権限を持つ - GAS エディタ (dev/prod 両方) のスクリプトプロパティで
GCP_PROJECT_ID_DEV/GCP_PROJECT_ID_PRODが設定済み - GAS エディタで
Env.gcpProjectId()を実行してプロジェクト ID が返ってくる
関連ドキュメント
| ドキュメント | 関連箇所 |
|---|---|
| ADR-0008 本番 AI API を Vertex AI に集約 | 本案件の前提となる戦略決定 |
| ADR-0009 活動領域の段階的分離戦略 | Phase 2-3 での環境分離方針 |
| MAS-206 外部共有の制限と警告設定 | GCP 監査ログの活用 |
| MAS-216 本番 AI API を Vertex AI に移行 | 本案件完了後に着手する後続案件 |
人間が検討すべき事項
- プロジェクト ID の命名規則 —
bizlp-gas-accounting-dev/-prodで良いか、将来の商用テナント切り出し (ADR-0009 Phase 3) を見据えた命名にするか - IAM ロールの粒度 — 代表者 1 名体制では「オーナー」のみで十分だが、将来の協業者向けに事前にカスタムロールを定義しておくか
- サービスアカウント設計 — MAS-216 で作成予定だが、現段階で命名規則を決めておく (例:
[email protected].../[email protected]...) - リージョン選定 —
asia-northeast1を第一候補としたが、Claude モデルが未提供の場合はus-east5フォールバックが必要 (ADR-0008 参照)。データ residency 要求が顧客から顕在化した段階で再評価 - 既存 "default gemini project" の廃止タイミング — MAS-216 完了から何ヶ月後にシャットダウンするか。保守的に「3 ヶ月併存 → 30 日猶予削除」で計 4 ヶ月
- 監査ログの保持期間 — Cloud Audit Logs のデフォルトは 400 日。税務調査対応で 7 年保持が望ましい場合は BigQuery へのエクスポート設定が必要 (別案件)
- 予算アラート — 予期せぬ課金急増に備え、GCP Budgets で月額アラートを設定するか (例:
$50/月超過で通知)
実装プロンプト (Claude Code 用)
あなたは GAS 会計システム (bizlp-gas-accounting) のシニア開発者です。
案件 MAS-215「GCP プロジェクトを bizlp 組織配下に整備 (dev/prod 分離)」の
Part 2 (GAS コード変更) を実装してください。Part 1 (GCP コンソール作業) は代表者が
別途実施済み/実施予定のため、コード側は Env モジュールの拡張のみが対象です。
## 実行前タスク
1. `000_infra/001_env.js` を Read して、ファイル冒頭のコメント構造と `Env` オブジェクトの
既存メソッド (name/isDev/isProd/log/spreadsheetId/geminiApiKey/receiptFolderId) を確認。
2. `_load()` 関数内で `isDev` 判定ロジックがどこで行われているか確認。
## 修正対象ファイル
- `000_infra/001_env.js` のみ
## 実装内容
### Step A: ヘッダーコメントの更新
ファイル冒頭の「必須スクリプトプロパティ」リストに以下 3 行を追加:
// GCP_PROJECT_ID_DEV — dev 環境の GCP プロジェクト ID (MAS-216 Vertex AI 移行時から使用)
// GCP_PROJECT_ID_PROD — prod 環境の GCP プロジェクト ID (MAS-216 Vertex AI 移行時から使用)
// VERTEX_REGION — Vertex AI リージョン (任意、デフォルト asia-northeast1)
### Step B: Env オブジェクトへのメソッド追加
`receiptFolderId` メソッドの直後 (return オブジェクトの末尾付近) に、
以下 2 メソッドを追加:
/** @returns {string} 現在の環境に対応する GCP プロジェクト ID (未設定なら空文字) */
gcpProjectId: function () {
var key = _load().isDev ? 'GCP_PROJECT_ID_DEV' : 'GCP_PROJECT_ID_PROD';
return _getProps().getProperty(key) || '';
},
/** @returns {string} 現在の環境に対応する Vertex AI リージョン (未設定なら asia-northeast1) */
vertexRegion: function () {
return _getProps().getProperty('VERTEX_REGION') || 'asia-northeast1';
},
既存の他メソッド (name / spreadsheetId 等) の命名・コメント形式に従うこと。
## 制約
- `Env` モジュール以外のファイルは変更しない
- 既存の `_load()` / `_getProps()` 内部関数を活用し、新しい内部関数は追加しない
- ドキュメント `docs/dev/dev_mas-215_gcp_project_setup.md` の記述と完全一致させる
- GCP コンソール側の手動作業は本実装プロンプトの対象外
## エッジケース (実装時に考慮すること)
- `GCP_PROJECT_ID_DEV` / `GCP_PROJECT_ID_PROD` 未設定時: 空文字を返す (graceful degradation)
- `VERTEX_REGION` 未設定時: `asia-northeast1` をデフォルト返却
## 動作確認
1. `npm run push:dev` で dev にデプロイ
2. GAS エディタから以下を実行してログ出力を確認:
function testEnvGcp() {
console.log('GCP project ID:', Env.gcpProjectId());
console.log('Vertex region:', Env.vertexRegion());
console.log('Environment:', Env.name());
}
3. スクリプトプロパティが未設定なら空文字 / `asia-northeast1` が返ること
4. `GCP_PROJECT_ID_DEV` を設定後、`gcpProjectId()` がその値を返すことを確認
### 拡張思考の使用状況
| フェーズ | 拡張思考 | 備考 |
|---------|---------|------|
| 実行前タスク (Read) | あり | Env モジュールの既存構造把握 |
| 実装 (Edit) | なし | 仕様書通りの書き下ろしのみ |
推奨実行モデル
| 工程 | 推奨モデル | 理由 |
|---|---|---|
| Part 2 (GAS コード変更) | Claude Haiku 4.5 | 仕様書でコード完全定義済み、判断要素なし |
| Part 1 (GCP コンソール作業) | (人間) | Claude からは操作不可 |
| Part 3 (スクリプトプロパティ設定) | (人間) | GAS エディタの手動操作 |
変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-04-21 | 初版作成 |
| 2026-04-21 | Step 3 の Generative Language API 記述を「任意」→「明示的に有効化しない」に修正。ADR-0008 方針との整合を明確化 (既存の呼び出しは "default gemini project" 側で MAS-216 完了まで継続)。併せて dev プロジェクト側の Step 3 実施完了を記録 (2026-04-21、prod は後続で実施予定) |
| 2026-04-21 | Part 1 Step 1〜4 を prod プロジェクトでも実施完了 (2026-04-21)。dev/prod の 2 プロジェクト新設が揃う |
| 2026-04-21 | Part 3 のスクリプトプロパティ登録方法を簡素化: 「各環境に _DEV / _PROD 両キーを必ず設定」→「各環境には対応するキーのみ必須 (dev に GCP_PROJECT_ID_DEV、prod に GCP_PROJECT_ID_PROD)、反対側キーはデバッグ用の任意設定」に変更。Env.gcpProjectId() が Env.isDev() に応じて片方のみ参照するため機能上は不要な設定を減らす |
| 2026-04-21 | MAS-215 全パート完了。ステータスを 仕様書完了 → 完了 (2026-04-21)。Part 1 (GCP コンソール: dev/prod 両プロジェクト新設・Billing 紐付け・API 有効化・IAM 代表者オーナー設定) / Part 2 (PR #277 マージ済、Env.gcpProjectId() / Env.vertexRegion() 実装) / Part 3 (prod 側 GAS エディタに GCP_PROJECT_ID_PROD = bizlp-gas-accounting-prod を登録済) 全て完了を確認。prod 環境で testEnvGcp() 実行結果: GCP project ID: bizlp-gas-accounting-prod、Vertex region: asia-northeast1、Environment: prod を確認。既存 "default gemini project" は MAS-216 完了後に段階廃止予定 |