1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lambda Auto-Instrumentationで計装したトレースをGrafana Tempoに送信する

Last updated at Posted at 2025-12-09

本記事はOpenTelemetry Advent Calendar 2025 10日目の記事になります。

はじめに

社会人1年目になった頃、エンジニアとしての初めてのタスクがAKSへのOpenTelemetryの導入でした。そのためOpenTelemetryというツールは個人的に思い入れのあるもので、アドベントカレンダーに参加させていただきました。
今回はLambda Auto-Instrumentationによる計装を試してみて、そのトレースデータをGrafana Tempoに送信するところまでやってみます。
簡易的な構成図にはなりますが、構築する環境は以下の通りです。(VPCは省略)
Lambda Auto Instrumentation.drawio.png

ちなみにサンプルアプリケーションはKiroで作成しました。何やらre:Inventで機能追加が発表されていたようですが何も追えてません。。。

Grafana Tempoサーバの構築

EC2インスタンスにGrafanaサーバを構築しTempoを導入していきます。OSはAmazon Linux2023を使用します。手順は公式ドキュメントを参照することで簡単に構築することができます。

Grafanaサーバの構築・起動

Grafana Tempoの導入

こちらも基本設定での構築であれば公式ドキュメント通りにデプロイすれば簡単に構築することができますので、要点のみ触れていきます。

パッケージのインストール

ドキュメントにはdebパッケージでのインストールが記載されていますが、Amazon Linux2023ではRPMパッケージを使用する必要があります。

curl -Lo tempo_2.9.0_linux_amd64.rpm https://github.com/grafana/tempo/releases/download/v2.9.0/tempo_2.9.0_linux_amd64.rpm
dnf install tempo_2.9.0_linux_amd64.rpm

S3の認証情報の設定

ドキュメントにはS3にアクセスするためのアクセスキーを用意するよう記載されていますが、EC2で動作させる場合はIAMロールで認証できるのでアクセスキーの用意は不要です。必要なIAMポリシーは以下ドキュメントに記載されています。

データソースの設定

こちらも特に難しい点はありません。今回はGrafanaとサーバ内で同居しているので特に認証やHTTPS通信の設定も不要です。
image.png

Lambda Auto-Instrumentationによる計装

Auto-Instrumentationのメリット

トレースデータを収集するためにはアプリケーションコードにテレメトリーデータを取得するための処理を追加する必要がありますが、Auto-Instrumentationを使用することで、アプリケーションコードを修正することなくテレメトリーデータの取得を行うことができます。
ただし、Auto-Instrumentationがサポートされていない言語の場合はコード修正による計装が必要になります。

Lambda Auto-Instrumentationの実装

S3にcollector.yamlを配置

カスタムのOpenTelemetry Collectorを使用するためにYAMLファイルをS3に配置しておきます。S3に配置する場合はLambdaロールにS3の参照権限を付与しておく必要があります。
今回は最小構成のcollectorを配置します。

receivers:
  otlp:
    protocols:
      http:
        endpoint: '127.0.0.1:4318'
exporters:
  otlp:
    endpoint: <tempoサーバのIP>:4317
    tls:
      insecure: true
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [otlp]

注意点として、NodeJSのLambda Auto-Instrumentationはgrpcをサポートしていないので、httpを使用する必要があります。grpc(ポート4317)を使用するとerror Error: connect ECONNREFUSED 127.0.0.1:4318のエラーが発生します。

アプリケーションLambdaの環境変数設定

Lambdaに以下の環境変数を設定します。

OPENTELEMETRY_COLLECTOR_CONFIG_URI: s3://<bucket_name>.s3.<region>.amazonaws.com/collector.yaml
AWS_LAMBDA_EXEC_WRAPPER: /opt/otel-handler

Lambdaレイヤーの追加

アプリケーションを動作させているLambdaに対してInstrumentation用とCollector用のLambdaレイヤーを追加します。
以下にCloudFormationでの実装例を記載しておきます。

  LambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Layers:
        - arn:aws:lambda:ap-northeast-1:184161586896:layer:opentelemetry-nodejs-0_18_0:1
        - arn:aws:lambda:ap-northeast-1:184161586896:layer:opentelemetry-collector-amd64-0_19_0:1
      Environment:
        Variables:
          OPENTELEMETRY_COLLECTOR_CONFIG_URI: s3://<bucket_name>.s3.<region>.amazonaws.com/collector.yaml
          AWS_LAMBDA_EXEC_WRAPPER: /opt/otel-handler

注意点

古いバージョンのCollector用のレイヤーを使用する場合、OPENTELEMETRY_COLLECTOR_CONFIG_URIでcollector.yamlを指定することはできず、デフォルトのCollectorになってしまいます。代わりにOPENTELEMETRY_COLLECTOR_CONFIG_FILE という環境変数を使っていたようですが、特に理由がなければ最新バージョンを採用するべきだと思います。

Grafana Tempo Explorerの確認

無事Explorerから、トレースを取得できていることを確認できました。
image.png

最後に

構築を行いながら、ADOTによる計装と何が違うのか気になったので時間があれば検証したいと思います。最後までお読みいただきありがとうございました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?