Amazon Web Services ブログ

最も高価なコード行を見つける – Amazon CodeGuru が一般提供開始

新しいアプリケーションを本番環境に導入し、それらの成長と発展に合わせてコードベースを維持し、同時に運用上の問題に対応するのはとても困難です。このため、チームの構築方法、適用方法、ソフトウェア配信パイプラインの安全な自動化方法について、多くのアイデアを見つけることができます。

昨年の re:Invent では、プレビューで Amazon CodeGuru を導入しました。これは機械学習を利用したデベロッパーツールで、アプリケーションの改善と、ランタイムデータに基づく自動コードレビューやパフォーマンスの推奨による問題のトラブルシューティングに役立ちます。 過去数か月の間に、より費用対効果の高い料金モデルBitbucket リポジトリのサポートコマンドラインスイッチを使用してプロファイリングエージェントを起動する機能など、多くの改善が行われ、コードを変更する必要がなくなりました。アプリケーションを実行するか、依存関係を追加して、エージェントを実行します。

CodeGuru は次の 2 つの方法で使用できます。

  • CodeGuru Reviewer は、プログラム分析と機械学習を使用して、デベロッパーが見つけ難い潜在的な欠陥を検出し、Java コードの修正を行うことを推奨します。コードは、GitHub (現 GitHub Enterprise)、AWS CodeCommit、または Bitbucket リポジトリに保存できます。CodeGuru Reviewer に関連付けられているリポジトリでプルリクエストを送信すると、コードの改善方法に関する推奨事項が提供されます。各プルリクエストはコードレビューに対応し、各コードレビューにはプルリクエストのコメントとして表示される複数の推奨事項を含めることができます。
  • CodeGuru Profiler は、インタラクティブな視覚化と推奨事項を提供し、アプリケーションのパフォーマンスを微調整し、ライブアプリケーションのランタイムデータを使用して運用上の問題をトラブルシューティングするのに役立ちます。現在、Java、Scala、Kotlin、Groovy、Jython、JRuby、Clojure などの Java 仮想マシン (JVM) 言語で記述されたアプリケーションをサポートしています。CodeGuru Profiler は、CPU 使用率や導入されたレイテンシーの観点から最も高価なコード行を見つけ、効率を改善してボトルネックを解消する方法を提案します。本番環境で CodeGuru Profiler を使用できます。また、本番環境前など、有意義なワークロードでアプリケーションをテストする場合にも使用できます。

本日、Amazon CodeGuru が一般提供され、多くの新機能が追加されました。

CodeGuru Reviewer には、次のものが含まれています。

  • Github Enterprise のサポート – プルリクエストをスキャンし、Github Enterprise オンプレミスリポジトリのソースコードに対する推奨事項を、問題の原因と修正方法に関する説明とともに入手できます。
  • 欠陥を解決してコードを改善するための新しいタイプの推奨事項 – たとえば、入力検証をチェックして、セキュリティとパフォーマンスを損なう可能性のある問題を回避し、同じことを行うコードのコピーを複数個見つけます。

CodeGuru Profiler には、次の新機能があります。

  • 異常検出 – CPU 時間またはレイテンシーの割合が最も高いメソッドについて、アプリケーションプロファイルの異常を自動的に検出します。
  • Lambda 関数のサポートAmazon Elastic Compute Cloud (EC2) でホストされているアプリケーション、および Amazon ECSAmazon Elastic Kubernetes Service で実行されているコンテナ化されたアプリケーション (AWS Fargate を使用するアプリケーションを含む) と同様に、AWS Lambda 関数をプロファイルできるようになりました。
  • 推奨レポートの問題に関するコスト – 推奨事項には、問題の内容、CPU への影響、および問題の修正方法を説明する実用的な解決手順が含まれています。アクティビティの優先順位を上げるのに役立つように、推奨事項を適用することで導入される節約の見積もりを入手しました。
  • マイコードに色を付ける – 視覚化では、独自のコードを簡単に見つけられるように、使用するフレームワークや他のライブラリとは異なる方法でメソッドに色を付けています。
  • CloudWatch のメトリックスとアラート – 発見された効率問題を追跡および監視する。

これらの新機能のいくつかを実際に見てみましょう。

Lambda 関数で CodeGuru Reviewer を使用する
GitHub アカウントで新しいリポジトリを作成し、今は空のままにします。 ローカルでは、Java 11 ランタイムを使用して Lambda 関数を開発していますが、Git リポジトリを初期化し、README.md ファイルのみを master ブランチに追加します。このようにして、すべてのコードをプルリクエストとして後で追加し、CodeGuru によるコードレビューを行うことができます。

git init
git add README.md
git commit -m "First commit"

次に、GitHub リポジトリをオリジンとして追加し、変更を新しいリポジトリにプッシュします。

git remote add origin https://github.com/<my-user-id>/amazon-codeguru-sample-lambda-function.git
git push -u origin master

CodeGuru コンソールでリポジトリを関連付けます。

リポジトリが関連付けられたら、新しい dev ブランチを作成し、すべてのローカルファイルを追加して、リモートでプッシュします。

git checkout -b dev
git add .
git commit -m "Code added to the dev branch"
git push --set-upstream origin dev

GitHub コンソールで、masterdev の 2 つのブランチの変更を比較して、新しいプルリクエストを開きます。プルリクエストがマージできることを確認してから作成します。

リポジトリは CodeGuru に関連付けられているため、CodeGuru コンソールの [コードレビュー] セクションでコードレビューが [保留中] と表示されます。

数分後、コードレビューのステータスは [完了] になり、CodeGuru レビュー担当者はプルリクエストが作成されたのと同じ GitHub ページで推奨を発行します。

さて。 関数呼び出しメソッド内に Amazon DynamoDB サービスオブジェクトを作成しています。この方法は、呼び出し間で再利用できません。効率的ではありませんね。

Lambda 関数のパフォーマンスを向上させるために、CodeGuru の推奨事項通り、DynamoDB サービスオブジェクトの宣言を Java アプリケーションオブジェクトの static final 属性に移動し、関数の初期化中に 1 回だけインスタンス化されるようにします。次に、推奨事項のリンク通りに、Lambda 関数を操作するためのベストプラクティスを学びます。

Lambda 関数で CodeGuru Profiler を使用する
CodeGuru コンソールで、MyServerlessApp-Development プロファイリンググループを作成し、Lambda コンピューティングプラットフォームを選択します。

次に、このプロファイリンググループにデータを送信するために Lambda 関数のアクセス許可で使用される AWS Identity and Access Management (IAM) ロールを付与します。

これで、コンソールから Lambda 関数をプロファイリングするために必要なすべての情報が得られます。プロファイリングエージェントを構成するには、いくつかの環境変数を使用します。

  • AWS_CODEGURU_PROFILER_GROUP_ARN は、使用するプロファイリンググループの ARN を指定します。
  • AWS_CODEGURU_PROFILER_ENABLED は、プロファイリングを有効 (TRUE) または無効 (FALSE) にします。

(MavenGradle の) 指示通りに依存関係を追加し、ビルドにプロファイリングエージェントを含めます。次に、Lambda 関数のコードを更新して、エージェントが提供する LambdaProfiler 内でハンドラー関数をラップします。

負荷を発生させるために、Amazon API Gateway をトリガーとして使用して関数を呼び出すいくつかのスクリプトを開始します。数分後、プロファイリンググループは、Lambda 関数の実行時の動作を説明する視覚化を示し始めます。

たとえば、関数のさまざまなメソッドで費やされた CPU 時間を確認できます。下部には、エントリポイントのメソッドがあります。上にスクロールすると、スタックトレースでより深く呼び出されるメソッドが見つかります。LambdaRuntimeClient メソッドを右クリックして非表示にし、コードに焦点を当てます。 私のメソッドは、AWS SDK for Java など、使用しているパッケージのメソッドとは異なる色で表示されます。

私は主に、Lambda プラットフォームによって呼び出されたハンドラーメソッドで起こる事態に関心があります。ハンドラーメソッドを選択すると、視覚化の新しい「ベース」になります。

各メソッドにポインターを移動すると、選択した時間枠の間にプロファイリングエージェントが経験した負荷に基づいて、本番環境でコードの特定部分を実行するための年間コストの見積もりなど、詳細情報が得られます。私の場合、ハンドラー関数のコストは 6 USD と推定されます。上記の 2 つの主な機能を選択すると、見積もりがそれぞれ 3 USD になります。コスト見積もりは、Lambda 関数、EC2 インスタンス、コンテナ化されたアプリケーションで実行されるコードに対して機能します。

同様に、コードのメソッド内で費やされた時間を把握するために、レイテンシーを視覚化できます。私は Lambda 関数ハンドラーメソッドを選択したままにし、自分の制御下にある場所にドリルダウンして、最も時間を費やしている場所を確認します。

CodeGuru Profiler は、収集されたデータに基づく推奨も提供しています。暗号化の管理に多くの時間 (4% 以上) を費やしています。このブログ記事に記載されている、オープンソースの Amazon Corretto Crypto Provider などのより効率的な暗号プロバイダーを使用できます。これにより、所要時間が予想時間、プロファイルの約 1% に短縮されます。

最後に、プロファイリンググループを編集して通知を有効にします。このようにして、CodeGuru がアプリケーションのプロファイルで異常を検出した場合、1 つ以上の Amazon Simple Notification Service (SNS) トピックで通知されます。

今すぐ利用可能
Amazon CodeGuru は現在 10 ヵ所のリージョンでご利用いただけます。今後数か月でさらにリージョンを追加するよう取り組んでいます。リージョンごとの利用の可否については、AWS リージョン表をご覧ください。

CodeGuru は、インテリジェントな推奨を提供する自動化されたコードレビュー担当者とアプリケーションプロファイラーにより、アプリケーションコードを改善し、コンピューティングとインフラストラクチャにおけるコストを削減できます。ランタイムデータに基づく視覚化を使用すると、アプリケーションで最も高価なコード行をすばやく見つけることができます。CodeGuru を使用すると、使用した分に対してのみお支払いいただきます。料金は、CodeGuru Reviewer によって分析されたコード行と、CodeGuru Profiler のサンプリング時間に基づいています。

詳細については、ドキュメントをご覧ください

Danilo