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

ちなみにサンプルアプリケーションは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通信の設定も不要です。

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から、トレースを取得できていることを確認できました。

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