AWS LambdaでNew Relic Logs in Contextを利用する

こんにちは。香田です。

今回はAWS LambdaでNew Relic Logs in Contextを利用する方法を紹介していきます。

事前にNew RelicのAWSインテグレーションが必要になる為、下記を参考に設定してみてください。

Introduction to AWS integrations

New Relic Logs in Contextについて

New Relic Logs in Contextを利用すると APMで取得されるエラー情報やトレース情報のコンテキストに応じたログを表示することが可能です。

Logs In Contextを利用する場合、New RelicのAPM Agentを利用する必要がありますが、

AWS Lambda等をサポートしているサーバーレス モニタリングを利用することで、APMと同じようにエラーやトレース情報よりLogs in Contextが確認可能です。

今回は簡易な手順で設定可能なサーバーレス モニタリングを利用し、Logs in Contextを確認していきます。

Serverless Frameworkを利用しAWS環境の構築

Logs in Contextの確認用のAWS環境として、API Gateway、Lambda環境を構築していきます。

構築にはServerless Frameworkを利用していきます。

はじめに作業ディレクトリを作成します。

$ mkdir workspace
$ cd workspace

serverlessをインストールします。

$ npm install -g serverless

New Relicより提供されているserverless pluginをインストールします。

プラグインを利用することで、New Relicへデータが転送されサーバーレス モニタリングが利用可能となります。

$ npm install --save-dev serverless-newrelic-lambda-layers

NEW_RELIC_API_KEYNEW_RELIC_ACCOUNT_IDを環境変数に設定します。

$ export NEW_RELIC_API_KEY=xxxx
$ export NEW_RELIC_ACCOUNT_ID=xxxx

Serverless Frameworkの設定ファイルserverless.ymlを作成します。

service: hello-world
frameworkVersion: "3"

provider:
  name: aws
  runtime: python3.9
  stage: dev
  apiName: hello-world-api
  region: ap-northeast-1
  timeout: 300

plugins:
  - serverless-newrelic-lambda-layers

custom:
  newRelic:
    accountId: ${env:NEW_RELIC_ACCOUNT_ID}
    apiKey: ${env:NEW_RELIC_API_KEY}
    # Lambda Extension
    enableFunctionLogs: true

functions:
  hello:
    name: hello
    handler: handler.hello
    events:
      - http:
          path: /hello
          method: get

Lambda 関数のコードとしてhandler.pyという名前でファイルを作成します。

import json
import logging
import datetime

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def hello(event, context):
    body = {
        "message": "Hello world",
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    for i in range(5):
        dt_now = datetime.datetime.now()
        message = "test%d New Relic Logs in Contest %s" % (i, dt_now)
        logger.info(message)

    return response

AWS環境へデプロイします。

$ sls deploy --verbose

Logs in Contextの確認

Logs in Contextを確認する為、API Gatewayへリクエストをしばらく送ってみます。

API GatewayのIDを確認し環境変数へ設定します。

$ export API_ID=xxxx

API Gatewayへリクエストをしばらく送信します。

while true; do
    curl -s https://${API_ID}.execute-api.ap-northeast-1.amazonaws.com/dev/hello | jq -r .message
    sleep 1
done

リクエストをしばらく送信後、New Relicへアクセスし[Explorer]、[Lambda functions]より作成された関数を選択します。

[Distributed tracing]よりTrace groupを選択します。

Traceを選択し[Logs]をクリックします。

下記のようにLambdaのトレースに紐づいたログが確認できるはずです。

ログをさらに絞り込みたい場合は[Open in logs]をクリックします。

下記のように[Logs]の方で参照可能となります。

さいごに

AWS LambdaでNew Relic Logs in Contextを利用する方法如何でしたでしょうか?

Logs in Contextを利用することで、トレースやエラーといった情報を起点に目的のログを直接参照可能になる為、トラブルシューティングの時にも有用ではないでしょうか。

最後までご覧いただきありがとうございます。

SNSでもご購読できます。