はじめに
こんにちは、技術1課の山中です。 Amazon CodeGuru が先日 GA となりました! すごそうだけど、よく知らない…という感じだったので、チュートリアルをもとに試してみています。
Amazon CodeGuru とは
Amazon CodeGuru (CodeGuru) は、自動化されたコードレビューとアプリケーションパフォーマンスの推奨事項を提供する機械学習サービスです。 CodeGuru は、ベストプラクティスとオープンソースプロジェクトおよび Amazon 内部にある数百万のコードレビューと数千のアプリケーションから培われたノウハウをベースにしているとのことで、アプリケーション開発がかなり楽になりそうです。 また、 Amazon CodeGuru はコードレビューとアプリケーションパフォーマンスの分析とで、大きく以下 2 つの機能に分かれています。
- CodeGuru Reviewer コードレビューの自動化
- CodeGuru Profiler アプリケーションパフォーマンスの分析
Amazon CodeGuru - アマゾン ウェブ サービス
CodeGuru Reviewer
CodeGuru Reviewer は、コード内の問題を検出して推奨される修正方法を提供する 自動コードレビューサービス です。 検出される問題としては以下のようなものがあります。
- 同時実行の問題
- 潜在的な競合状態
- サニタイズされていない入力
- 資格情報などの機密データの不適切な処理
- リソースリークのチェック
- 並行コードの競合状態
- etc…
CodeGuru Reviewer はソースリポジトリを CodeGuru に関連付けるだけで開始することができます。 ソースコードのプルリクエストを自動的にスキャンして、プルリクエスト内で問題を解決するための推奨事項を提供してくれるって、すごいですね…!
CodeGuru Profiler
CodeGuru Profiler を利用すると、アプリケーションの CPU 使用率とレイテンシー特性を継続的に分析して、アプリケーションで最もオーバーヘッドが高い箇所を特定することができます。 また、 CodeGuru Profiler は、アプリケーションのランタイムプロファイルを分析して、コードの最も関連性の高い部分を特定するとともに、パフォーマンスを向上させる方法についてアドバイスしてくれます。 更にこの分析結果をグラフとして可視化してくれるので、ユーザはどこを改善すべきか簡単に理解できるようになります。 CodeGuru Profiler は上記のような理由で 本番環境 で継続的に実行されることが推奨されています。 その際のオーバーヘッドは最小限になるよう設計されているとのことです。
対応言語
2020年7月1日現在、対応言語は Java のみです。
対応リポジトリ
GitHub と AWS CodeCommit リポジトリに対応しています。
料金
CodeGuru は使った分だけ支払う従量課金です。
Amazon CodeGuru の料金 - アマゾン ウェブ サービス
CodeGuru Reviewer
CodeGuru Reviewer でリポジトリを関連付けると、関連付けられたリポジトリでのすべてのプルリクエストに対してスキャンを実行します。 料金は 分析されるコード 100 行あたり $ 0.75 です。 ただし、 1 度スキャンされたコードについては、変更されたコード行のみを分析します。 例えば、以下のような開発チームを想定したときの料金を考えてみます。
- 月に平均 100 件の新規プルリクエストが発生
- 新規プルリクエストの平均は 1000 行 / 件
- 月に平均 200 件の分析済みのコードに対する変更が発生
- 変更箇所は平均 200 行 / 件
この場合、料金は以下のとおり $ 1,050 / 月 となります。
- 分析されるコード→ 100 件 × 1000 行 + 200 件 × 200 行 → 100000 行 + 40000 行 → 140000 行
- 140000 行 × 0.75 USD / 100 行 → 1,050 USD
CodeGuru Profiler
CodeGuru Profiler は以下の AWS リソース内で実行されるサンプリング時間をもとに課金を行います。
- Amazon EC2 インスタンス
- Amazon ECS
- Amazon EKS
- AWS Fargate
- AWS Lambda
Amazon EC2 インスタンス、Amazon ECS、EKS、AWS Fargate Containers 上のアプリケーションのプロファイリング | 毎月、プロファイリンググループごとに最初の 36,000 サンプリング時間まで、1 サンプリング時間あたり 0.005USD がかかります。プロファイリンググループごとに毎月のサンプリング時間が 36,000 を超える分には、追加料金は発生しません。 |
AWS Lambda でのアプリケーションプロファイリング | 支払いアカウントごとに、最初の 500 サンプリング時間は無料です。その後、アプリケーションプロファイルごとに最初の 36,000 サンプリング時間まで、1 サンプリング時間あたり、毎月 0.005USD が発生します。プロファイリンググループごとに毎月のサンプリング時間が 36,000 を超える分には、追加料金は発生しません。 |
サンプリング時間?
1 サンプリング時間は、 1 つのインスタンスで CodeGuru Profiler エージェントを 1 時間実行するのに相当します。 例えば、 1 つのアプリケーションが 2 つのインスタンスで 1 時間実行され、 CodeGuru Profiler のエージェントがこれら 2 つのインスタンスで実行されている場合は、 2 サンプリング時間で料金計算されます。
CodeGuru Reviewer を試してみる
今回は公式のチュートリアルに従い CodeGuru Reviewer を試してみます。 Tutorial: monitor source code in a GitHub repository - Amazon CodeGuru Reviewer 以下ステップにて進めていきます。
- Step 1: リポジトリのフォーク
- Step2: フォークされたリポジトリの関連付け
- Step3: コードの変更をプッシュ
- Step4: プルリクエストの作成
- Step5: 推奨事項のレビュー
- Step6: お片付け
Step1: リポジトリのフォーク
プルリクエストを作成するために、サンプルアプリケーションのリポジトリをフォークします。 自分の GitHub にフォークされます。
Step2: フォークしたリポジトリの関連付け
AWS マネジメントコンソールから CodeGuru を開き、 関連付けられたリポジトリ を選択します。 リポジトリの関連付け ボタンをクリックします。 ソースプロバイダーに GitHub を選択し、 Github に接続 ボタンをクリックします。 CodeGuru Reviewer に認可を与える画面が開くので Authorize aws-codesuite ボタンをクリックします。 Github に接続済み となるので、リポジトリの場所から amazon-codeguru-reviewer-sample-app を選び 関連付け ボタンをクリックします。 しばらくすると、ステータスが 関連付け済み となりました。 これで、 CodeGuru Reviewer によってプルリクエストの検知がされるようになります。
Step3: コードの変更をプッシュ
このあとのステップで、プルリクエストを作成するためにサンプルアプリケーションのコードを修正し、プッシュします。
まずは、フォークしたリポジトリをクローンしましょう。
※ USER_ID
部分はご自身の GitHub ユーザー ID に置き換えてください。
$ git clone https://github.com/USER_ID/amazon-codeguru-reviewer-sample-app.git
Cloning into 'amazon-codeguru-reviewer-sample-app'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (48/48), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 48 (delta 8), reused 37 (delta 5), pack-reused 0
Unpacking objects: 100% (48/48), 333.17 KiB | 670.00 KiB/s, done.
続いて dev
ブランチを作成し、チェックアウトします。
$ cd amazon-codeguru-reviewer-sample-app
$ git checkout -b dev
Switched to a new branch 'dev'
src/main/java/com/shipmentEvents/handlers/EventHandler.java
ファイルを src/main/java/com/shipmentEvents/demo/
ディレクトリにコピーします。
$ cp src/main/java/com/shipmentEvents/handlers/EventHandler.java src/main/java/com/shipmentEvents/demo/
このコピーしたファイルをコミットしてプッシュしましょう。
$ git add --all
$ git commit -m 'new demo file'
[dev 03ebbdc] new demo file
1 file changed, 174 insertions(+)
create mode 100644 src/main/java/com/shipmentEvents/demo/EventHandler.java
$ git push --set-upstream origin dev
…
* [new branch] dev -> dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
Step4: プルリクエストの作成
プッシュした変更に対するプルリクエストを作成します。 フォークしたリポジトリで New pull request ボタンをクリックします。 Dev ブランチから master ブランチへのプルリクエストを Create pull request ボタンをクリックして作成します。 そのまま Create pull request ボタンをクリック。 プルリクエストが作成されました。
Step5: 推奨事項のレビュー
AWS マネジメントコンソールで CodeGuru を開き左ペインから コードレビュー を選択します。 すると、コードレビューが 1 件 保留中 になっています。 しばらく経つとステータスが 完了 となるので、 GitHub で先ほど作成したプルリクエストを見てみましょう。 プルリクエストを見てみると、いくつかコメントが記載されています。 例えば、以下のコメントを見ると AWS Lambda のパフォーマンスを上げるための改善事項とベストプラクティスへのリンクが記載されていました。 また、各レビュー内容に対して 👍もしくは 👎のリアクションをすることで、 CodeGuru の改善に繋げるためのフィードバックをすることが可能です。 CodeGuru Reviewer はこのフィードバックを利用し、コード検出器の品質を繰り返し改善します。
Step6: お片付け
CodeGuru Reviewer の動作が確認できたので、お片付けしましょう。 まずは、フォークしたリポジトリの削除をします。 リポジトリで Settings → Delete this repository で削除ができます。 次は、クローンしたリポジトリの削除です。
$ rm -rf amazon-codeguru-reviewer-sample-app
最後に CodeGuru との関連付けを解除します。 AWS マネジメントコンソールの CodeGuru のページから関連付け済みのリポジトリを選択して アクション → リポジトリの関連付けを解除する をクリックして解除してください。 これでお片付け完了です!
おわりに
プルリクエストを作るだけで、自動でコードレビューをしてくれるなんて夢のようなサービスですね。 実際の現場で使ってみて色々と試していきたいです!
また、この内容は 2020/7/8(水) 18:00 よりYouTube にて配信する「30分でわかる AWS UPDATE!」で取り上げますので、是非ご覧ください! チャンネル登録よろしくおねがいします!! サーバーワークス チャンネル - YouTube