はじめに
TooMeです。この度AWS Community Builder に認定されました。
今年度はより一層気合を入れてAWS関連のキャッチアップおよびアウトプットをできればいいなと考えています。
少し前にはじめたXはこちら
今回は、Github.com上でPull Requestに対してレビューを行うAI Agentの導入をハンズオン形式で記事にしました。
Amazon Bedrockを用いることにより、予算を管理しやすかったり、新しくSaaS申請をする必要がなかったりなど、需要はありそうです。
今回作成するPR Agentの挙動
PRを作成、もしくはPRに対しての新しいコミットがあった時、以下の画像のように自動でレビューを行い、PRに対してコメントを行います。
(Agentの画像が自分と同じものになっていてややこしいですが、これは私ではなくClaude Codeくんです)

以下のようにPRやIssueに対して@claudeでメンションを飛ばして実装や質問ができるようにもします。
実装
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を使用します。予算がある方はSonnetやOpusをおすすめします。
画面スクショから、モデルIDがanthropic.claude-haiku-4-5-20251001-v1:0なのがわかります。
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 |
作成後の手順
- 「Create GitHub App」をクリック
- 作成後のページで App ID をメモ
- 「Generate a private key」をクリック →
.pemファイルをダウンロード - 左サイドバー「Install App」→ 自分のアカウントを選択
- 対象リポジトリを選択して「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を適切に設定しないと、コストが想定以上にかかる可能性がある
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つだけです:
- AWS の IAM ロール(OIDC + Bedrock権限)
- GitHub App(Contents / Issues / Pull requests の権限)
- GitHub Actions のワークフローファイル(2つ)
既にAWS環境がある組織であれば、新たなSaaS契約なしに、AWS利用料の中でAIコードレビューを導入できるのは大きなメリットだと思います!
また、スマホアプリのGitHubからリポジトリにアクセスして、@claudeとメンションするだけで開発もできてしまうのはとてもよいです!
PR AgnetがPRに対してコメントをする → @claudeでメンションして直させる
ということもできて、見ていて楽しいです!
ぜひ試してみてください!



