機械学習でコードレビューするAmazon CodeGuruでPythonがサポートされたので試してみた

# はじめに
この記事は [ハンズラボ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/handslab) 22日目の記事です。

こんにちは、@sr-mtmtです。年の瀬ですね。
2020年に買ったものの中でお気に入りは [絶品レンジでパスタ](https://hands.net/goods/4901221162200/) でした。
洗濯機がぐるぐるしてるところを見るのが好きな人は、この商品でレンジの中のヴォルケーノを見つめるのも好きなことでしょう。

さて今年もAdvent Calendar、やってくぞい

# re:InventのKeynoteで気になったものを試したい
re:Inventにて、Andy Jassy氏のKeynoteで「機械学習でコードレビューするAmazon CodeGuruでPythonがサポートされた」ときいたので、試してみたいと思います。

前から気になっていたんですが、これまではJavaしか対応していなかったので、Java使っていない弊チームでは試せず。
Javaに比べるとなんとなくPythonの解析って難しそうですがどんなかんじなんでしょう。

# Amazon CodeGuruとは
Code GuruにはReviewerとProfilerとあって、Profilerの方はコストチェック、Reviewerの方はバグなどをチェックします。

今回試すのはReviewerです。

Amazon CodeGuru Reviewer は、機械学習でコード内の問題を検出し、その推奨される修正方法を提案してくれるサービスです。
コードの品質に関する問題を、次のように大きく 9 つのカテゴリで識別するらしい。

- AWS のベストプラクティス: AWS API (ポーリング、ページ区切り、など) の使用方法を修正
- 同時実行: 機能上の障害を起こしている同期不良、もしくは、パフォーマンスを低下させている過剰な同期などを検出
- デッドロック: 同時実行されるスレッド間の割り当てをチェック
- リソースリーク: リソースの処理方法 (データベース接続の解放など) を修正
- 機密情報のリーク: 個人識別情報 (ログインしているクレジットカードの詳細など) の漏洩を検出
- 一般的なコード上のバグ: Lambda 関数読み出し時にクライアントを作成していないなどの、発見しづらい問題を検出
- クローンコード: 統合することでコードの保守性を高められる可能性のある、重複コードを特定
- 入力検証: 信頼されないソースから送られる、不適当な形態の、もしくは悪意のあるデータをチェック

# やってみた
### 0. 前提

- AWSアカウントはある
- レビューしたいソースコードを含むリポジトリをGithubに持っているがCodeCommitには置いてない
- IAMなどの設定はデフォルトで問題ないリポジトリを選択

### 1. リポジトリの関連付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/baf8605f-62bd-445e-e82f-134e19bc2a75.png)

Reviewerを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/d6bd2bc4-9176-f47f-ec6a-8fc6c2b5ab87.png)
前のリリースのときの情報を完全に忘れてて別にCodeCommitからじゃなくても関連付けできることが判明。＼うれしい／
GitHub、GitHub Enterprise、Bitbucket、AWS CodeCommitの中から好きなものを選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/91f14bbc-7f75-d628-ecf8-37a6d3500928.png)
組織に紐づくリポジトリへのアクセスは矢印の「Grant」を押しておかないと許可されないので注意。
今回はお試しなので私の個人アカウントでやってますがこのあたりを丁寧に準備すれば権限細かく設定できそうなのもいいですね。

これでGithubアカウントに接続したので、さっきグレーアウトしていた「リポジトリの場所」に候補のリポジトリがわさーっと出てくるようになりました。
適当なリポジトリを選択して関連付けます。

### 2. 分析してみる
分析方法ですが2種類あります。

| コードレビュータイプ | 自動でレビューされるか                                                                                                | レビュー結果はどこで見られるか                                                                                                                                          | レビュー対象                                   | 
| :-------------------- | :--------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------- | 
| リポジトリの分析     | No<br><br>CodeGuru Reviewerのマネジメントコンソール、またはAWS CLIまたはAWS SDKを使用して分析を実行する必要があります | CodeGuru Reviewerのマネジメントコンソール、またはAWS CLIまたはAWS SDKを使用して確認する                                                                                 | ブランチ内のすべてのコード                     | 
| プルリクエスト       | Yes<br><br>リポジトリを関連付けた後、プルリクエストを行うたびに自動でコードレビューが行われます                       | CodeGuru Reviewerのマネジメントコンソール、またはAWS CLIまたはAWS SDKを使用して確認する方法の他に、リポジトリのソースプロバイダ（Githubなど）のPRコメントからも確認可能 | プルリクエストの範囲。今回変更されたコードのみ | 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/f864409e-146b-b222-f6dc-eb645cfdabd3.png)
プルリクエストがあがれば↑ここに追加されていくようです。
今はちょうどいいPRがないので「リポジトリの分析」の方でコード全体の分析をやってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/28b25831-435d-ca82-6063-a4d8c5d4d304.png)
「リポジトリの分析を作成」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/84594894-ce1a-44c3-4671-6bd0ebf3c0f7.png)
「コードとセキュリティの推奨事項」の方はさっき関連付けたリポジトリとはまた別の話になります。
別途S3にzip化したコードをアップロードして、それと関連付けた上で分析することになるので今回は「コードの推奨事項」を試したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/0b24b2e7-7489-7ecf-8856-ac96e65eaf99.png)
分析中・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/571a1a4b-1d5a-fcac-387f-b300f9dd7d95.png)
小さいリポジトリだからか数分で完了！
さて、なにが上がってくるのかな・・・？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/289b24ad-6baf-370b-d4f6-a501df88923d.png)
なんもない :joy: :joy: :joy:
いや、いいことですけどね。
寂しいのでもう少し大きいリポジトリでも試したのですがやはり何も見つかりませんでした・・・。
パフォーマンス低下とかどのくらいのことから指摘されるんだろう・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/851d4f9b-de63-7a23-06a5-8f731a8a92cd.png)
ちなみにプルリクエストの方にCodeGuruから指摘事項があった場合、こんなかんじでプルリクコメントにそのまま推奨事項が役に立つものだったかフィードバックが送れるそうです。
（公式ドキュメントの画像を拝借）

ここで指摘されてる推奨事項は
"This code might not produce accurate results if the operation returns paginated results instead of all results. Consider adding another call to check for additional results."
→ `このコードは、操作がすべての結果ではなくページ分割された結果を返す場合、正確な結果が得られない可能性があります。追加の結果をチェックするために別の呼び出しを追加することを検討してください。` (deepl翻訳)
となっていますね。AWS APIの使用方法に関する指摘かな。

### おまけ）リポジトリの関連付け解除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/2edfd8f2-a2c3-d6f2-f347-71e8fc8e865b.png)
リポジトリを紐付けっぱなしにしていると無料枠超えたときにお金がかかるので必要に応じて解除しましょう。

解除すると元には戻せないので改めて新規で関連付ける必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210788/12f7390c-2847-79ad-e616-66b1224261c8.png)

解除したリポジトリは初期表示画面からは消えるのですが、左上の「リポジトリ(3)」となっているように、完全に消えるわけではなく、
関連付けが解除されたリポジトリから確認することが可能です。（どうして）


# 料金プラン
Amazon CodeGuru がサポートされている AWS リージョンで 90 日間無料でお試し可能です。
下記は東京リージョンの場合。

### 無料枠について
リポジトリの全体の分析は、各支払者アカウントごとに毎月 30,000 行のコードの分析までが無料となります。
プルリクエストの分析は、90 日間の無料トライアルが利用可能。

### リポジトリ全体の分析	
無料利用枠以上の利用だと毎月 1,500,000 行のコードの分析までは、コード 100 行ごとに 0.50USD。
1,500,000 行以上のコードを分析した場合	コード 100 行ごとに 0.40USD。
リポジトリ全体または選択したコードブランチのソースコードを分析することができます。
選択したリポジトリまたはソースコードブランチ内のコードの全行が、リポジトリ分析の実行ごとに分析されます。

### プルリクエスト	
90 日間の無料トライアル後、コード 100 行ごとに 0.75USD。


# あとがき
思った以上に設定簡単でしたね。何かしらで詰まるかなと思って身構えてたんですがあまりにも簡単。
CodeCommit以外からも関連付けられるのが特にいいですね。
コードへの指摘事項が出てこず残念でしたが大きな問題はないのかなとちょっとほっとできました。

明日は23日目！ @fasahina さんです！

# FYI
- [[速報]機械学習でコードレビューするCodeGuruでPythonをサポートしてSecurity Detector機能が追加されました #reinvent](https://dev.classmethod.jp/articles/codeguru-support-python-and-security-detector/)
- [AWS Documentation Amazon CodeGuru User Guide](https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/getting-started-with-guru.html)
- [Amazon Code Guru 料金](https://aws.amazon.com/jp/codeguru/pricing/)