🛠️

Severless Frameworkで構築するLambda関数にエラー監視ツールSentryを導入する

2023/01/11に公開

Severless Frameworkで構築するLambda関数にSentryを導入する方法について記載します。
Lambda関数はPythonを使用しています。
導入したソースコードはgithubに載せています。

Sentryとは

Sentryとは、フロントからバックエンドまで、アプリケーションで発生したエラーを監視できるツールです。
https://sentry.io/welcome/

事前準備

  1. Sentryアカウントを作成します
  2. プロジェクトを作成します
    サインアップしてログインすると、初めにこのような画面が表示されました。
  3. 今回はServerlessのLambda(Python)を選択し、Create Projectを行います
  4. manual setupを選択すると、セットアップ用のコードが表示されます。
  5. DSNが記載されていますので、控えます

    Sentryでは、アプリケーションからSentryサーバーにエラーや例外を送信するために、DSN (Data Source Name) と呼ばれる識別子を使用します。
    この画面以外では作成されたProjectの設定画面から[Client Keys]タブを表示することで、dsnを確認することができます。
    プロジェクト配下の.envファイルにSENTRY_DSNとして記載し、保存します。

Lambda関数に仕込みます

以下のコマンドでsentry-sdkをインストールすることができます。

pip install --upgrade sentry-sdk

Lambda関数のコードに以下を追記します。

import sentry_sdk
from sentry_sdk import set_user
from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration

SENTRY_DSN = os.getenv("SENTRY_DSN")
sentry_sdk.init(
    dsn=SENTRY_DSN,
    integrations=[AwsLambdaIntegration(timeout_warning=True)],
    traces_sample_rate=1.0,
)

  • from sentry_sdk import set_userはリクエストしたUserをフィルタするための値をセットできます
    sentry_sdk.init()は、Sentry のクライアントライブラリの初期化を行うメソッドです。
    これにより、アプリケーションから Sentry サーバーにエラーや例外を送信するための準備が整います。
    このメソッドにはほかにもreleaseenvironmentなどの値を設定することで、環境やリリースによってエラーをわけてトラッキングすることができます。
  • SENTRY_DSNを環境変数から取得する形としています。
  • integrations=[AwsLambdaIntegration(timeout_warning=True)]はLambda関数のタイムアウトが発生した際に、Sentryに警告イベントを送信する指定です。
  • DockerでLambda関数を動かすため、pipでインストールが必要なパッケージrequirements.txtにまとめている場合に、sentry-sdkを追記します。

set_userは以下のように使用することができます。

def coffee_note_handler(event, context):
    # TODO implement
    try:
        print(event)
        user_id = event["requestContext"]["authorizer"]["principalId"]
        set_user({"id": user_id})

これにより、トラッキングしたデータにuser_idの値を持たせることができ、エラーが起こった際にどのユーザーによるリクエストで起こったのか等フィルターすることができます。
emailなど、任意の値を辞書型で記述することで設定することができます。

serverless.yamlの編集

環境変数を使用する場合、以下を追記します。

useDotenv: true

provider:
  environment:
    SENTRY_DSN: ${env:SENTRY_DSN}

デプロイし、導入は完了となります。

Discussion