[楽々エラー監視]SentryをつかってLambda(python)のエラートラッキングを試してみる

2020.10.07

どうも!大阪オフィスの西村祐二です。

みなさま、Lambdaのエラー監視やエラートラッキングなどはどのようにしてますでしょうか?

個人的にLambda内のアプリケーション実装とCloudWatch系などのサービスを組み合わせて仕組みを作って自前でやりくりすることが多かったです。

しかし、新規案件ごとに都度構築が必要になったり、引き継ぎ時にドキュメントの準備やスキルトランスファーが必要になったり、先方でメンテナンスや機能追加・修正ができない状況になる可能性があったりと課題に感じることがありました。

そこで、汎用的なSaaSで良さそうなツールはないかなと探していると「Sentry」でAWS Lambdaがサポートされていたので試してみました。

Sentryとは?

エラー検知・監視ツールです。

フロントエンド界隈でよく耳にすることが多いかと思います。

https://sentry.io/welcome/

フロントエンド以外のプラットフォームもサポートされており、サーバーレスプラットフォームにも対応しています。

料金体系

フリープランが用意されています。

2020/10/7時点のプランに簡単にまとめると下記になっており、 上位のプランになるとトラッキング可能件数上限が増加、フィルター機能やインテグレート機能などの機能が利用できるようになります。

  • Developer :無料

  • Team :有料($26/月)

  • Business :有料($80/月)

  • Enterprise :有料(要問合せ)

詳細は下記公式サイトをご確認ください。

https://sentry.io/pricing/

試してみる

Sentry側の設定

AWS Lambda用プロジェクトを作成

  • 作成後、実装サンプルが表示されるので、メモしておきましょう。

Sentry側の設定は以上です

Lambda関数を作成

環境

  • Nodejs: 12.18.2

  • Serverless Framework:1.83.0

  • Lambdaランタイム: Python3.8

  • python環境管理:pipenv

作業

  • 準備作業

プロジェクト作成
$ mkdir sentry-test-lambda
$ cd sentry-test-lambda
$ npm install serverless@1.83.0
$ sls create -t aws-python3 -n sentry

プラグインインストール
$ sls plugin install -n serverless-python-requirements

Lambdaランタイム用Python環境構築
$ pipenv shell
$ pipenv install sentry-sdk
  • Lambdaをデプロイするためのコンフィグファイルを設定する

sentry-sdkはLambda Layerにして紐付けるようにしています

serverless.yml

service: sentry

provider:
  name: aws
  runtime: python3.8
  region: ap-northeast-1

plugins:
  - serverless-python-requirements
custom:
  pythonRequirements:
    layer: true
    dockerizePip: false

package:
  individually: false
  exclude:
    - '**/*'
  include:
    - handler.py

functions:
  hello:
    handler: handler.hello
    layers:
      - { Ref: PythonRequirementsLambdaLayer }
  • エラーが発生するように実装

sentryに関する実装の部分はプロジェクト作成後に表示されたコードを使用します。

handler.py

import json
import sentry_sdk
from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration

sentry_sdk.init(
    dsn="https://xxxxxxxxxxx.ingest.sentry.io/xxxxxxxxx",
    integrations=[AwsLambdaIntegration()]
)


def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }
    try:
        division_by_zero = 1 / 0
    except Exception as e:
        # handle ZeroDivisionError exception
        print(e)
        raise

    return response

    # Use this code if you don't use the http event with the LAMBDA-PROXY
    # integration
    """
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }
    """
  • sentryのドキュメントは下記になります。

https://docs.sentry.io/platforms/python/guides/aws-lambda/

  • 他のサンプルは下記にまとめられております。

https://github.com/getsentry/examples/tree/master/aws-lambda/python

  • Serverless Frameworkを使ってLamnbdaをデプロイします
$ sls deploy

動作確認

Lambdaのデプロイが完了したら実際に実行してみてエラーを発生させてみましょう

  • AWSコンソール上から適当なテストイベントを設定して「テスト」をクリックします

  • 想定どおりエラーになることを確認

Sentry上でエラーを確認

どんな情報が確認できるか確認していきましょう

▼エラー名と関数名が一覧で表示されます。

どんなエラーが発生したか、どのLambdaで発生したかわりますね。また、複数回発生した場合はエラー毎にまとめられるので、同じエラーが多く発生しても他のエラーが埋もれることはなさそうでした。

▼エラー詳細を確認

自動でタグを付与をしてくれたり、エラーの箇所、入力したEventデータや変数の情報など確認することができました。

Lambdaは複数のサービスのつなぎ役になることが多いので、アプリケーション上で特別な設定なしに入力データのEventデータや関連の変数情報がみれるのはとても助かりますね。

CloudWatch Logsのリンク先、Lambdaの実行状況の情報などもあり、トラブルシューティングの際にとても役に立ちそうですね。

個人的所感

試してみての感想です。総合的にみてかなり良かったので引き続き検証をしていきたい思います。

  • 設定が簡単で十分なデータがとれる

Lambdaをデプロイする際のパッケージにSentry用のSDKを含めて、設定情報を数行追記するだけで十分な情報が取得できます。

  • 見やすい画面

Sentryの画面がとても見やすいなと感じました。CloudWatch Logsへのリンクがあったりと親切設計でした。自前実装だとCloudWatch Logsへ出力されるログを見やすいフォーマットに変換する処理など入れていたりと、細かな工夫などは不要になりそうです。

  • CloudWatch Logsの料金増加はなさそう?

未検証ですが、SentryのライブラリをLambdaのパッケージに含めているので、そこでエラー内容を収集してSentryに送信しているようです。そのため、CloudWatchに関するAPIコールが増加するなどはなさそうかなと思います。もし、間違いであればご指摘いただければと思います。

  • インテグレーション機能は有料プランから(フリープランでも1つだけ利用できる?)

エラーを検知した後は日常的に利用するツールに通知してほしいものです。

Sentryには多くの他サービスと連携する機能があります。

https://docs.sentry.io/product/integrations/

ただし、有料プランになることによってこのインテグレーションの機能が利用できるようになるそうです。(フリープランでも1つだけ利用できる?)

自前でこのような仕組みを構築およびメンテナンスしていくコストを考えると有料プランでも決して高い料金ではないと思います。

  • フロントエンドとまとめて管理できる

もし、フロントエンドの実装や構築・運用も行っており、エラー監視などするがあれば、まとめて一括管理することができで便利。

  • エラー通知の数、データの保持期間に制限が設定されている

フリープランだとエラー通知の数は月5000回、30日間のデータ保持となっているので、プランによってできること、できないこと、制限をしっかり把握しておく必要がありそうです。

https://sentry.io/pricing/

https://docs.sentry.io/product/accounts/pricing/

さいごに

SentryでAWS Lambdaのエラートラッキングを試してみました。

まだまだ触れていない機能がありますが、印象としてはとても良かったです。

導入も簡単でなおかつ、Lambdaに関する十分な情報が取得されており、有料プランであればSlackやGithubとの連携も簡単にできます。

自前でこのような仕組みを構築およびメンテナンスしていくコストを考えると有料プランでも決して高い料金ではないと思います。

無料プランも用意されているので、気になる方はフリープランから試してみてはいかがでしょうか。

個人的にフロントエンドも触ることがあるので「Sentry」を今回は選びましたが、他のサービスでも検証してブログにまとめていきたいと思います。

誰かのお役に立てれば幸いです