🐕

Amazon CodeGuru Reviewerにコードをレビューしてもらうハンズオン!

2023/05/04に公開

Amazon CodeGuru Reviewerに触れてみる

はじめに

この記事では AWSのコードレビューサービスであるAWS CodeGuruについて解説した記事です。
記事の途中ではハンズオンがあります。

想定している読者としてはAWSのアカウントを既に持っており、Codeシリーズに興味がある人を対象にしています。

注意事項

  • AWS初学者向けかと問われると若干怪しいところがあります

    • AWSのアソシエイトレベルはクリアできる/クリアできる見込みのある人であれば、概ねできるように書いています
      • 上記に該当する人で難しいと感じてしまったのであれば、ごめんなさい
  • 記事の内容につきましてはある程度が時間が経過しても読めるように努力します

    • できる限りというベストエフォートな対応になりますのでご了承下さい
    • 最新の情報はAWSの公式ドキュメントを見ていただくようにお願いできればと思います
  • 本記事のハンズオンで発生した料金については一切責任を負いません

    • 利用しないサービスについては作成後に必ず削除することをお勧めします。

Amazon CodeGuru とは

まず最初に Amazon CodeGuru Reviewerの機能を提供しているAmazon CodeGuruについて見ていきましょう。
Amazon CodeGuruについてはAWSのドキュメントに以下のように説明があります。

ML を活用した推奨事項を使用して、コードレビューを自動化し、アプリケーションのパフォーマンスを最適化

簡単に言うと人間の代わりに機械学習でソースコードを改善しようというサービスです。
Amazon CodeGuru には2つの機能があります。

  • CodeGuru Reviewer
    • 機械学習を利用したコードレビューのサービス
  • CodeGuru Profiler
    • アプリケーションのパフォーマンスを分析するサービス

各機能について見ていきましょう。

CodeGuru Reviewerとは

端的に言えば、ML(機械学習)を利用したコードレビューのサービスです。
AWSのドキュメントに以下のように説明があります。

機械学習および自動推論を使用して、アプリケーション開発中に重大な問題、セキュリティの脆弱性、見つけにくいバグを特定し、推奨事項を提供することで、コードの品質を向上します。

アプリケーションの問題やアプリケーションの脆弱性、バグを見つける作業をMLによる自動推論で解決するというものです。
分析の対象はAWSに連携されたリポジトリサービスであり、CodeCommitやGitHubのリポジトリを連携することによって利用できます。

ただし、人によるレビューと同じく、レビューを開始するにはプルリクエストを発行する必要があります。

CodeGuru Reviewerの料金体系

スキャンされた行数に応じて料金が発生します。スキャンにはフルリポジトリスキャンと増分スキャンの2つがあります。
お試しの利用で最初の90日間は無料です。以降はリポジトリサイズ(コードの行数)で決まります。

2023年05月03日現在では10万行で10USD(東京リージョン)であり、以降に追加されたコードに対しては10万行単位で料金が発生します。
また、リポジトリごとに 2 回を超えるフルリポジトリスキャンについては10万行単位で料金が発生します。

CodeGuru Profilerとは

CodeGuru Reviewerがソースコードのレビュアーをしくれるサービスであることに対してCodeGuru Profilerはアプリケーションのパフォーマンスを分析するサービスです。
AWSのドキュメントに以下のように説明があります。

CodeGuru Profiler は、実稼働しているアプリケーションのパフォーマンスを最適化、および最もコストが高いコード行を特定します。アプリケーションのパフォーマンスの最適化を常に模索しており、CPU 使用率を削減し、計算コストを低減し、アプリケーションのパフォーマンスを向上させるための修正方法を推奨します。

つまり、人間の目では測定できないマシンスペックに依存するようなところ(CPU使用率など)を分析してアプリケーションパフォーマンスを測定するサービスです。

補足になりますが、アプリケーションのプロファイリングを実行するサービスとしてAWS X-Rayというサービスがありますが、AWS X-Rayはサービス間のレイテンシを測定するなどリクエスト周りの測定を実行するサービスであり、マシンスペックに依存するようなところは分析しません。

CodeGuru Profilerの料金体系

お試しの利用で最初の90日間は無料です。以降はサンプリング時間数に基づいた料金がかかります。

サンプリングはプロファイリンググループという単位で実行します。また、プロファイリングを実行するAWSサービス毎に料金の計算方法が異なります。

  • Amazon EC2 インスタンス、Amazon ECS、EKS、AWS Fargate Containers 上のアプリケーションのプロファイリングの場合

プロファイリンググループごとに最初の 36,000 サンプリング時間まで、1 サンプリング時間あたり 0.005 USD/月。プロファイリンググループごとに 1 か月あたり 36,000 サンプリング時間を超える分については、追加料金は発生しません。

  • AWS Lambda でのアプリケーションプロファイリング

支払いアカウントごとに、最初の 500 サンプリング時間は無料です。その後、プロファイリンググループごとに最初の 36,000 サンプリング時間まで、1 サンプリング時間あたり 0.005 USD/月。プロファイリンググループごとに 1 か月あたり 36,000 サンプリング時間を超える分については、追加料金は発生しません。

概ね組織のプロダクション環境で利用する場合は注意が必要ですが、個人で少しだけ触ってみる分には無料枠の範囲で対応できます。

実際に CodeGuru Reviewerを使ってみよう

CodeCommitでリポジトリを作成する

前回の記事を参照

ブランチを切る

CodeGuru Reviewerはプルリクエストを起点に動作する為、ブランチを切ります。
ブランチ名はtestとします。

cd ~/Desktop/cicd_handson
git checkout -b test
git push -u origin test

Codeを追加

新しくファイルを作成します。今回はapp.pyというファイルを作成して以下のコードを追記します。

# クソコードを書く

if __name__ == '__main__':
    for cnt in range(1, 9):
        print(f"test{cnt}")

CodeをPush

変更をコミット後、testブランチをpushします。

git add .
git commit -m "app.pyを追加"
git push -u

利用開始

AWSマネジメントコンソールからCodeGuruの画面に移動します。

CodeGuru_0.png

プルダウンメニューをクリックします。
CodeGuru_1.png

プルダウンメニューからCodeGuru Reviewerを選択します。
CodeGuru_2.png

ご利用開始にあたってをクリックします。
CodeGuru_3.png

リポジトリを関連付ける

AWS CodeCommitを選択、リポジトリをcicd_handsonに指定します。暗号化設定はカスタマイズしません。
CodeGuru_4.png

分析するブランチを指定します。今回は事前に切っておいたtestブランチを指定します。
CodeGuru_5.png

最後にKeyとValueを設定してリポジトリを関連づけて実行をクリックします。
CodeGuru_6.png

時間がかかりますが、しばらくすると指定のブランチの解析が終わり、ステータスがpendingからCompletedに変わります。

CodeGuru_8.png

初めてリポジトリの関連付けを実行した場合はフルリポジトリ分析が実行されます。

プルリクエストをイベントソースにしてCodeGuru Reviewerを動かす

CodeGuru Reviewerはプルリクエストをイベントソースとして実行することができます。
実際に試してみましょう。まずは新規にブランチを切ります。

git checkout -b pull_request

pushするソースコードを修正します。

# コードを修正する

if __name__ == '__main__':
    for cnt in range(1, 10):
        print(f"test{cnt}")

変更をブランチに追加してブランチをリモートに追加します。

git add .
git commit -m "forに書き換え"
git push -u origin pull_request

CodeCommitでプルリクエストを作成

CodeCommitのリポジトリ画面からプルリクエストを作成します。

まずは対象のリポジトリをクリックします。
CodeGuru_10.png

プルリクエストの作成をクリックします。
CodeGuru_11.png

ターゲットとソースをそれぞれ選択します。
CodeGuru_12.png

ターゲットをtest、ソースをpull_requestに変更します。
CodeGuru_13.png

比較をクリックします。Mergeble と表示されたらマージができます。

CodeGuru_14.png

タイトルと説明を入れます。
タイトルはpull_request、説明はCodeGuruのテストです。と入力します。
CodeGuru_15.png

プルリクエストの作成をクリックします。
CodeGuru_16.png

成功と表示されれば、問題なくプルリクエストが作成できています。
CodeGuru_17.png

CodeGuru の画面に戻る

CodeGuru の画面に戻って増分コードレビューが動いているか確認してみましょう。
プルリクエスト作成直後はpendingという状態になっています。

CodeGuru_18.png

しばらくするとCompletedに変わります。
CodeGuru_19.png

まとめ

  • CodeGuruには2つの機能がある
    • CodeGuru Reviewer
    • CodeGuru Profiler
  • 今回はCodeGuru Reviewerをハンズオン
    • 初めてのリポジトリ連携ではフルリポジトリ分析が実行される
    • プルリクエストによる分析は増分コードレビューが実行される

おまけ

いろんな調査をしていく中でCodeGuru Reviewerがやってくれないことがいくつか明らかになりました。
また、今回は指摘事項がなかったのでしっかりレビューをしてくれたのか分かりにくいところもあり、「コードレビューさせていたつもりがレビューできていませんでした」というインシデントが起きそうです。間違いだけでなくグッドな部分についても評価してくれたら褒めて伸びるタイプの人は嬉しいかもしれません。
今後のアップデートに期待したいです。

※現時点でCodeGuru Reviewerが指摘しないもの

  • 余分なprintは指摘されない
  • 不要なインポート文は指摘されない
  • 0割は認識しない
  • 無限ループは指摘されない
  • 実行されない文は指摘されない

おわり

Discussion