8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AI Code Review】PR Agentって簡単に作れるんやで。そう。Amazon Bedrockならね。

8
Last updated at Posted at 2026-03-11

はじめに

TooMeです。この度AWS Community Builder に認定されました。
今年度はより一層気合を入れてAWS関連のキャッチアップおよびアウトプットをできればいいなと考えています。
少し前にはじめたXはこちら

今回は、Github.com上でPull Requestに対してレビューを行うAI Agentの導入をハンズオン形式で記事にしました。
Amazon Bedrockを用いることにより、予算を管理しやすかったり、新しくSaaS申請をする必要がなかったりなど、需要はありそうです。

今回作成するPR Agentの挙動

PRを作成、もしくはPRに対しての新しいコミットがあった時、以下の画像のように自動でレビューを行い、PRに対してコメントを行います。
(Agentの画像が自分と同じものになっていてややこしいですが、これは私ではなくClaude Codeくんです)
スクリーンショット 2026-03-10 16.16.31.png

以下のようにPRやIssueに対して@claudeでメンションを飛ばして実装や質問ができるようにもします。

スクリーンショット 2026-03-10 16.18.54.png

実装

Step 1: AWS側の設定

1-1. OIDC ID プロバイダーの作成

GitHub Actions から AWS にアクセスするために、OIDC ID プロバイダーを作成します。
マネコン(AWS マネージメントコンソール)から、以下のように遷移していくと作成ができます。

IAM > ID プロバイダ > プロバイダを追加

項目
プロバイダのタイプ OpenID Connect
プロバイダの URL https://token.actions.githubusercontent.com
対象者 sts.amazonaws.com

1-2. Bedrock で モデルIDを確認する

使用する生成AIモデルのモデルIDをおさえます。
以前は「モデルアクセス」ページで事前に有効化する必要がありましたが、現在は廃止されています。

Bedrock > モデルカタログ

ここで好きなモデルを選択して、そのモデルのモデルIDをメモしておきます。
今回のハンズオンではClaudeモデルを前提に書いています。

今回、私は予算をけちりたいのでClaude Haiku 4.5を使用します。予算がある方はSonnetOpusをおすすめします。
画面スクショから、モデルIDがanthropic.claude-haiku-4-5-20251001-v1:0なのがわかります。

スクリーンショット 2026-03-11 15.52.05.png

重要: プレイグラウンドで一度モデルを実行してください

Anthropic のモデルは AWS Marketplace 経由で提供されています。モデルアクセスページは廃止されましたが、代わりに Marketplace 権限を持つユーザーが一度モデルを呼び出すことで、アカウント全体で有効化される仕組みになっています。

モデルカタログから使用するモデルを選択し、「プレイグラウンドで開く」から適当なプロンプトを送信してください。これを行わないと、GitHub Actions から呼び出した際に以下のようなエラーが発生します。

スクリーンショット 2026-03-11 15.41.44.png

この手順はモデルごとに一度だけ必要です。

1-3. Bedrock 用 IAM ロールの作成

IAM > ロール > ロールを作成

  • 信頼されたエンティティタイプ: ウェブアイデンティティ
  • ID プロバイダー: token.actions.githubusercontent.com
  • Audience: sts.amazonaws.com
  • GitHub organization: 個人リポジトリならGitHubのユーザー名、OrganizationならOrganizationの名前です。
  • ロール名: 任意(例: my-bedrock-claude-role

信頼ポリシー (Trust Policy)

作成したロールに対して、信頼ポリシーを付与しましょう。
Issue/PR コメントのイベントは特定ブランチに紐づかないため、ブランチを限定しないのがポイントです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
        },
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:<OWNER>/<REPO>:*"
        }
      }
    }
  ]
}

<ACCOUNT_ID>, <OWNER>, <REPO> を自分の環境に合わせて置き換えてください。

<OWNER>は個人リポジトリならGitHubのユーザー名です。OrganizationならOrganizationの名前です。

リポジトリを制限したくない場合

repo:<OWNER>/* のようにワイルドカードで全リポジトリを許可したくなりますが、AWS IAM の制約によりワイルドカードの前に6文字以上の固定文字列が必要なため、このパターンではエラーになります。

複数リポジトリから利用したい場合は、Condition 内で対象リポジトリを個別に列挙してください。

"StringLike": {
  "token.actions.githubusercontent.com:sub": [
    "repo:<OWNER>/repo-a:*",
    "repo:<OWNER>/repo-b:*",
    "repo:<OWNER>/repo-c:*"
  ]
}

インラインポリシー

さきほど作成したロールに対して、インラインポリシーを作成してください。

ポリシー名: BedrockInvokePolicy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel",
        "bedrock:InvokeModelWithResponseStream"
      ],
      "Resource": [
        "arn:aws:bedrock:*::foundation-model/anthropic.claude-*",
        "arn:aws:bedrock:*:<ACCOUNT_ID>:inference-profile/us.anthropic.claude-*"
      ]
    }
  ]
}

inference-profile のリソースはクロスリージョン推論を使う場合に必要です。
クロスリージョン推論を使うと、リクエストが複数リージョンに分散され、スロットリングのリスクを軽減できます。

作成後、ロールの ARN をメモしておきます。

Step 2: GitHub App の作成

Bedrock 経由で利用する場合、Anthropic 公式の Claude App は使えないため、自前の GitHub App を作成します。

https://github.com/settings/apps/new にアクセス

項目
GitHub App name 任意のユニークな名前
Homepage URL 自分のリポジトリURL
Webhook > Active チェックを外す

その他はデフォルトのままでOK
この時Agentのアイコンを設定することもできます。
設定しなかった場合、ownerのアイコンになります。

Repository permissions

権限 レベル
Contents Read & Write
Issues Read & Write
Pull requests Read & Write

作成後の手順

  1. 「Create GitHub App」をクリック
  2. 作成後のページで App ID をメモ
  3. 「Generate a private key」をクリック → .pem ファイルをダウンロード
  4. 左サイドバー「Install App」→ 自分のアカウントを選択
  5. 対象リポジトリを選択して「Install」

Step 3: GitHub Secrets の登録

GitHub > Settings > Secrets and variables > Actions で以下の Repository secrets を追加します。

Secret 名
AWS_BEDROCK_ROLE_ARN Step 1-3 で作成したロールの ARN
CLAUDE_APP_ID Step 2 でメモした GitHub App の App ID
CLAUDE_APP_PRIVATE_KEY Step 2 でダウンロードした .pem ファイルの内容全体

Step 4: GitHub Actions Workflow の作成

レビュー用と、メンションで動く用の2つのワークフローを作成します。

4-1. 自動PRレビュー(claude-review.yml)

.github/workflows/claude-review.yml を作成します。

name: Claude PR Review

permissions:
  contents: read
  pull-requests: write
  issues: write
  id-token: write

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Generate GitHub App token
        id: app-token
        uses: actions/create-github-app-token@v2
        with:
          app-id: ${{ secrets.CLAUDE_APP_ID }}
          private-key: ${{ secrets.CLAUDE_APP_PRIVATE_KEY }}

      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_BEDROCK_ROLE_ARN }}
          aws-region: us-east-1

      - name: Run Claude Code Review
        uses: anthropics/claude-code-action@v1
        with:
          github_token: ${{ steps.app-token.outputs.token }}
          use_bedrock: "true"
          prompt: |
            PR #${{ github.event.pull_request.number }} の変更差分をレビューしてください。

            1. まず CLAUDE.md を読んでプロジェクトの構成・規約を理解してください。
            2. gh pr diff ${{ github.event.pull_request.number }} で差分を確認してください。
            3. レビュー結果を gh pr review で PR に直接投稿してください。

            投稿手順:
            a. Write ツールでレビュー内容を /tmp/review_body.md に保存
            b. gh pr review ${{ github.event.pull_request.number }} --comment --body-file /tmp/review_body.md で投稿

            **レビュー観点:**
            - バグや論理エラー
            - セキュリティ上の問題
            - プロジェクト規約違反
            - パフォーマンス上の懸念
            - 可読性・保守性の改善提案

            **レビュー対象外(無視してよい):**
            - 生成ファイル: *.g.dart, *.freezed.dart
            - キャッシュ: __pycache__, .dart_tool
            - ロックファイル: pubspec.lock, uv.lock

            **ルール:**
            - 日本語でフィードバックしてください
            - 具体的で実行可能な指摘をしてください
            - 必ず --comment フラグを使い、PR をブロックしないでください(--approve や --request-changes は使わない)
            - 問題がなければ「LGTM」と簡潔にコメントしてください
          claude_args: >-
            --model us.<モデルID>
            --max-turns 15
            --allowedTools "Bash(gh *)" "Read" "Glob" "Grep" "Write"
        env:
          AWS_REGION: us-east-1
          AWS_DEFAULT_REGION: us-east-1
          GH_TOKEN: ${{ steps.app-token.outputs.token }}

ポイント解説:

  • --model us.<モデルID>でメモしおいたモデルIDで好きなモデルを使用
  • use_bedrock: "true" で Bedrock 経由の呼び出しを有効化
  • --max-turns 15 でレビューのターン数を制限(デフォルトで10。大きい作業をする時は増やす)
  • --allowedTools で使用できるツールを明示的に制限(セキュリティ)
  • --comment フラグを使い、PRをブロックしないレビューにする(Approve/Request Changesにしない)
  • レビュー対象外のファイルパターンを指定して、生成ファイルへの無駄な指摘を防止

4-2. @claude メンション対応(claude.yml)

Issue/PR のコメントで @claude とメンションすると、AIが実装や質問に応答するワークフローです。

.github/workflows/claude.yml を作成します。

name: Claude Code

permissions:
  contents: write
  pull-requests: write
  issues: write
  id-token: write

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

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 == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
      (github.event_name == 'issues' && contains(github.event.issue.body, '@claude'))
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Generate GitHub App token
        id: app-token
        uses: actions/create-github-app-token@v2
        with:
          app-id: ${{ secrets.CLAUDE_APP_ID }}
          private-key: ${{ secrets.CLAUDE_APP_PRIVATE_KEY }}

      - name: Configure AWS Credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ secrets.AWS_BEDROCK_ROLE_ARN }}
          aws-region: us-east-1

      - name: Run Claude Code
        uses: anthropics/claude-code-action@v1
        with:
          github_token: ${{ steps.app-token.outputs.token }}
          use_bedrock: "true"
          claude_args: >-
            --model us.<モデルID>
            --max-turns 50
            --allowedTools "Bash(gh *)" "Bash(git *)" "Bash(cd *)" "Bash(make *)"
            --append-system-prompt "コード変更を行った場合は、必ず gh pr create を使って PR を自動作成してください。PR のタイトルは変更内容を簡潔に表し、本文には対応する Issue 番号を含め、末尾に Closes #<Issue番号> を記載してください。PR レビューコメントで呼ばれた場合は、レビューを COMMENT タイプで提出し PR をブロックしないでください。生成ファイル(*.g.dart, *.freezed.dart, __pycache__)はレビュー対象外です。日本語でコミュニケーションしてください。"
        env:
          AWS_REGION: us-east-1
          AWS_DEFAULT_REGION: us-east-1
          GH_TOKEN: ${{ steps.app-token.outputs.token }}

ポイント解説:

  • --model us.<モデルID>でメモしおいたモデルIDで好きなモデルを使用
  • contents: write でコード変更・コミット・PR作成が可能
  • if 条件で @claude を含むコメントにのみ反応(不要なトリガーを防止)
  • --max-turns 50 で実装タスクに必要なターン数を確保
  • --append-system-prompt でPR作成やIssueクローズのルールを注入
  • fetch-depth: 1 で最新コミットのみ取得(実装用途では全履歴不要)

注意点

  • Bedrockのプレイグラウンドで使用するモデルを一度使用しておく必要がある
  • --max-turns を適切に設定しないと、コストが想定以上にかかる可能性がある

全部うまくいけば、以下のように動くはずです。
スクリーンショット 2026-03-11 15.06.35.png

Step 5: CLAUDE.md を活用する

リポジトリルートに CLAUDE.md を配置すると、Claude Code Action がそれを自動で読み込み、プロジェクトの規約やルールに従って動作します。

# プロジェクト名

## 基本ルール
- 日本語でコミュニケーションする
- コーディング規約やリンターの設定に従う

## プロジェクト構成
- 各ディレクトリの役割を記載

## コーディング規約
- 命名規則、フォーマットルールなど

CLAUDE.md に書いた内容は、レビュー時にも @claude メンション時にも参照されます。
プロジェクト固有のルール(命名規則、アーキテクチャ方針、使用技術など)を記載しておくと、より精度の高いレビューやコード生成が期待できます。

2つのWorkflowの違い

自動PRレビュー @claude メンション
ファイル claude-review.yml claude.yml
トリガー PR作成/更新時に自動実行 @claude メンション時
用途 コードレビュー 実装・質問・修正依頼
contents権限 read(読み取りのみ) write(コード変更可能)
max-turns 15(レビューは短く) 50(実装は長く)
タイムアウト 30分 60分

まとめ

Amazon Bedrock + Claude Code Action を使えば、すぐにPR Agent を導入できます。

必要なものは以下の3つだけです:

  1. AWS の IAM ロール(OIDC + Bedrock権限)
  2. GitHub App(Contents / Issues / Pull requests の権限)
  3. GitHub Actions のワークフローファイル(2つ)

既にAWS環境がある組織であれば、新たなSaaS契約なしに、AWS利用料の中でAIコードレビューを導入できるのは大きなメリットだと思います!

また、スマホアプリのGitHubからリポジトリにアクセスして、@claudeとメンションするだけで開発もできてしまうのはとてもよいです!

PR AgnetがPRに対してコメントをする → @claudeでメンションして直させる
ということもできて、見ていて楽しいです!

ぜひ試してみてください!

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?