Amazon Bedrock + Lambdaを使って自動コードレビューBotを構築する

スポンサーリンク
ハンズオン
スポンサーリンク

はじめに

コードレビューに時間がかかる、人の目でレビューするため見落としが発生するといったことがあるのではないでしょうか?

開発が進むと、プルリクエストの数はどんどん増え、
次のような課題が発生しやすくなります。

  • レビュー待ちによる開発スピードの低下
  • 手動レビューでは見落としが起きやすく、品質リスクが高まる

これらの課題を解決するために、この記事では、AWS CodeCommitとAmazon Bedrockを利用して、プルリクエストの差分コードを自動でチェックするレビューBotの作り方を紹介します。

以下2点補足事項になります。

CodeCommitのサービス提供について

2024年7月25日以降に作成した新規のアカウントでCodeCommitは利用できません
2024年7月24日以前に作成した既存アカウントでは継続して利用可能です。
CodeCommitの代替として、GitLab/GitHub/BitBacketが紹介されています。
参考)How to migrate your AWS CodeCommit repository to another Git provider

CodeGuru(有料サービス)について

AWSにはCodeGuruというコードレビュー専用の有料サービスも存在します。
CodeGuruは、ソースコード全体を対象に、セキュリティやパフォーマンスの観点から自動レビューを行う便利なサービスです。
参考)Amazon CodeGuru セキュリティ
しかし、利用にはコストがかかるため、今回のハンズオンでは、可能な限り無料枠で試せる方法を選択しています。
商用利用や本番環境での導入を検討する場合は、CodeGuruの活用も視野に入れると、さらに効果的な運用ができるでしょう。

本記事で紹介する内容はCloudFormationテンプレートを活用するため、すぐにAWS環境で試すことができ、コストも無料枠中心で収まるようになっています。

この記事でわかること

  • AWS CodeCommitとAmazon Bedrockを使ったコードレビューBotの構築方法
  • 差分コードからコーディング規約違反やコメント不足を自動検出する仕組み
  • CloudFormationを使った簡単な環境構築手順
  • 自動レビューによる開発プロセス効率化の実例

それでは、AIでコードレビューを効率化する仕組み作りに取り組んでいきましょう!

環境構成

環境構成図

本記事で紹介するハンズオンの構成は以下です。

サービス一覧

サービス 説明
CodeCommit コード管理サ-ビス
EventBridge CodeCommitのプルリクエストイベントを検知して
Lambda関数をトリガーする
Lambda EventBridgeを起動トリガーとしたLambda関数
CodeCommitから変更差分を取得、
Bedrockの基盤モデルを実行し、
結果をCodeCommitのプルリクエストのコメントを追加する
IAMロール Lambda関数の実行ロール
以下の権限を付与
・CodeCommitの変更差分の取得
・Bedrockの基盤モデルの実行
・その他基本的なロール
Bedrock 指定したレビュー内容で変更差分をレビューするプロンプトを実行
※利用する基盤モデルは有効化する
CloudFormation 上記のサービスを一括で配備する

事前準備

以下を事前に準備してください。

  • AWSアカウント
  • AWS CLI実行環境(各種設定が可能なIAMユーザの設定を含む)
  • Amazon Bedrockの有効化
  • node実行環境

仕組み

概要

CodeCommitへのプルリクエストイベントをトリガーにLambda関数を実行します。
Lambda関数では、以下の流れでコードレビューとプルリクエストにレビュー結果のコメント追加します。

  1. CodeCommitのプルリクエストから変更差分を取得
  2. 変更差分のテキストからプロンプトを定義しBedrock基盤モデルを実行
  3. 実行結果をプルリクエストのコメントとして追加

処理の流れ

以下の流れで処理を実行します。

料金

本記事のハンズオンの料金はほぼ無料になります。
変更差分の量やレビュー指摘量によって変動します。(基盤モデルの入出力トークン量によって変動)
詳細は以下になります。

サービス 料金
CodeCommit USD 0.00
無料利用枠内です(参考:AWS CodeCommit の料金
EventBridge USD 0.00
無料利用枠内です(参考:Amazon EventBridge の料金
Lambda  USD 0.00
無料利用枠内です(参考:AWS Lambda 料金
IAMロール USD 0.00
IAMは利用料はかかりません
(参考:AWS Identity and Access Management (IAM) の使用開始
Bedrock USD 0.0015/実行回数
※基盤モデルや変更差分の量/レビュー指摘量によって変動します。
Claude 3 Haikuを利用、入力/出力トークンがそれぞれ1000トークンで算出
(参考:Amazon Bedrock の料金
CloudFormation USD 0.00
名前空間が「AWS::*」「Alexa::*」となるリソースを配備する場合は
追加料金はかかりません。
(参考:料金 – AWS CloudFormation

構築の流れ

GitHubからハンズオン用のソースを取得

以下でハンズオン用のソースをGitHubからcloneしてください。

git clone https://github.com/TeTeTe-Jack/aws-handson-auto-codereview.git

設定ファイルの修正

「.env」ファイルを修正してください。

# Project Name
PROJECT_NAME="CodeReviewDemo" ← 各リソースのプレフィックス値です。設定に合わせて修正してください。

# Bucket Name
S3_BUCKET_FOR_LAMBDA="my-lambda-source-bucket" ← Lambda関数のソースコードを格納するS3バケットです。

# Bedrock Setting
MODEL_ID="anthropic.claude-3-haiku-20240307-v1:0" ← 投稿時点のClaude 3 Haikuの最新モデルです。モデルが変更になった場合は修正してください。
MAX_TOKENS="1024" ← 最大のトークン数です。
DIFF_MAX_RESULT="10" ← プルリクエストの最大変更数です。 

Lambda関数のソース格納用のS3バケットの作成

cloneしたフォルダで以下コマンド実行し、Lambda関数のソース格納用S3バケットを作成します。すでに作成済みの場合はスキップしてください。

npm run setup

ソースのビルド&S3バケットにアップロード

cloneしたフォルダで以下コマンド実行し、Lambda関数のソースをビルド&S3バケットにアップロードします。

npm run zip
npm run upload

CloudFormationでリソースの配備

cloneしたフォルダで以下コマンド実行し、各種リソースの配備を行います。

npm run deploy

リポジトリの設定

以下を参考にリポジトリの初期設定をしてください。
AWS CodeCommitにIAMユーザー認証でHTTPS接続する方法

動作確認

事前準備

CodeCommitの画面を開きます。

作成したリポジトリを選択します。

以下のブランチを作成します。

  • master(初期設定で作成済み)
  • develop(masterブランチから作成)
  • feature/demo(developブラントから作成)

ブランチは以下から作成できます。

左メニューから「ブランチ」を選択します。

ブランチ一覧の画面が表示されます。「ブランチの作成」を選択します。

「ブランチ名」を入力し、「ブランチ元」のブランチを選択し、「ブランチの作成」を選択してください。

「develop」と「feature/demo」を作成した後以下のようになります。

ソースの新規追加

「feature/demo」ブランチをcheckoutして、以下のファイルを追加します。

git pull
git checkout -b feature/demo origin/feature/demo

追加するファイル名:demo.ts

ソースは以下の内容でコーディングしています。

  • 秘密情報をハードコーディングしている
  • インデントのずれがある
  • 冗長なループがある
  • 命名規約違反
  • if分の条件が不正(==ではなく、=になっている)
  • APIレスポンスがmockとなっている
// 認証情報をハードコーディング(NG)
const APIKEY = "hardcoded-12345-api-key";

function fetchUserdata(userid: string) {
  if(userid.length > 0){
     console.log("Fetching user data for ID:", userid)
    // インデントずれてる↑
  } else {
    console.log("User ID is missing");
  }

  // 冗長なループ(本当は最初にreturnすればいいだけ)
  const users = ["alice", "bob", "charlie", "dave"];
  let found = false;
  for (let i = 0; i < users.length; i++) {
    if (users[i] === userid) {
      found = true;
      console.log("User found:", users[i]);
      break;
    }
  }
  if (!found) {
    console.log("User not found");
  }

  // 命名規則違反(キャメルケースじゃない、意味も不明)
  const check_API_Response = (response: any) => {
    if (response.status = 200) { // ← 代入ミス(バグ)
      console.log("API call success");
    } else {
      console.log("API call failed");
    }
  }

  // 仮のAPIレスポンス(適当なオブジェクト)
  const mockResponse = { status: 200 };
  check_API_Response(mockResponse);
}

fetchUserdata("bob");

追加後、コミット&プッシュをしてください。

git add demo.ts
git commit -m "add demo.ts"
git push

プルリクエスト(feature/demo → develop)を作成します。

リポジトリの画面で「プルリクエストの作成」を選択します。

「feature/demo」から「develop」ブランチにプルリクエストを作成します。

プルリクエストを作成するとLambda関数が起動、developブランチへのプルリクエストの場合はコメントが追加されます。

プルリクエスト作成後、コーディング規約に違反した箇所を検出できていますね。
指摘事項を修正し、ソースブランチを更新すると再度コードレビューをしてくれますので、修正対応も実施してみてください。

まとめ

本記事では、AWS CodeCommitとAmazon Bedrockを組み合わせて、プルリクエストの差分コードを自動でレビューするBotを構築するハンズオンを実施しました。

開発の現場では、

  • プルリクエストの増加によるレビュー待ち
  • 手動レビューでの見落としリスク

といった課題が発生しやすくなりますが、今回の仕組みを取り入れることで、これらの問題を自動化によって軽減できることがわかりました。

ぜひ、今回作成したBotをベースに、

  • レビュー対象を広げる
  • 指摘内容に優先度をつける
  • 設計レベルまでレビュー対象を拡張する

など、自分たちの開発スタイルに合わせたカスタマイズにも挑戦してみてください。

タイトルとURLをコピーしました