AUTOMATION NOTE — 154

Claude Code Routines で GWS ライセンス棚卸しを月次自動化する

2026年4月、Anthropic がリサーチプレビューとして公開した Claude Code Routines は、Claude Code のセッションをクラウド上でスケジュール・API・GitHubイベントをトリガーに自動実行できる仕組みです。この記事では、Google Workspace(GWS)のライセンス棚卸しを月次で自動実行するための設計判断と実装パターンを整理します。

この記事を読んだほうが良い人

  • GWSを100名前後の規模で管理しており、ライセンスの棚卸しをスプレッドシートや手動確認で行っている情シス担当者
  • 未使用ライセンスの検出からSlackへの月次レポート生成までを自動化したいが、どのツールで実装するか決めかねている方
  • GAS(Google Apps Script)で同様の処理を書いていて、Claude Code Routinesへの移行を検討している方

Claude Code Routines Google Workspace 自動化の全体像

Claude Code Routines は、プロンプト・リポジトリ・環境設定・コネクターの4要素をセットで登録し、Anthropicのクラウド上で自動実行する機能です(公式ドキュメントより)。ローカルのターミナルが閉じていても動作するため、月次・週次の定常Opsに向いています。

設定できるトリガーは3種類あります。

  • スケジュール: 毎時・毎日・毎週などの定期実行。カスタムcron式(毎月1日の早朝など)はウェブフォームで最も近いプリセットを選んだ後、CLIの /schedule update コマンドで指定できます(最小間隔は1時間)
  • APIトリガー: HTTP POSTリクエストで任意タイミングに起動。アラートや社内ツールとの連携に使う
  • GitHubイベント: PRのオープン・マージなどリポジトリイベントに反応

利用できるプランはPro・Max・Team・Enterprise(いずれもclaude.aiサブスクリプション)です。アカウントごとに1日あたりの実行上限が設けられており、月次実行なら実質的な制約にはなりません。なお、現時点ではリサーチプレビューのため、仕様・上限・APIの形式が変更になる可能性があります。

GWSライセンス棚卸しを自動化する意義

手作業で発生するコスト

100名規模のGWS環境では、月次棚卸しに次のような作業が繰り返し発生します。

  • 管理コンソールのユーザー一覧から長期未ログインアカウントを目視確認
  • スプレッドシートへの転記と休眠判定
  • コスト担当や上長へのレポート作成・送付

筆者の経験では、この一連の作業に月1〜2時間程度かかります。年間に換算すると20時間超の繰り返し工数です。

自動化で変わること

Claude Code Routines を使うと、この月次フローを1つのルーティンに集約できます。具体的には次の4ステップを自動で処理します。

  1. 未使用ライセンスの検出: Admin SDK Directory API でユーザーごとの最終ログイン日時(lastLoginTimeフィールド)を取得し、90日以上ログインがないアカウントを休眠候補として抽出
  2. ライセンス割り当ての照合: Enterprise License Manager API でライセンス割り当て状況をクエリし、休眠候補と突合
  3. コスト試算: SKUごとの月額単価×休眠候補数で削減可能額を算出
  4. Slackレポート生成: Slack MCP(Claude が外部サービスと連携するためのプロトコル)コネクターを通じて指定チャンネルに投稿

Claude が文章生成まで担うため、数字の羅列ではなく「○名が90日以上未ログイン、解約すると月額×万円削減可能」というアクション起点のレポートを出力できます。

月次サイクルの実行フロー

月次棚卸しの全体フローを整理すると以下の通りです。

毎月1日 早朝(スケジュールトリガー)
    |
    ↓
[1] Admin SDK Directory API
    → 全ユーザーの primaryEmail + lastLoginTime を取得
    |
    ↓
[2] Enterprise License Manager API
    → 対象SKUのライセンス割り当て一覧を取得
    |
    ↓
[3] 突合・フィルタリング
    → 90日超未ログイン × ライセンス保有者 = 休眠候補リスト
    |
    ↓
[4] コスト試算
    → SKU月額 × 休眠候補数 = 削減可能コスト概算
    |
    ↓
[5] Slackコネクター経由でレポート投稿
    → #情シス-ライセンス棚卸し チャンネル

このフロー全体をプロンプトで指示し、データ取得部分はリポジトリにコミットしたスクリプトに切り出して管理します。

GAS vs Claude Code Routines:どちらを選ぶか

ライセンス棚卸しを自動化する手段として、既存のGASと比較したときの判断軸を整理します。

判断軸 GAS が向く Routines が向く
実行環境 GWS内で完結する処理 GitHubリポジトリと連携する処理
ロジックの性質 定型集計・シンプルな条件分岐 判断・分類・自然文レポートが必要な処理
認証設計 GWSサービスアカウントのみで完結 複数サービスのAPIキーを組み合わせる
コスト観点 Workspaceプランに含まれる無料リソース claude.aiサブスクリプションの実行枠を消費
コード管理 Apps Scriptエディター内で完結 GitHubリポジトリで管理(バージョン管理しやすい)
LLM活用 外部API呼び出しを別途実装する必要がある ClaudeがネイティブでOpsに組み込まれている
向かない場面 判断ロジックが複雑・レポートの文章品質にこだわりたい 大量データの高速バッチ処理

基本の判断軸は「シンプルな集計と定型レポートならGAS、Claudeによる判断や文章生成が必要ならRoutines」です。

GASはWorkspaceに含まれる無料リソースで動くため、初期コストを最小化したい場合はGASで始めて、レポート品質や運用負荷が課題になってからRoutinesに移行するのも現実的な選択です。レポート文面の品質よりもコスト管理を優先するなら、GASのまま継続するほうが合理的な組織もあります。

ルーティンの実装パターン

ルーティンプロンプトの設計

Routinesの「プロンプト」は、Claudeが実行のたびに読む指示書です。月次棚卸しなら次のように書きます。

以下の手順でGWSライセンスの月次棚卸しを実行してください。

1. scripts/gws-license-audit.sh を実行し、ユーザー一覧と
   ライセンス状況をJSON形式で取得する
2. lastLoginTime が実行日から90日以上前のユーザーを
   「休眠候補」として抽出する
3. 休眠候補のうちライセンスが割り当て済みのユーザーを特定し、
   リストを作成する
4. 環境変数 GWS_SKU_PRICE_JPY × 休眠候補数で削減可能コストを試算する
5. Slackの指定チャンネルに以下の形式でレポートを投稿する:
   - 実行日 / 総ユーザー数 / 休眠候補数
   - 削減可能コスト月額概算(円)
   - 休眠候補ユーザーの一覧(最大10件)
   - 推奨アクション(アカウント一時停止確認依頼 or 異動者確認)

データ取得スクリプトの役割

リポジトリにコミットしたシェルスクリプト(例:scripts/gws-license-audit.sh)をRoutinesセッション内でClaudeが呼び出せます。データ取得ロジックをスクリプトに切り出すことで、プロンプトにはClaudeが行う判断・集計・文章化の指示だけを残せます。

以下はスクリプトの概念構造です。

#!/bin/bash
# scripts/gws-license-audit.sh
# 役割: GWSライセンス棚卸しデータをJSON形式で標準出力する
#
# 使用するAPI:
#   - Admin SDK Directory API: ユーザー一覧(lastLoginTime含む)の取得
#   - Enterprise License Manager API: ライセンス割り当て一覧の取得
#
# 認証方式: サービスアカウント + ドメイン全体の委任(DWD)
# 必要な権限: ユーザー情報の読み取り / ライセンス情報の読み取り
#
# 環境変数(Routinesのアカウント環境設定で登録する):
#   SERVICE_ACCOUNT_JSON  サービスアカウントキー(JSON文字列)
#   GWS_DOMAIN           対象ドメイン(例: example.com)
#   GWS_PRODUCT_ID       対象プロダクトID
#   GWS_SKU_ID           対象SKU ID

# 実装:gcloud CLIまたはcurlでAPIを呼び出し、
# users配列とlicenses配列を含むJSONを出力する
echo '{"users": [], "licenses": []}' # 実際の実装に置き換える

実際のAPI呼び出し実装は、gcloud CLIやPythonのGoogle APIクライアントライブラリを使うと管理しやすくなります。gcloud CLI はコマンド1本で認証・実行を完結させやすく、Pythonクライアントライブラリはエラーハンドリングやページネーションの実装が容易です。

環境変数の設計

Routinesの「環境」設定で次の変数を登録します。

変数名 内容
SERVICE_ACCOUNT_JSON GWSサービスアカウントのキー(JSON文字列)
GWS_DOMAIN 対象ドメイン(例: example.com)
GWS_PRODUCT_ID 対象プロダクトのID
GWS_SKU_ID ライセンスSKU(Stock Keeping Unit、Googleライセンスの種別ID)のID
GWS_SKU_PRICE_JPY SKU月額(円。コスト試算に使用)
SLACK_CHANNEL_ID レポート送信先チャンネルID

ネットワーク設定については、Google APIエンドポイントへのアクセスが必要なため、環境設定で疎通を確認してください。標準の「Trusted」設定で問題なければそのまま使えますが、疎通できない場合は Custom allowlist に対象ドメインを追加します。

運用時に注意すべきポイント

90日ルールの適切な使い方

「90日未ログイン = 即解約」にはしないことが重要です。Routinesのレポートは「確認対象リスト」として出力し、最終判断は担当者が行う設計を守ります。

次のようなアカウントは機械的な解約が問題になります。

  • 産休・育休中のアカウント(ライセンスは残すべき)
  • 月次のみログインする顧問や非常勤スタッフ
  • 設定用途の管理者アカウント(実際には使っている)
  • ログインパターンが不規則な外部委託先

Routinesの役割は「見落としを防ぐ」ことに留め、解約の実行は担当者の確認を経るフローにします。

Domain-Wide Delegation(DWD)の設定

Enterprise License Manager API をサービスアカウントで呼び出すには、ドメイン全体の委任(DWD: Domain-Wide Delegation)の設定が必要です。DWDは管理コンソールの管理者設定から付与するもので、組織のセキュリティポリシーによっては承認フローが必要になります。実装前に社内の承認プロセスを確認してください。

Routinesのプレビュー期間中の運用

現時点でRoutinesはリサーチプレビューです。Anthropicの公式ドキュメントにも「仕様・上限・APIの形式が変更になる可能性がある」と明記されています。月次Opsとして本番稼働させる前に、プロンプトとスクリプトのバージョン管理を徹底し、変更があっても素早く追従できる体制を整えておくことを推奨します。

まとめ

Claude Code Routines によるGWSライセンス月次棚卸しの設計ポイントは3点に集約されます。

まず、ツール選択を処理の性質で決めることです。単純な集計と定型レポートならGASで十分です。Claudeによる判断や自然文のレポート生成が必要になった段階でRoutinesへ移行する段階的アプローチが、コスト面でも現実的です。

次に、スクリプトとプロンプトの責務を分離することです。APIからのデータ取得は scripts/ のシェルスクリプトに閉じ込め、Claudeには「突合・判断・文章化」を担わせます。スクリプト部分はGASからの移植が容易で、Routines特有のAI処理をプロンプト側に集中させることでメンテナンスが楽になります。

最後に、自動化の境界を設けることです。月次レポートの出力とSlack通知までをRoutinesに担わせ、解約の実行は必ず担当者確認を挟む設計を守ります。この境界を守れば、月次棚卸しの繰り返し工数を大幅に削減しながら、過剰な自動化によるリスクを回避できます。

この設計パターンを足がかりに、四半期ごとのコスト分析レポート生成や、退職者発生時のリアルタイム通知(APIトリガー活用)へとRoutinesの適用範囲を広げていくのが自然な拡張方向です。

コーポレートITのご相談はお気軽に

この記事で書いたような業務改善・自動化の設計から実装まで、DRASENASではコーポレートITの現場に寄り添った支援を行っています。 「まず相談だけ」でも大歓迎です。DRASENAS 公式サイトからお気軽にどうぞ。

CONTACT

御社の IT 部門、ここにあります。

「ITのことはあまりわからない」── そのような状態からで、まったく問題ございません。まずはお気軽にご相談ください。

一社ずつ、一から。