組織がAWS Lambdaを使用して Function-as-a-Service (FaaS) アーキテクチャに移行すると、シームレスで効率的なユーザーエクスペリエンスを実現するために、関数のパフォーマンスを理解して最適化することが重要になります。 各 Lambda 呼び出しは、潜在的なボトルネックまたは改善の機会を表します。
New RelicのAWS Lambda向けインストゥルメンテーションは、関数の内部動作を詳細に可視化します。 関数に New Relic エージェントを追加すると、関数が呼び出されるたびに New Relic も呼び出されます。 期間、コールド スタート、例外、トレースバックなどの主要なパフォーマンス メトリックをインサイトで取得できます。
このドキュメントでは、 New Relicの Lambda 監視アーキテクチャについて説明し、 AWSとNew Relicアカウントをリンクする手順を説明します。 機能を利用する前にアカウントをリンクする必要があります。
Lambda インストゥルメンテーションの仕組み
これらは、 を使用したAWS Lambda インストゥルメンテーションの重要な要素です。New Relic
あなたの関数: あなたの関数はあなたが理解したいコードです。 いつエラーが発生したのか、なぜ遅いのか、どのくらいの頻度で呼び出されるのかを知りたいのです。
New Relicエージェントまたは SDK : 関数が記述されている言語に応じて、 New Relic異なるエージェントまたは SDK を提供します。 彼らの仕事は、実際にコードを監視することです。 関数呼び出しの継続時間を測定し、発生したエラーを記録し、ソース イベントの詳細と関数の応答を記録します。 これを行うには、Lambda 呼び出しハンドラー関数をラップする必要があります。
New Relic Lambda 拡張機能: 関数にNew Relic Lambda 拡張機能を組み込むと、コードと一緒に Lambda 実行環境内で実行されます。 エージェントが収集したテレメトリを強化し、 New Relicのバックエンドにバッチで送信します。 関数のログを New Relic に送信することもできます。 New Relicで関数を監視するために Lambda 拡張機能は必要ありません。
配送方法を選択してください
New Relic AWS Lambdaテレメトリを出荷する方法は 3 つあります。 どの配送方法を選択するかは、データのニーズによって異なります。
コスト: AWS Lambdaで計画する最もコスト効率の高い方法は、Lambda 拡張機能を含むいずれかのレイヤーを使用することです。 デフォルトでは、拡張機能は AWS CloudWatch にデータを送信しません。
信頼性: データは CloudWatch 経由でのみ送信できます。 これを行うには、New Relic Lambda 拡張機能を無効にします。 つまり、Lambda 関数は軽量になり、呼び出されたときに追加のプロセスが実行されなくなります。 この場合、ログとペイロードは拡張機能ではなく CloudWatch を介して New Relic に送信されます。
両方の長所を活かす: AWS CloudWatch をフォールバックとして拡張機能と併用すると、コストを抑えながら、拡張機能に問題が発生した場合にフェイルセーフを提供できます。
インストゥルメント ドキュメントの各メソッドを使用して Lambda 関数を計算 する方法を説明します。
あなたが始める前に
Lambda レイヤーを使用してサーバーレス監視を有効にする前に、次のものが必要です。
。
IAMリソース、マネージドシークレット、Lambdasを作成するパーミッションを持つAWSアカウント。また、CloudFormationスタックやS3バケットを作成するための権限も必要です。
次に、以下の手順を完了する必要があります。
aws configure
を使用してAWS CLI v2構成をインストールします。 AWS アクセスキー ID と AWS シークレットアクセスキーが必要になります。Pythonバージョン 3.3 以降をインストールします。
newrelic-lambda
CLI をインストールします。 インストールするには、次のコマンドを実行します。bash$pip3 install newrelic-lambda-cliデフォルトでは、AWS 管理ポリシー
ReadOnlyAccess
を使用します。 これにより、インフラストラクチャ インテグレーションは、Lambda 関数と CloudWatch メトリックだけでなく、アカウント内のすべてのリソースを確認できるようになります。 New Relicではこのデフォルトを推奨していますが、サードパーティのインテグレーションに対して厳格なセキュリティ体制を好む組織もあることを理解しています。 New Relic のアクセスを制限する場合は、IAM ロールに最低限以下の権限を付与できます。
Resource: "*" Action: - "cloudwatch:GetMetricStatistics" - "cloudwatch:ListMetrics" - "cloudwatch:GetMetricData" - "lambda:GetAccountSettings" - "lambda:ListFunctions" - "lambda:ListAliases" - "lambda:ListTags" - "lambda:ListEventSourceMappings"
- CLI を実行する前に、AWS で New Relic に最低限以下の権限を付与する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CLIAccessPolicy", "Action": [ "cloudformation:CreateChangeSet", "cloudformation:CreateStack", "cloudformation:DescribeStacks", "cloudformation:ExecuteChangeSet", "iam:AttachRolePolicy", "iam:CreateRole", "iam:GetRole", "iam:PassRole", "lambda:AddPermission", "lambda:CreateFunction", "lambda:GetFunction", "logs:DeleteSubscriptionFilter", "logs:DescribeSubscriptionFilters", "logs:PutSubscriptionFilter", "s3:GetObject", "serverlessrepo:CreateCloudFormationChangeSet", "secretsmanager:CreateSecret" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "NRLogAccessPolicy", "Effect": "Allow", "Action": [ "serverlessrepo:CreateCloudFormationTemplate", "serverlessrepo:GetCloudFormationTemplate" ], "Resource": "arn:aws:serverlessrepo:us-east-1:463657938898:applications/NewRelic-log-ingestion" } ]}
CLI について詳しく知りたい場合は、 CLI リポジトリをご覧ください。
推奨されるAWS Lambda言語のランタイム
以下のランタイムをお勧めします。
- Node.js:
nodejs16.x
、nodejs18.x
、nodejs20.x
- Python:
python3.8
、python3.9
、python3.10
、python3.11
、python3.12
- Go:
provided.al2
、provided.al2023
- Java:
java8.al2
、java11
、java17
、java21
- Ruby :
ruby3.2
,ruby3.3
- .NET:
dotnet6
、dotnet8
コストを考慮する
AWS Lambda のサーバーレス監視を有効にすると、Amazon Web Services の料金が発生する可能性があります。 お客様の Lambda データを当社に報告する newrelic-log-ingestion
Lambda 関数はサードパーティサービスとみなされます。このサービスの使用によって発生するAWS料金はお客様の責任となります。
New RelicLambda Layers にバンドルされている newrelic-lambda-extension を使用すると、CloudWatch および newrelic-log-ingestion 関数を介したログとテレメトリーの送信を回避できます。オブザーバビリティデータの高可用性を必要とする機能の CloudWatch フォールバック メソッドとして newrelic-log-ingestion 関数を設定することもできます。
Lambda監視をインストールする
Lambda 監視には以下が含まれます:
- AWSCloudWatchメトリクスを取り込み、 内でエンティティ合成を実行するための インテグレーション。New Relic
- 「サーバーレス」モードで動作する New Relic エージェント。New Relic Lambda レイヤーまたはデプロイメントに含まれています。
- 「インストゥルメントされた」ペイロードを送信し、オプションでNew Relic newrelic--logingestion 関数または Extension を 介して にログを送信する方法。これもNew Relic Lambda Layers に含まれています。
AWSとNew Relicアカウントをリンクする
New Relicで「インストゥルメントされた」Lambda関数のテレメトリーを受け取る前に、 AWSアカウントをNew Relicにリンクする必要があります。 アカウントをリンクすると、 New RelicにAWSアカウントのインベントリを作成し、Lambda 関数の CloudWatch メトリックを自動的に収集する権限が付与されます。 アカウントをリンクすると、 AWSアカウントのリソースがエンティティ エクスプローラーにエンティティとして表示されます。 Lambda関数 エンティティはサーバーレス機能ビューにあります。
AWSメトリクスストリーム統合をセットアップする (推奨)
New Relic Lambda関数を監視するには、 New RelicとAWSの間の統合をセットアップする必要があります。 レイテンシを削減し、ポーリング リクエストのスロットルを回避するには、メトリクス ストリームを使用することをお勧めします。
とのAPI ポーリング統合をセットアップするAWS
メトリクス Streams インテグレーションを使用していない場合は、代わりにAPIポーリング インテグレーションをセットアップすることを選択できます。 デフォルトでは、Lambda サービスが有効になっているAPIポーリング統合は、CloudWatchメトリクスに対して 5 分ごとにポーリングを行います。
newrelic-lambda-cliを使用してAPIポーリング統合をセットアップすることはできますが、メトリクス Streams 統合はセットアップできません。
$newrelic-lambda integrations install --nr-account-id YOUR_NR_ACCOUNT_ID \>--nr-api-key YOUR_NEW_RELIC_USER_KEY
統合インストール コマンドの 1 つのステップで、 AWS Secrets Managerに NEW_RELIC_LICENSE_KEY
シークレットが作成され、セキュリティが向上します。 これは、他のオプションやフラグとともに、 --disable-license-key-secret
フラグを使用して構成できます。
Lambda関数を計算
Lambda関数にインストゥルメンテーションを追加するには、いくつかの方法があります。 「コード変更なし」のインストゥルメンテーションには、 New Relicレイヤーを使用します。 レイヤーを Lambda に直接追加することも、 dockerfile に含めることもできます。 拡張レイヤーを除く各レイヤーには、エージェント、ハンドラー ラッパー、およびペイロードとログの配布用の拡張機能が含まれます。
newrelic-lambda-cli は、 New Relic Lambda レイヤーを追加する最も迅速で簡単な方法です。 CI/CD よりもテストに使用されることが多いです。
New RelicCI/CD既存の パイプライン経由で レイヤーを追加するには、 サーバーレス フレームワーク プラグイン と SAM および Terraform の例を用意しています。
パフォーマンスを向上させるため、またはNew Relic 関数のコードとより緊密に統合するために、 除くすべてのランタイムに レイヤーレス インストゥルメンテーション Rubyを使用することもできます。
Lambda関数を設定する
関数をインストゥルメントした後、 AWSコンソールで設定が正しいことを確認します。
実行時により一般的に使用される環境変数については、次の手順を参照してください。
環境変数
CLI を使用してNew Relicの Lambda レイヤーをセットアップすると、環境変数が自動的に構成されます。 デフォルト設定の一部を変更し、監視ニーズに合った環境変数を使用して Lambda 関数を構成することもできます。 ランタイムを選択して、利用可能な環境変数とデフォルト設定の推奨事項を確認してください。
サンプル関数をお試しください
New Relicの Lambda レイヤーをインストゥルメントした後は、サンプル関数を試してみることを強くお勧めします。 これらの実用的な例は、独自のサーバーレス機能を開始するための出発点として使用する必要があります。 これらの例を使用すると、 New Relic Lambda レイヤーやアカウント リンクのテストに慣れることができ、独自のインストゥルメンテーションのリファレンスとしても使用できます。 各例では、権限の追加、ハンドラーをラップするためのランタイム固有の手法、CloudWatch での関数ログ保持の管理などを示します。
Lambda 関数を管理およびデプロイする方法は多数ありますが、この例ではAWS CloudFormation というメカニズムを使用しています。
私たちの例は、New Relic Lambda Extension とともに、このGitHub リポジトリで公開されています。 New Relic がサポートする Lambda ランタイムごとに 1 つあります。
また、ディストリビューティッド(分散)トレーシングの例で、ディストリビューティッド(分散)トレーシングを非自明なサーバーレス アプリケーションに組み込む方法を学ぶこともできます。 これは、Node、Python、 Ruby 、Java 関数を使用して、Lambda 関数を呼び出す可能性のある 2 つの一般的なサービスである SQS と SNS の手動トレース伝播を示しています。
ヒント
手動でテストする場合、テレメトリーデータが遅延する可能性があります。 バッファリングされたテレメトリが配信されるように、関数を再度呼び出す前に 7 秒待つことをお勧めします。
トラブルシューティング
Lambda 関数で問題が発生した場合に備えて、一般的なトラブルシューティングのヒントをいくつか示します。