【AWS】CodeGuru Profiler 触ってみた 

----------------------------------------
本記事は**[ Advent Calendar 2020 ](https://qiita.com/advent-calendar/2020/htc)**の2020/12/24分です。
※Advent Calendar 2020 へはHTCのチームメンバー5人で
毎日日替わりで投稿させていただいていますので、暇なときに覗いてください。
※HTCの紹介は[本イベント1日目の投稿](https://qiita.com/koooota/items/d5b8b036d3b6541a4f63)をご参照ください。

----------------------------------------
文系学部卒SIer新人の**かいと**です。

今回は、[前回に投稿した記事](https://qiita.com/k-u2nomiya/items/31c35a339bd8fd832a26)の続きです。
前回ではCodeGuru Reviewerをハンズオンしてみましたので、
今回はCodeGuru Profilerをハンズオンしてみます！

※以下、前回と同じ流れです（笑）

#Amazon CodeGuru とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/0fe6fdbd-ee16-4d42-2cca-1e81bffac1df.png)

[Amazon CodeGuru](https://aws.amazon.com/jp/codeguru/)は、機械学習を利用したデベロッパーツールで、コードの品質を向上し、アプリケーションの最もコストがかかっているコード行を特定するためのインテリジェントな推奨事項を提供します。（公式ドキュメントより引用）

簡単に言えば開発者がコーディング/管理者がソースの品質向上
を図ろうとする際にお助けしてくれるサービスという事です。

また、CodeGuruには**Profiler**と、**Reviewer**というサービスに分かれており（新機能としてSecurity Detectorが加わる）

- **Amazon CodeGuru Profiler** 
    - デベロッパーがアプリケーションの最もコストがかかっているコード行を見つけるだけでなく、特定の視覚化と、コードを改善してコストを節約する方法に関する推奨事項を提供します。

- **Amazon CodeGuru Reviewer** 
    - 機械学習を使用して、アプリケーション開発中に重大な問題や見つけにくいバグを特定し、コードの品質を向上します。

といった感じのサービスとなっております。
正直、テキストベースでは理解が進まないので、**「Now Go Build（今すぐ手を動かして作ろう）」**です！！
※「Now Go Build」はワーナーがKeynoteで毎年言う定番文句ｗ

#用意するもの
- AWSアカウント
- すでにデプロイ済み(予定)のJava or Pythonモジュール
- リモートリポジトリ（ローカル開発環境と繋いでるもの）
    - Bitbuket/GitHub/CodeCommit

# Amazon CodeGuru Profiler 実践!
###Step1：プロファイリンググループを作成
CodeGuru Profiler コンソール or CreateProfikingGroup API で作成できます！
※方法としては、```①JVMエージェントを使用する(推奨らしい)``` ```②コードにPlofilerを取り込む```の二択でした。
私は②で実施しました。
→詳しくはStep3で

###Step2：IAM権限付与
Plofiler Agent が使用する IAM User/Role に CodeGuru へプロファイルデータを送信するための権限を付与します。
プロファイリンググループを作成する際に、コンソール上の以下の部分で設定できます。
※私はWebサーバーに付与しているIAM Roleを指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/fd123e25-a4e4-7532-6000-99a438e081f6.png)

でいいはずなんですが、
この設定ですすむと、プロファイルデータが送られてこない現象が起きました。。。
問題はこの設定部分で、確認したところGUIで選択したRoleにうまくポリシーが付与されておりませんでした！なんで？ｗ

という事で、IAMRoleに直接ポリシーをアタッチします！

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codeguru-profiler:ConfigureAgent",
                "codeguru-profiler:PostAgentProfile"
            ],
            "Resource": "arn:aws:codeguru-profiler:<region>:<accountID>:profilingGroup/<profilingGroupName>"
        }
    ]
}
```
こんな感じ。これで安心。

###Step3：アプリでプロファイラーを開始
Java アプリケーションを更新して、データを収集して CodeGuru プロファイラーに送信するには

- プロファイラーエージェント JAR に依存関係を追加します。

```pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
    <repositories>
        <repository>
            <id>codeguru-profiler</id>
            <name>codeguru-profiler</name>
            <url>https://d1osg35nybn3tt.cloudfront.net</url>
        </repository>
    </repositories>
    ... 
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>codeguru-profiler-java-agent</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>
...
</project> 
```


- アプリケーションの main 関数を含む Java ファイルに以下を追加

```~.java
import software.amazon.codeguruprofilerjavaagent.Profiler;
//省略
//main関数に以下を追加
new Profiler.Builder()
  .profilingGroupName("2020bc-kokoda")
  .awsCredentialsProvider(myAwsCredentialsProvider) // optional
  .withHeapSummary(true) // optional - to start without heap profiling set to false or remove line
  .build().start();
```

###Step4：プロファイラーエージェントをスタート！
私の場合は、CodepipelineでCI/CD組んでいたので、リモートリポジトリ(Bitbucket)にpushするのみでした。

###Step5：CodeGuru Profiler コンソールにて確認！
※稼働中のアプリケーションのスタットレースのサンプリングを集約したものだが、
　スタート後のサンプリングには最大15分かかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691623/0a8345c2-e600-9330-3715-0f4fa0be5853.png)

こんな感じ。ビューの見方はいろいろあると思うので、個人に任せます！
（いろいろいじると面白い！）

以上、CodeGuru Profiler でした！

# まとめ
CodeGuru Profilerを触ってみて思う点は以下
・とにかくjava以外の言語（ようやくPythonだけできるようになったけど）を増やしてほしい。。。
・このサンプリングは継続的に収集でき、柔軟な可視化、対応ができそう！
てな感じです。

このサービスをどのようにワークフローに落とし込んで、開発者・管理者の負担を手軽に減らすことができるのか
今後は考えてみたいと思います！

以上です！