Vertex AIでClaude CodeとClaude Code Actionを実行してセキュアなAI駆動開発環境をチームに導入しよう

話題の[Claude Code](https://docs.anthropic.com/ja/docs/claude-code/overview)や[Claude Code Action](https://github.com/anthropics/claude-code-action)を利用するには、Claudeモデルを呼び出すためのAnthropic APIが必要です。

組織やチームで利用するためには個人アカウントで払い出したAPIキーは管理上よろしくないですし、かといってClaudeのTeamプランやEnterpriseプランを導入するのは難しい場合があるかもしれません。

ですが、AWSのAmazon BedrockやGoogle CloudのVertex AIをモデルプロバイダーとすることで、**クラウド基盤をそのまま利用してセキュアにClaude CodeおよびClaude Code Actionを利用する**ことが可能になります。

本記事ではVertex AIを使ってチームで運用しやすくするための手順を考案してみます。

:::note info
詳細なユースケースは割愛します。
:::

# Claude Codeとは
KAGのみのるんさん（@minorun365）のスライドがとても分かりやすいです。

https://speakerdeck.com/minorun365/yasasiiclaude-coderu-men

# Claude CodeをVertex AIで使えるようにする
予め自分がオーナー権限を持つGoogle Cloudプロジェクトが用意されているものとします。
Claude Code運用用のプロジェクトを一つ用意したほうが管理しやすいでしょう。
Model Gardenで利用したいClaudeモデルを有効化します。

:::note warn
Claudeの呼び出しコストはまあまあお値段が張るので、[予算アラート](https://cloud.google.com/billing/docs/how-to/budgets?hl=ja)は必ず設定しておきましょう。
:::

## IAMを追加してVertex AIの権限を与える
利用したいユーザーにVertex AIの権限を与えます。
Google Cloudプロジェクトの管理者を決めて運用したほうがいいと思います。

Cloud Shellで下記のコマンドを実行します。

```bash
MEMBER_EMAIL=<ユーザーのメールアドレス>
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=user:$MEMBER_EMAIL \
  --role=roles/aiplatform.user
```

権限があたったら利用者自身にClaude Codeをセットアップしてもらいます。

## 利用者がローカルでセットアップ

対象アドレスでのGoogle Cloudへのログイン。

```bash
gcloud auth application-default login
```

Claude Codeのインストール。

```bash
npm install -g @anthropic-ai/claude-code
```

環境変数の設定。

```bash:.zshrc
# Claude Code
export ANTHROPIC_MODEL='claude-opus-4@20250514'
export ANTHROPIC_SMALL_FAST_MODEL='claude-sonnet-4@20250514'
export CLAUDE_CODE_USE_VERTEX=1
export CLOUD_ML_REGION='us-east5'
export ANTHROPIC_VERTEX_PROJECT_ID='<利用するGoogle CloudプロジェクトID>'      
```

リポジトリの`.claude/settings.json`に記述して、プロジェクト内で設定を共有することもできます。
個人の設定は` ~/.claude/settings.json`。

https://docs.anthropic.com/ja/docs/claude-code/settings

```json:.claude/settings.json
{
  "env": {
    "ANTHROPIC_MODEL": "claude-opus-4@20250514",
    "ANTHROPIC_SMALL_FAST_MODEL": "claude-sonnet-4@20250514",
    "CLAUDE_CODE_USE_VERTEX": 1,
    "CLOUD_ML_REGION": "us-east5",
    "ANTHROPIC_VERTEX_PROJECT_ID": "<利用するGoogle CloudプロジェクトID>"
  }
}
```

Claude Codeが起動したらOKです。

```bash
claude
```

ターミナル以外にもVSCode拡張機能から使うこともできます。

https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/fde96b68-7d32-4b60-b5ac-87673506cbee.png)

また、認証をそのまま使って[Cline](https://github.com/cline/cline)を利用することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/feadfcc3-95c4-4c03-ba2f-02b72d20d608.png)

Clineならコストパフォーマンスに優れたGeminiも利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/6c64dfff-d108-4188-a0c6-c00884a250ef.png)

# Claude Code ActionをVertex AIで使えるようにする

個人のローカル環境で動かしてAI駆動開発を実現できるのがClaude Codeでしたが、これをGitHub Actionsベースで動かせる[Claude Code Action](https://github.com/anthropics/claude-code-action)があります。

GitHubという開発プラットフォームを利用して、Claudeを**まるでメンバーの1人のように参加させる**ことができるのでよりチームでのAI駆動開発に適しています。

この分野はOpenAIのCodexやGoogleのJulesもありますが、GitHubとモデルプロバイダーで完結するのがClaude Code Actionの良いところです。

以下が設定手順例となります。

## Google Cloudの設定
### Workload Identityプールを作成する

GitHub ActionsとGoogle Cloudプロジェクトをフェデレーションしてアクセス権を付与するために[Workload Identity連携](https://cloud.google.com/iam/docs/workload-identity-federation?hl=ja)を設定します。

* プール名（任意）：`Claude Code Action Connector`
* プールID（任意）：`claude-code-action-connector`
    * プロバイダの選択：OpenID Connect（OIDC）
    * プロバイダ名（任意）：`GitHub Actions`
    * 発行元（URL）：`https://token.actions.githubusercontent.com`
    * オーディエンス：デフォルトのオーディエンス
    * 属性のマッピング
        * `attribute.repository`:`assertion.repository`
        * `google.repository`:`assertion.repository`
    * 属性条件
        * `assertion.repository.startsWith('<組織のGitHub Organization名>/')`

ここでは不正利用を防止するため組織のGitHub Organization名以外のリポジトリからアクセスできない設定をしています。

### サービスアカウントを作成し、プールに接続する
GitHub Actionsが使うためのサービスアカウントを作成します。
開発プロジェクトごとに払い出す想定をしています。

具体的な作業としては、サービスアカウントを作成し以下の権限を付与。
* Vertex AI ユーザー
* Workload Identity ユーザー
* サービス アカウント トークン作成者
プールにサービスアカウントのアクセスを許可し、subjectにリポジトリのowner/repoをマッピングする作業となりますが下記のコマンドで実行できます。

```bash
POOL_ID="<プールID>"
GITHUB_OWNER="<オーナー名（hoge_owner/hoge_repoならhoge_owner）>"
REPO_NAME="<リポジトリ名（hoge_owner/hoge_repoならhoge_repo）>"
PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format="value(projectNumber)")
PROJECT_ID=$(gcloud config get-value project)

# サービスアカウントの作成
gcloud iam service-accounts create $REPO_NAME \
  --display-name $REPO_NAME
SA_EMAIL="${REPO_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"

# 権限を付与
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:${SA_EMAIL}" \
  --role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:${SA_EMAIL}" \
  --role="roles/iam.workloadIdentityUser"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:${SA_EMAIL}" \
  --role="roles/iam.serviceAccountTokenCreator"

# サービスアカウントをプールに接続
gcloud iam service-accounts add-iam-policy-binding "${SA_EMAIL}" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${POOL_ID}/subject/${GITHUB_OWNER}/${REPO_NAME}"
 
echo $SA_EMAIL
```

もしモノレポ構成ではなくポリレポ構成をとっていて複数のリポジトリでサービスアカウントを使いまわしたい場合は、下記のコマンドをリポジトリ数ぶん書き換えて実行します。

```bash
REPO_NAME="<他のリポジトリ>"

gcloud iam service-accounts add-iam-policy-binding "${SA_EMAIL}" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${POOL_ID}/subject/${GITHUB_OWNER}/${REPO_NAME}"

# 確認
gcloud iam service-accounts get-iam-policy $SA_EMAIL
```

## GitHubの設定
### GitHub Appをインストール
Claude Code Actionsを動作させるためのGitHub Appをインストールします。
公式は[こちら](https://github.com/apps/claude)ですが、自前で用意することもできます。

### リポジトリシークレットの設定
* `GCP_SERVICE_ACCOUNT`：前段で作成したサービスアカウントのメールアドレス
* `GCP_WORKLOAD_IDENTITY_PROVIDER`：`projects/<your-project-number>/locations/global/workloadIdentityPools/<your-identity-pool-id>/providers/<workload-identity-provider-id>`
※前段で作成したWorkload Identityプールのコンソール画面から取得
* `GCP_PROJECT_ID`：Google CloudプロジェクトID

### ワークフローを追加
GitHub Actionsワークフローファイルをリポジトリに設置。

```yaml:.github/workflows/claude_code_vertex.yaml
name: Claude Code with Vertex AI

on:
  issues:
    types: [opened, edited]
  issue_comment:
    types: [created, edited]
  pull_request_review:
    types: [submitted, edited]
  pull_request_review_comment:
    types: [created, edited]

concurrency:
  group: ${{ github.event.pull_request.number || github.event.issue.number || github.run_id }}
  cancel-in-progress: true

jobs:
  claude:
    if: |
      (github.event_name == 'issue_comment' &&
       contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' &&
       contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'issues' &&
       contains(github.event.issue.body, '@claude')) ||
      (github.event_name == 'pull_request_review' &&
       contains(github.event.review.body, '@claude'))
    runs-on: ubuntu-latest
    timeout-minutes: 30
    
    permissions:
      id-token: write
      contents: write
      issues: write
      pull-requests: write
    
    steps:     
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Authenticate to Google Cloud
        uses: google-github-actions/auth@v2
        with:
          workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
          service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}
      
      - uses: anthropics/claude-code-action@beta
        env:
          ANTHROPIC_VERTEX_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
          CLOUD_ML_REGION: us-east5     
          CLAUDE_CODE_PRIMARY_MODEL: claude-opus-4-20250514
          CLAUDE_CODE_ASSISTANT_MODEL: claude-sonnet-4-20250514
          ANTHROPIC_VERTEX_ENABLE_PROMPT_CACHING: true
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          use_vertex: "true"
          max_turns: 30
          timeout_minutes: 20
          trigger_phrase: "@claude"
          allowed_tools: "Bash"
```

これで、イシューやプルリク上で `@claude` とメンションし指示することで、GitHub Actionsが動作し、イシューやプルリク、コードの内容を読み取り、Claudeによるタスク実行やレビュー、提案が受けられるようになります！

ワークフローはサンプルなので用途でアレンジしてください。
ユーザーのメンショントリガーだけではなく、他のトリガーで動作を行わせることも可能です。

また、プロジェクトルートにClaudeにコンテキストを提供するためのCLAUDE.mdを追加します。

```markdown:CLAUDE.md
# CLAUDE.md
このファイルは、このリポジトリでコードを扱う際にClaude Code (claude.ai/code) に対してガイダンスを提供します。

## 原則
- ユーザーへの応答は必ず日本語で行うこと
```

こちらにプロジェクトのコーディングルールや、仕様などを記述することでより精度の高いアウトプットが期待できます。

ユーザー個別の設定は`~/.claude/CLAUDE.md`こちらでできます。

---

これで、Claude Codeを関単にチームに導入する準備が整いました！
レッツAI駆動開発🚀

# 後日談
70人ほどの部署で使ったら大人気となり、１週間であっという間に利用料が$2000を超えました…。
今はなるべくClaude Sonnet 4を使ってｍことで値段を抑えていますが参考まで。