コーディングに自信を持とう ! AI の力を借りてコードレビューを効率化

2022-04-04
デベロッパーのためのクラウド活用方法

Author : 金杉 有見子

ビルダーの皆様、こんにちは。ソリューションアーキテクトの金杉です。

皆様はアプリケーション開発、具体的にコーディングをする中でどういうポイントを重視していますか ? 期待される仕様が満たされていることはもちろん、おそらく多くの方は効率性、一貫性、保守性、可読性、セキュリティなど、様々なことを意識しているでしょう。お客様にプロダクトをお届けするだけではなく、チームとして持続的に開発が行えるようコード品質を維持することも私たちデベロッパーの重要なミッションです。

一方で、現実はなかなか上手くいかないことも多いと思います。

  • 一つの目的を果たすための実装方法は何通りもあり、全ての方法を客観的に評価するのが難しい
  • 言語や SDK のベストプラクティスを全て把握しきれない
  • 日々変化する技術へのキャッチアップが求められる
  • セキュリティには気をつけたいものそこまで考える余裕がない
  • そもそも人は必ずミスをする
  • ・・・ (続く)

このような課題を解決するために、コーディングナレッジリポジトリ、コードレビュー、自動テスト、解析ツールなどを整備・導入されている方が多いと思います。本日は、コードレビューというアプローチにフォーカスし、Amazon CodeGuru Reviewer という機械学習を駆使してコードレビューを手助けするサービスについて紹介します。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 


Amazon CodeGuru Reviewer とは ?

Amazon CodeGuru は、自動化されたコードレビューとアプリケーションパフォーマンスの推奨事項を提供する機械学習をベースとしたサービスです。プロダクトとしては、CodeGuru Reviewer と Codeguru Profiler の二つに分かれており、本日のテーマはコードレビューのサービス CodeGuru Reviewer の方になります。

ざっくりですが、以下の図で示されているように、ソースコードを CodeGuru Reviewer が解析して、推奨事項を生成してくれます。執筆時点では、Java と Python に対応しています。

社内でコードレビューは必須になっているけれども、スキルの高い人材やレビュー時間の確保が課題になっているケースも多いのではないでしょうか。

コードレビューはコーディングスキルが求められるだけでなく、上位モジュールなどサービス全体の整合性の担保や、命名規則などの社内コーディングルールも熟知する必要があるため、難易度が高く時間のかかる作業です。また、貴重な人材しかできないことだからこそ、その人材はアプリケーションデザイン観点でのレビュー時間を割きたいものの、レビュー範囲が広すぎてレビュアーに負荷が集中してし、かえってボトルネックになってしまうこともあります。

よって、コードレビューを自動化することでこのような課題を解決するとデベロッパーに多くのメリットがあります。


どういう内容を検出してくれるの ?

CodeGuru Reviewer の特徴として、リソースリーク防止やセキュリティなど特定が難しい問題の検出に特化している点が挙げられます。よって、一般的なシンタックスの問題等は推奨事項として出力されず、ノイジーになることはありません。2019 年リリース以来、CodeGuru Reviewer は検出項目を絶えず増やしてきました。検出項目について、FAQ の記述を抜粋します :

Amazon CodeGuru Reviewer は、同時実行の問題、潜在的な競合状態、悪意があるもしくは精査されていない入力、認証情報などの機密データの不適切な処理、リソースリークなどチェックし、さらに並行コードの競合状態や衝突による動作障害も検出します。さらに、AWS、Java、および Python でのベストプラクティスの提案を行い、コード内で統合可能な重複部分を検出し保守性を向上させます。

これら検出項目は主に3つのソースからのルールが組み込まれています。

  1. CodeGuru Reviewer のルール。機械学習と自動推論を使用して、コード品質とセキュリティ問題のためにコードを分析するように設計されています
  2. オープンソースのコード分析ツールである Bandit。Python コードのセキュリティ問題を見つけるよう設計されています
  3. オープンソースのコード分析ツールである Infer。Java コードの同時実行とその他の問題を見つけるように設計されています

先日、検出項目の詳細とサンプルコードを含む Detector Library も公開されました。Java と Python それぞれの検出項目が詳しく紹介されています。Java における リソースリークの例を見てみましょう。

まず、左上ではこの項目の重大性を示しています。全部で Info から Critical の 5 段階評価となっており、リソースリークの例では Medium となっています。

続いて、項目の説明と関連する CWE (Common Weakness Enumeration) の情報が記載されています。ここでは確保されたリソースが正しく解放されておらず、システムのクラッシュを引き起こす可能性があると記載されています。

下の方では違反している例と対処できているコードのサンプルを掲載しています。また、コメント欄でどのように対処するのが正しいかについても解説があります。この例では Java のストリームのクローズ処理において try-with-resources ステートメントを使用するよう推奨しています。

クリックすると拡大します

CodeGuru での検出項目は日々追加されています。今後も進化を遂げていくので、ぜひご期待ください。


前提条件はあるの・・・?

ここまでで「面白そうなサービスだな」と感じていただけたようでしたら、ぜひ以下をご確認いただければと思います。

  1. 対応言語 : Java または Python
  2. 対応リポジトリ : GitHub / GitHub Enterprise Cloud / GitHub Enterprise Server, BitBucket, AWS CodeCommit
  3. 必要アカウント : AWS アカウント (サインアップはこちらから)
  4. レビュー方式 : Pull request による増分レビュー、GitHub Actions を使用した CI ワークフロー、リポジトリのフルスキャン

なお、肝心の料金ですが、CodeGuru Reviewer はリポジトリのコード行数に応じた従量課金となります。初期費用やライセンス費用は不要です。詳しくは 料金ページ をご参考ください。また、CodeGuru Reviewer を初めてお試しいただく方向けに 90 日間の無償利用枠を用意しているので、気軽に検証していただくことが可能です。


どうやって始めるの ?

CodeGuru のセットアップ作業は対象のリポジトリを CodeGuru と関連付けするだけで終わります。GitHub の例を見てみましょう。

まず、AWS コンソールにログインし、Amazon CodeGuru サービスのページに移動します。Getting started のプルダウンから CodeGuru Reviewer を選択します。

Source Provider は GitHub or GitHub Enterprise Cloud を選択します。

その後、Connect to GitHub をクリックして、CodeGuru Reviewer のアクセスを許可します。後ほど CodeGuru Reviewer はこの時点でログインしているユーザーで pull request にコメントするので、本番では区別がつくよう事前に CodeGuru 専用の GitHub ユーザーを作成すると良いです。

Repository location のプルダウンより対象リポジトリを選択します。これで準備は完了です。

ページの下の方にスクロールすると Run a repository analysis の欄があります。リポジトリの関連付けと同時にフルスキャンが実施されるため、Source branch でブランチを指定します。なお、フルスキャンは毎月 2 回までが月額料金内に含まれています。

終わったら、ページ最下部の Associate repository and run analysis を選択します。

これでセットアップは完了しました。

初回はフルスキャンで既存の問題点を特定し、以降は pull request または GitHub Actions による CI ワークフローから都度スキャンを実施していくのが一般的な流れになります。また、検出項目は日々増えているため、定期的にフルスキャンを実施するのも良いでしょう。


検出項目はどう確認するの ?

検出項目の確認方法はレビュー実施方法によって変わります。

コードレビュータイプ 検出項目の確認方法 レビュー範囲
リポジトリフルスキャン AWS コンソールもしくは AWS CLI / SDK  ブランチ内の全コード
Pull request による増分レビュー AWS コンソールもしくは AWS CLI / SDK
リポジトリプロバイダの pull request コメント欄
Pull request 内の変更点
GitHub Actions による CI ワークフロー GitHub セキュリティタブ プッシュ、プルにおける変更点
スケジュールされたフルリポジトリスキャン

AWS コンソールから確認する時の一例を見てみましょう。

まず CodeGuru Reviewer の Code reviews ページに進みます。Incremental code reviews と Full repository analysis の二つのタブがあります。

Full repository analysis では先ほどリポジトリの関連付けと同時に実施したフルスキャンが確認できます。このコードレビューの名前を選択します。

コードレビューを開くと、このレビューの情報や検出された項目を確認することができます。

続いて、リポジトリプロバイダの Pull request コメントも見てみましょう。GitHub を例に挙げています。

まず事前準備として pull request を作成しておきます (本ブログでは割愛します)。Pull request 画面に入ると、CodeGuru Reviewer によるコメントが追加されているのを確認できます。

この例では、S3 の ListObject API よりも ListObjectV2 API の方が推奨されているよ、という AWS のベストプラクティスに関する指摘です。日々アップデートされる AWS サービスに関する推奨事項はデベロッパーからするとありがたいですね。

このように、AWS コンソールへのアクセス権限がないデベロッパーも恩恵が受けられるようになっています。


まとめ

本日は Amazon CodeGuru Reviewer の概要について紹介しました。コードレビューの効率化という難しいテーマに対する一つの解となれば幸いです。

人に代わってコードレビューを全てツールに任せるのは難しいです。それはビジネスロジックやアプリケーション全体の設計は人が行っており、品質を維持する上で必ず人による判断が必要とされるためです。しかし、発見が難しい箇所やケアが行き届かないセキュリティ関連のレビューはツールを併用し、第三の目を増やすという観点でコードレビューをより効率化することができます。その一つの選択肢として CodeGuru Reviewer も検討してみてはいかがでしょうか。Let’s code confidently !

少し余談ですが、CodeGuru は 2019 年年末の AWS がホストするカンファレンス AWS re:Invent で発表されました。発表当初はまだプレビュー状態で、Java のみがサポートされており、pull request による検出しか対応できませんでした。その後、継続的な機能強化と料金の大幅な見直しを経て、2 年経った今ではここまでパワフルなサービスに成長しました (筆者としても大変感慨深いです・・・!)。他 AWS サービスと同様に今後も CodeGuru は絶えず進化していきますので、ぜひご期待ください。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

金杉 有見子 (かなすぎ ゆみこ)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

インターネットメディアのお客様のクラウド活用をサポートするアーキテクト。旅とゲームが好き。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する