結論
- New Relic公式ドキュメント、及びnewrelic-lambdaコマンドではNode.js18のサポートされていない。(現時点2023/04)
- しかし、Node.18へのLambda Layerを手動追加できるので、その手順を示します。
対象者
AWS LambdaでNode.js 18を利用しており、New Relic Lambda Layerを使って計測したい方を対象としています。
New Relicを知っていることを前提に、Lambda Layerから解説します。
目次
- New Relic Lambda Layerとは
- newrelic-lambdaコマンドの実装と言語のサポート状況
- Node.js 18のLambda Layer手動設定方法の解説
- 動作確認
1. New Relic Lambda Layerとは
New Relic Lambda Layerは、AWS Lambdaに可観測性を実装するための手段です。
通常、AWS Lambdaでモニタリングをする場合はCloud Watch Metricsを使って実行回数(invocations)や実行時間(duration)などを把握します。これらに加えてNew Relic Lambda Layerは詳細な持続時間、コールドスタート、例外、トレースバックなどのパフォーマンスデータ計測し、サーバーレスの実態をより理解することができます。
2.newrelic-lambdaコマンドの実装と言語のサポート状況
通常、AWS LambdaへNew Relic Lambda Layer実装するときは、専用のCLIコマンドであるnewrelic-lambdaコマンドを用いて簡単に導入できます。
現時点(2023/04)でサポートされている言語のランタイムは下記の通りです。
サポートされているランタイムであれば、すぐにでも導入が可能です。
しかし、本記事の主題であるNodejs18.xなどはドキュメント上サポートされておらず、またnewrelic-lambdaコマンドでもサポートされていないためかインストールできませんでした。その時の結果は下記の通りでした。。
「そうか、そうだよな。公式ドキュメントにサポートとして記載のないNode.js18は対応してないよな。」とあきらめかけていたそのとき、
※https://layers.newrelic-external.com/
「いや、いや、いや! あるやんけっ!!!」
もしや手動で実装したら動くのでは..?と思い、試してみました。
3.Node.js 18のLambda Layer手動設定方法の解説
0 Roleの設定(secretsmanager:GetSecretValue)
New Relic Lamnda Layerはsecret managerへアクセスするようなので、権限を付与しておきます。
正確に絞っても良いかもしれませんが、今回はサクッとやりたいので、用意されている「SecretsManagerReadWrite」を付与します。
1 Lambda Layerのarnをコピーする
先ほどのサイトからNode.js 18用のARNをコピーします。
https://layers.newrelic-external.com/
「Copy to clipboard」でコピーします。
今回は「arn:aws:lambda:ap-northeast-1:451483290750:layer:NewRelicNodeJS18X:23」を使います。
2 手動でLambda Layerを追加する
「ARNを指定」に先ほどのARNをペーストし「検証」をクリック。その後「追加」ボタンで追加しましょう。
3 ハンドラー設定の変更
デフォルトのハンドラーは「index.handler」と設定されていますが、「newrelic-lambda-wrapper.handler」へ変更し「保存」します。
4 環境変数の設定
NEW_RELIC_ACCOUNT_ID
NEW_RELIC_LAMBDA_HANDLER
NEW_RELIC_LAMBDA_EXTENSION_ENABLED
NEW_RELIC_EXTENSION_SEND_FUNCTION_LOGS
NEW_RELIC_DISTRIBUTED_TRACING_ENABLED
5 Lambdaを実行し、New Relic上で確認する
「invocations」から実行時のトレースデータを参照できます。
と、このような流れで、newrelic-lambdaコマンドではなく、手動でインストールし動作を確認してみました。再掲になりますが、公式ドキュメントにNode.js18の要件の記載が無い以上、サポート問い合わせはできなさそうなので、いつかサポートされることをお待ちしております。