はじめに
前回の記事では、リーダブルコードの原則に従ったコードレビューを自動化できないものか・・と考えた結果、『RAGにリーダブルコードの原則を取り込ませてコードレビューをしてもらおう!!』という検証をしてみました。
検証環境の構築は AWSマネジメントコンソール を使用していましたが、今回は AWS SAM を使用して、より簡単に環境構築する方法の解説を行います。
使用するリポジトリは以下になります。
事前準備
リージョン切り替え
全ての手順は「東京リージョン」で実施することを前提としているため、AWSのマネジメントコンソールからリージョンを「東京」に変更してから手順を進めてください。
Cloud9
ローカルマシンの環境を汚さないために、Cloud9 を使用して環境構築を行います。Cloud9 には、今回の作業に必要な以下のツールが事前にインストールされているため、環境構築がスムーズに行えます。
- AWS CLI
- AWS SAM CLI
- Docker
Cloud9環境の作成
Cloud9コンソールにアクセスして、「環境を作成」をクリックします。
名前は sam-deploy
として、「新しいEC2インスタンス」を選択します。
インスタンスタイプは t2.micro
を選択し、プラットフォームは「Amazon Linux 2023」を選択します。
「作成」をクリックします。
作成した環境を選択し「Cloud9 で開く」を選択すると、Cloud9のコンソールが開きます。本手順でコマンドを実行する際は、Cloud9のコンソールで実行してください。
Pythonのインストール
Cloud9では「Python3.9」がデフォルトでインストールされていますが、デプロイするLambdaのランタイムは「Python3.10」にしているため、Cloud9で以下のコマンドを実行して「Python3.10」をインストールして使用できるようにします。
# 必要な開発ツールをインストール
sudo yum -y install bzip2-devel xz-devel
# pyenv を clone して設定
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
# .bashrc の変更を適用
source ~/.bashrc
# Python 3.10.14 をインストールして現環境に設定
pyenv install 3.10.14
pyenv global 3.10.14
# python 3.10 の pip が使用されていることを確認
pip --version
# pip 23.0.1 from /home/ec2-user/.pyenv/versions/3.10.14/lib/python3.10/site-packages/pip (python 3.10)
IAMロールの設定
Cloud9ではAMTC(AWS managed temporary credentials)がデフォルトで有効になっており、AMTCで付与された一時クレデンシャルの権限では IAMロールやIAMポリシーに対するアクセス権限が制限されている ため、デプロイ時にエラーが発生してしまいます。
そのため、Cloud9インスタンスのIAMロールに「AdministratorAccess」ポリシーを追加でアタッチすることで、IAMロールやIAMポリシーに対するアクセス権限を付与することにします。
-
Cloud9画面の右上にある「歯車アイコン」をクリックし、「AWS Settings」の「Credentials」から、「AWS managed temporary credentials」を無効にします。
-
EC2コンソールに移動して、Cloud9のインスタンスに紐づくIAMロールを選択します。
「aws-cloud9-sam-deploy〜」という名前のインスタンスがあるので、そのインスタンスを選択し、「セキュリティ」から「IAMロール」を選択します。
-
IAMロールにポリシーをアタッチします。
「許可の追加」から「ポリシーをアタッチ」を選択します。
「AdministratorAccess」ポリシーにチェックを入れて、「許可を追加」をクリックします。
Bedrock
モデルアクセスの有効化
東京リージョンでBedrockを使用するために、モデルアクセスを有効化します。
-
Bedrockコンソールに移動して「モデルアクセス」を選択します。
-
Anthropic社のモデルを使用するには「ユースケースの詳細」を提出する必要があるため、「ユースケースの詳細」をクリックします。
-
ユースケースの詳細を入力して、「送信」をクリックします
-
「モデルアクセスを管理」をクリックします
-
「Claude」にチェックを入れて、「モデルアクセスをリクエスト」をクリックします。
-
アクセスが付与されたことを確認します。
Slack
ワークスペースの作成
既存のワークスペースを使用するか、新規でワークスペースを作成してください。
私は RAG
というワークスペースを作成しています。
アプリを作成する
-
Slack API にアクセスして、「Your apps」をクリックします。
-
アプリを作成する
「Create an App」をクリックします。
「From scratch」を選択する
App Name(アプリ名)は
Reviewer
と入力し、作成したワークスペースを選択し、「Create App」をクリックします。 -
アプリのBot権限を追加する
OAuth & Permissions を選択します。
Scopes の 「Add an OAuth Scope」をクリックします。
メンションメッセージを読み取り、レスポンスを返すための権限を追加する
- app_mentions:read
- channels:read
- chat:write
-
ワークスペースにアプリをインストールする
OAuth & Permissions の OAuth Tokens for Your Workspace にある Install to Workspace をクリックします。
許可するをクリックします。
デプロイ
Cloud9で作業するため、Cloud9コンソールにアクセスして、作成した環境を開きます。
プロジェクトのクローン
-
リポジトリをクローンする
git clone https://github.com/sakes9/sam-slack-review-rag.git
-
リポジトリに移動する
cd sam-slack-review-rag
環境変数を設定する
Slackの「Bot User OAuth Token」と「Signing Secret」の値を template.yaml
の Environment に設定します。
-
OAuth & Permissions にある Bot User OAuth Token をメモしておきます。
-
Basic Information にある Signing Secret をメモしておきます。
-
template.yaml
の以下の環境変数にSlackの「Bot User OAuth Token」と「Signing Secret」の値を設定して保存します。環境変数 値 SLACK_BOT_TOKEN {Bot User OAuth Token の値} SLACK_SIGNING_SECRET {Signing Secret の値} ReviewReadableCodeFunction: Type: AWS::Serverless::Function Properties: FunctionName: "review-readable-code-function" ・・・ Environment: Variables: ・・・ SLACK_BOT_TOKEN: "xoxb-XXXXXXXXXXXXX" # Slack Bot Token SLACK_SIGNING_SECRET: "XXXXXXXXXXXXX" # Slack Signing Secret ・・・
ビルド〜デプロイ
-
ビルドします
sam build
-
デプロイします
S3バケット名はリージョン内で一意である必要があるため、データソース格納バケット名は
DataSourceBucketName
パラメータに 一意の名前 を指定してデプロイする。sam deploy --region ap-northeast-1 \ --parameter-overrides DataSourceBucketName="readable-code-data-source-{ランダムな文字列}"
Kendraのデータソースを同期します
-
data-sourceフォルダ内のPDFファイルをS3にアップロードします。
Cloud9で以下のコマンドを実行し、データソース格納バケットにPDFファイルをアップロードします。
aws s3 cp data-source/[第Ⅰ部][2章]表面上の改善_名前に情報を詰め込む.pdf s3://{データソース格納バケット名}
-
Kendraのデータソースを同期する
メンション時のイベントを設定する
-
Slack API から「Event Subscriptions」を選択して、Enable Events を ON にします。
-
Lambdaの関数URLをコピーします。
-
Request URL にコピーした関数URLを貼り付けます。
一度目の検証で失敗するが、Retryしたら2回目で成功する(理由はわからない)
検証に成功すると Verified にチェックがつきます。
-
「Subscribe to bot events」の Add Bot User Event をクリックします。
-
「app_mention」を追加します。
-
「Save Changes」をクリックします。
動作検証
コードレビューの提出
-
Slack にアクセスします
-
Slack App をインストールしたワークスペースを開きます
-
チャンネルを作成します
私はreview
というプライベートチャンネルを作成しました。 -
Slack Appを招待します
@Reviewer
をメンションして、Slack App を招待します。「招待する」をクリックします。
Slack App がチャンネルに招待されました。
招待時の初回メッセージに対するレスポンスは無視してください。
-
レビュー依頼を出します
@Reviewer
をメンションして、コードをレビューしてもらうために、以下のメッセージを送信すると、レビューが開始されます。@Reviewer for (var i = 0; i < clubs.length; i++) { for (var j = 0; j < clubs[i].members.length; j++) { for (var k = 0; k < clubs[i].members[j].users.length; k++) { if (clubs[i].members[j].users[k].id === userId) { console.log(`${clubs[i].members[j].users[k].name} が所属しているクラブは ${clubs[i].name}`); } } } }
-
レビュー結果が返却されます
スタック削除
注意
動作検証後は、必ずリソースの削除を行ってください。
リソースが残っていると課金が発生します。
特にKendraは高額な課金が発生するため、削除を忘れないようにしてください。
スタックを削除することで、スタックに関連するリソースが削除されます。
以下の手順を実行してスタックを削除します。
-
S3バケットの中身を空にする
S3バケットはオブジェクトが存在すると削除できないため、以下のコマンドを実行してスタック削除前にバケットの中身を空にしておく。
aws s3 rm s3://{データソース格納バケット名} --recursive
-
スタック削除
以下のコマンドを実行することで、デプロイしたスタックを削除できます。
sam delete --region ap-northeast-1
-
Cloud9環境の削除
Cloud9コンソールにアクセスして、作成したCloud9環境とIAMロール(AWSCloud9SSMAccessRole)を削除します。
まとめ
AWS SAM を使用して、Slack経由でコードレビューを依頼するRAG環境を構築する方法について解説しました。前回の記事ではAWSマネジメントコンソールから環境を構築していましたが、手動作業には ヒューマンエラーのリスク が伴い、またAWSリソースが テンプレート化されていない(コード化されていない) ため、作成した環境の 再現性が低くなる といったデメリットがあります。
AWS SAM を利用することで、サーバーレスアプリケーションの構築が簡単になり、異なる環境への迅速なデプロイが可能になります。