概要

項目
案件IDMAS-215
カテゴリプラットフォーム
優先度P2 ★★
ステータス完了 (2026-04-21)
関連 ADRADR-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)

  1. Google Cloud Console にスーパー管理者でサインイン
  2. 画面上部のプロジェクト選択 → 新しいプロジェクト
  3. 以下を入力して作成:
    • プロジェクト名: bizlp-gas-accounting-dev
    • プロジェクト ID: bizlp-gas-accounting-dev (自動生成なら編集で合わせる)
    • 場所 (親組織): bizlp.co.jp を選択 ← 重要
    • 請求先アカウント: 法人 billing アカウントを選択
  4. 作成後、プロジェクト 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.jsgenerativelanguage.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 移行) 完了後に段階的に廃止:
    1. 新 prod プロジェクト経由で Gemini API 呼び出しが安定稼働していることを 2 週間検証
    2. "default gemini project" のシャットダウン手続き (GCP 上で 30 日猶予で削除予約)
    3. 完全削除

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_DEVbizlp-gas-accounting-dev (Step 1 で控えたプロジェクト ID)
VERTEX_REGIONasia-northeast1 (任意、未設定でもデフォルト値が使われる)

prod 環境の GAS スクリプトプロパティ (必須)

キー
GCP_PROJECT_ID_PRODbizlp-gas-accounting-prod (Step 2 で控えたプロジェクト ID)
VERTEX_REGIONasia-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 呼び出しは継続稼働

注意事項

  1. 既存 "default gemini project" を即削除しない — 既存の Gemini API (502_receipt_reader.js) が動作中のため、MAS-216 の Vertex AI 移行完了まで並行稼働させる
  2. 請求先アカウントの確認 — プロジェクト作成時に必ず bizlp 法人 billing を選択する (個人 billing と混在しないよう注意)
  3. プロジェクト ID は不変 — プロジェクト ID は作成後変更不可。名前とほぼ同じにするが、重複時は -2026 等で suffix 付与
  4. Env モジュールのキャッシュ_cache はスクリプト実行のたびにリセットされるため、スクリプトプロパティ追加後はスプレッドシートを開き直すか clasp push で反映確認
  5. Env モジュールは MAS-216 着手までテストコードから呼び出されないEnv.gcpProjectId() の戻り値は本案件では使用しない。MAS-216 の Vertex AI クライアントから初めて参照される
  6. 組織配下確認 — プロジェクト作成後、組織 (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) を削除

実データ検証

設定完了後、以下を確認する:

  1. GCP コンソールの組織セレクタで bizlp.co.jp 配下に bizlp-gas-accounting-dev / bizlp-gas-accounting-prod が表示される
  2. dev プロジェクトの請求アカウントが bizlp 法人 billing (株式会社ビズリンクパートナーズ) にリンクされている
  3. API ライブラリで Vertex AI API がステータス「有効」になっている
  4. IAM 画面で代表者 ([email protected]) がオーナー権限を持つ
  5. GAS エディタ (dev/prod 両方) のスクリプトプロパティで GCP_PROJECT_ID_DEV / GCP_PROJECT_ID_PROD が設定済み
  6. GAS エディタで Env.gcpProjectId() を実行してプロジェクト ID が返ってくる

関連ドキュメント

ドキュメント関連箇所
ADR-0008 本番 AI API を Vertex AI に集約本案件の前提となる戦略決定
ADR-0009 活動領域の段階的分離戦略Phase 2-3 での環境分離方針
MAS-206 外部共有の制限と警告設定GCP 監査ログの活用
MAS-216 本番 AI API を Vertex AI に移行本案件完了後に着手する後続案件

人間が検討すべき事項

  1. プロジェクト ID の命名規則bizlp-gas-accounting-dev / -prod で良いか、将来の商用テナント切り出し (ADR-0009 Phase 3) を見据えた命名にするか
  2. IAM ロールの粒度 — 代表者 1 名体制では「オーナー」のみで十分だが、将来の協業者向けに事前にカスタムロールを定義しておくか
  3. サービスアカウント設計 — MAS-216 で作成予定だが、現段階で命名規則を決めておく (例: [email protected]... / [email protected]...)
  4. リージョン選定asia-northeast1 を第一候補としたが、Claude モデルが未提供の場合は us-east5 フォールバックが必要 (ADR-0008 参照)。データ residency 要求が顧客から顕在化した段階で再評価
  5. 既存 "default gemini project" の廃止タイミング — MAS-216 完了から何ヶ月後にシャットダウンするか。保守的に「3 ヶ月併存 → 30 日猶予削除」で計 4 ヶ月
  6. 監査ログの保持期間 — Cloud Audit Logs のデフォルトは 400 日。税務調査対応で 7 年保持が望ましい場合は BigQuery へのエクスポート設定が必要 (別案件)
  7. 予算アラート — 予期せぬ課金急増に備え、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-21Step 3 の Generative Language API 記述を「任意」→「明示的に有効化しない」に修正。ADR-0008 方針との整合を明確化 (既存の呼び出しは "default gemini project" 側で MAS-216 完了まで継続)。併せて dev プロジェクト側の Step 3 実施完了を記録 (2026-04-21、prod は後続で実施予定)
2026-04-21Part 1 Step 1〜4 を prod プロジェクトでも実施完了 (2026-04-21)。dev/prod の 2 プロジェクト新設が揃う
2026-04-21Part 3 のスクリプトプロパティ登録方法を簡素化: 「各環境に _DEV / _PROD 両キーを必ず設定」→「各環境には対応するキーのみ必須 (dev に GCP_PROJECT_ID_DEV、prod に GCP_PROJECT_ID_PROD)、反対側キーはデバッグ用の任意設定」に変更。Env.gcpProjectId()Env.isDev() に応じて片方のみ参照するため機能上は不要な設定を減らす
2026-04-21MAS-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-prodVertex region: asia-northeast1Environment: prod を確認。既存 "default gemini project" は MAS-216 完了後に段階廃止予定