AWS LambdaをNew Relicで簡単にモニタリング！

New RelicのAWS Lambda 統合をLambda関数に導入することで、関数のパフォーマンスや、トレースを監視し、パフォーマンス劣化やエラーの原因を迅速に特定できるようになります。本記事で導入手順を紹介します！

# New Relic Lambda 統合 とは
New RelicのAWS Lambdaの統合は、Lambda レイヤーでエージェントが提供されており、関数のコードを変更することなく、関数の内部動作を詳細に可視化します。 関数にレイヤーでNew Relicのエージェントを追加すると、関数が呼び出されるたびにDuration、スループット、トレースなどの主要なパフォーマンス メトリックを取得できます。

レイヤーを使わない計装方法やコンテナ化されたLambda関数への計装方法もありますので、手順の詳細は以下公式ドキュメントをご確認ください。

https://docs.newrelic.com/jp/docs/serverless-function-monitoring/aws-lambda-monitoring/instrument-lambda-function/introduction-lambda/#method

また、対応しているLambdaのランタイムは以下になります。

- Node.js
- Python
- .NET
- Ruby
- Java

# サンプルのLambda関数をデプロイする
今回はAWSが提供しているNode.jsの[サンプル Lambda関数](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig)をデプロイして、そこにNew Relic Lambda レイヤーを計装してみます。[セットアップ手順](https://github.com/awsdocs/aws-lambda-developer-guide/blob/main/sample-apps/nodejs-apig/README.md)をご確認の上、セットアップしてください。

# New RelicのLambda レイヤーをインストールする
New Relicの管理画面の「＋ Integrations & Agents」→「Monitor your Lambda functions」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/84324a94-51e6-48e0-e475-4e7bddebdb5d.png" width="60%">

今回のサンプルはNode.jsなので「Node.js Lambda」を選択します。Python、Javaなど他の言語のLambda関数やコンテナの場合もサポートしていますので、実装にあった選択をしてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/ef745496-7826-980f-ad5c-99448fcf9d02.png" width="80%">

Lambda関数からNew Relicにデータを送るために使用するUser Keyを作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/4bb552f6-0d4f-7b11-d000-e2e70480dae2.png" width="80%">

今回はNew Relicが提供するCLIでセットアップするため、Serverless Frameworkの箇所はNoを選択、Lambda Extensionを選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/28dfd9bd-5f9e-47cb-b5d0-a9cfff2f426d.png" width="80%">

ガイドに従ってNew RelicのCLIのインストール、New RelicとAWSアカウントの連携設定を行います。AWSアカウントの連携が既に入っている場合は④のコマンドの実行は不要です。なお、AWSアカウントの連携設定については以下の記事が参考になります。

https://qiita.com/nr-mito/items/ec595a70336ceb1db84a

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/f1e2c50d-29fb-bcbb-8e53-959de6c2e3bc.png" width="80%">

実行例を以下に記載します。

```bash
pip3 install --upgrade newrelic-lambda-cli
```

```bash
export AWS_DEFAULT_REGION=ap-northeast-1
```

```bash
newrelic-lambda integrations install --nr-account-id ****** \
--nr-api-key NRAK-62*******************
```

次のステップでLambda関数にレイヤーをインストールします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/db5b623b-20d3-5d74-c6ae-e9bee4372d02.png" width="95%">

レイヤーをインストールする関数名を以下コマンドで確認します。
```bash
newrelic-lambda functions list
```

上記コマンドで確認した関数名を「Lambda function's name」の箇所に入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/b954fe57-5b96-90d3-1684-1a2706ae7b5b.png)


③のコマンドは--nr-regionの引数が足りず実行に失敗するため、「--nr-region us」を追記して実行します。

```bash
newrelic-lambda layers install \
  -f nodejs-apig-function-k0wXBMA75z3w \
  --nr-account-id ****** --nr-region us
```

Install Completeが返ってくることを確認します。

```bash
✨ Install Complete ✨
```

セットアップはこれだけで完了です。

# データを確認しよう
AWSコンソールでLambda関数にレイヤーがインストールされたことを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/0447dc76-4489-5729-0cfb-d7fd21284620.png)


Node.jsのLambda関数がES モジュールを使用している場合は、Lambdaの環境変数 NEW_RELIC_USE_ESMをtrueに設定します。今回のサンプルアプリケーションはESモジュールを使用しているため環境変数を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/5aeaaecd-0011-c45c-0490-1d145424e418.png)

AWSのサンプルアプリのフォルダ配下にあるスクリプトを実行して、API Gatewayに継続的にリクエストを送って、Lambda関数を実行します。
```bash
nodejs-apig % ./3-invoke.sh
```

New Relicの管理画面に戻って、「Test connection」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/0570c166-12a1-e544-155e-9c40bd422df8.png)

StatusがSuccessfulに変わることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/afeac220-b69e-0bb0-327d-b375b99c4f71.png)

データが取れていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/a19c6712-ed3a-213f-9e07-841411058ce6.png)

分散トレーシングも取得できています。今回のサンプルアプリではLambdaのトレースだけ確認できますが、このLambdaが他のアプリを呼んでたり、他のアプリから呼ばれている場合には分散トレースでつながるのでLambdaの他を含めた全体を追えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/e4bb97e7-44ab-6f0a-0241-8a50afa044ec.png)

とても簡単なセットアップ手順でLambda関数にレイヤーを計装して、Lambda関数のパフォーマンスやトレースのデータを取得できることを紹介しました。本記事ではNode.jsの関数で試していますが他ランタイムでも同じ手順で簡単にセットアップできますよ。ぜひ、お試しください！


# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::