Lambda Extensionに対応した、New Relic サーバーレスモニタリングを試してみた

2020.10.21

こんにちは、New Relicの田中です。 先日AWSから発表されたLambda Extensions (プレビュー版)、早速こちらの記事で解説されています。

【新機能】Lambda Extensions(プレビュー版)がリリースされました!

New Relicのサーバーレスモニタリング for Lambdaも対応済みですので、早速試してみました。

なにがうれしいのか?

ユーザー目線では、セットアップが楽になる点が挙げられます。内部の仕組みを考えると、いままでラムダ関数本体の中で設定していた可観測性のための仕組みを、AWSが提供するラムダ関数本体と切り離した枠組み(Runtime)の中で提供できることになります。

(図はNew Relicのドキュメントより引用)

Runtimeをライフサイクルの視点でとらえると、関数本体が実行される前にRuntimeの初期化が完了しており、関数本体が終了してからRuntimeが終了します。

(図は公式ブログより引用)

このライフサイクルにより、New Relic Extensionは関数が開始するときにはデータを収集するための準備を完了でき、関数が終了しすべてのデータを収集し終わってからそのデータを送信する機会を得られます。

セットアップ

それでは実際にセットアップしてみましょう。ドキュメントはこちらにありますが、まだLambda Extensionsがプレビュー版ということもあるので、ひととおり手順を試した結果をまとめてみます。

まずインストールを行うマシンで次の準備をしておきます。

また操作対象となるNew RelicアカウントのAdminユーザーで操作を行うのが確実です。また、AWS CLI v2でログインするユーザーはAWSアカウントの次のリソースを作成できる権限が必要です。

  • IAM リソース
  • Secret Managerのシークレット
  • Lambda
  • CloudFormation stack
  • S3 バケット

準備できたら作業を始めます。作業は、まずAWSアカウントとNew Relicアカウントのリンクを行います。これはAWSのリージョンごとに実行する必要があります。New RelicのAWS Integraionの仕組みを利用しています。既存のものがある場合、既存のものを指定してもよいですし、次のコマンドで新規に作ることもできます。以下のnewrelic-lambdaコマンドを実行しますが、全て大文字のパラメーターは実際の値で置き換える必要があります。

newrelic-lambda integrations install --nr-account-id YOUR_NR_ACCOUNT_ID \
    --linked-account-name YOUR_LINKED_ACCOUNT_NAME \
    --nr-api-key YOUR_NR_API_KEY \
    --enable-license-key-secret \
    --aws-region YOUR_AWS_REGION

パラメーターに指定すべき値は以下の通りです。

  • YOUR_NR_ACCOUNT_ID: New RelicアカウントID
  • YOUR_LINKED_ACCOUNT_NAME: AWS Integrationを作成するときに指定する名前。既存のIntegrationの名前を指定すると既存のものを利用し、新規に名前をつけると新規に作成します。
  • YOUR_NR_API_KEY: New Relic Personal API キー
  • YOUR_AWS_REGION: ap-northeast-1など対象のLambdaが存在するリージョン

このコマンドが無事成功すると、New Relic Oneの画面で、Infrastructure > AWSのページにYOUR_LINKED_ACCOUNT_NAMEで指定した名前のアカウント連携が表示され、Lambdaが対象として表示されているはずです。

次はLambda関数にExtensionを追加し、計装を追加します。これはLambda関数ごとにセットアップが必要です。ドキュメントでは「newrelic-lambda layers」コマンドを実行することでインストールしていますが、もしServerless Frameworkなどを利用してLamdba関数を開発している場合は、このコマンドではなくServerless Framework側に必要な設定を追加するのがよいでしょう。この方法は後述します。逆に「newrelic-lambda layers」コマンドは、検証用にデフォルトで作ったLambda関数に対してセットアップするときに利用するのがよいでしょう。

まずは、サンプルで作ったデフォルトのLambda関数をセットアップしてみます。このとき、後述の理由によりランタイムはnode.jsかPython 3を選択してください。次に、以下のコマンドの「FUNCTION_NAME」を作成した関数名に置き換えて実行します。

newrelic-lambda layers install --nr-account-id YOUR_NR_ACCOUNT_ID --function FUNCTION_NAME --upgrade --aws-region YOUR_AWS_REGION

現時点では、このコマンドだけでは不十分ですので注意してください。次にLambda関数の環境変数にNEW_RELIC_LAMBDA_EXTENSION_ENABLED=trueを追加します(値は空文字以外であれば任意で可)。このとき、先程のlayers installコマンドで必須の環境変数が追加されているため、それを消さないようにしてください。 さらに、Lambda関数の実行ロールにSecret ManagerのGetSecretValueを実行する権限を追加します。リソースまで限定したい場合は、AWS Integrationのインストール時にSecret Managerに作成されたSecretのARNを指定してください。これを忘れるとLambda関数の実行時にエラーメッセージがでます。

ここまでセットアップすると、AWS Console上では次のように見えています。

そして、Consoleから実行できるテストでLambda関数を起動すると、New Relicで計測が始まります。 New Relic OneのEntity ExploreでLambda Functionを開いたとき、「Instrumented」がtrueになっていれば計測できています。

関数名をクリックするとこのように表示されます。

計測ができていない場合でも、AWS IntegrationはCloudWatchの情報を表示するので関数名とCloudWatchのメトリクスは表示されます。このとき、関数のSummaryを開くとこのようなメッセージが表示されるので区別がつきます。

検証用にデフォルトのLambda関数で計測できたら、実際のLambda関数でも計測できるようにServerless Frameworkを使う場合を試してみます。この場合、New Relic Lambda Extensionのリポジトリにサンプルコードが提供されているのでそれを参考にするのがよいでしょう。必要な設定はおおよそ以下の通りで、template.yamlをみるとほぼわかります。

  • HandlerをNew Relic Extensionが提供するハンドラーに変更する
  • 環境変数に、NEW_RELIC_ACCOUNT_IDNEW_RELIC_LAMBDA_HANDLERNEW_RELIC_LAMBDA_EXTENSION_ENABLEDを追加する。NEW_RELIC_LAMBDA_HANDLERにはもともとのハンドラー名を指定する。(一部の言語は追加の環境変数が必要)
  • LayersにインストールするNew Relic Extensionを指定する
  • PoliciesにSecretManager GetSecretValueを実行する権限を追加する
  • Log Groupを追加する

インストールするLayerのARNはこのサイトで検索することができます。しかし、実際にアクセスすると次のようにnodejsとPythonしかないように見えます。

.NET、Java、Goについては「NewRelicLambdaExtension」とあるLayerを利用するので、このARNを選択してください。そして、まだnewrelic-lambda layers installコマンドがこのレイヤーの選択、および環境変数やハンドラーの違いに対応していないため、これらの言語ではコマンドを利用してのインストールがまだできません。この問題への対応はすでにmasterにマージ済みのようですので、CLIの次のリリースではコマンドからインストールできるかもしれません。

また、これらの3つの言語については、計測を行うためのコードをLambda関数本体にも挿入する必要があります。これは、node.jsやPythonでも以前必要だった方法です。詳細はそれぞれのexampleコードを見てください。また、コード編集が必要なくなった、node.jsやPythonでもカスタムイベントやメトリクスなど追加の情報を送信するために、AgentのAPIを利用できます。こちらもexampleコードに利用例がのっています。

New Relic Lambda ExtensionはGitHubでソースが公開されています。Lambda Extensionの利用例として読んで見るのも面白いのではないでしょうか。