# Application Signals で Python アプリをトレースする


published: 2025-06-08

CloudWatch Application Signals は、EC2 や ECS で稼働しているアプリケーションをトレースするサービスです。
Java や Python, Node.js に対応してます。

EC2 に Python アプリを立てて、どんな感じか試してみました。


## はじめに

本記事では AWS ドキュメントの手順に沿ってセットアップを進めます。
詳細はドキュメントを参照ください。


- [https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-Enable-EC2Main.html](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-Enable-EC2Main.html)


## サービス検出を有効化

Application Signals のコンソールに行き、サービス検出を有効にします。
ボタンを押すとサービスロールが作成されます。


![application-signals-start.png](https://lab.enuesaa.dev/prototype/aws-application-signals-python/application-signals-start.png)

## インスタンスを起動 (Amazon Linux 2023)

EC2 でインスタンスを起動します。
OS は Amazon Linux 2023 にしました。


![ec2.png](https://lab.enuesaa.dev/prototype/aws-application-signals-python/ec2.png)

## インスタンスプロファイル

EC2 に CloudWatch Agent を立ち上げるため、インスタンスプロファイルに IAM 権限が必要です。
CloudWatchAgentServerPolicy ポリシーをつけます。


![ec2iamrole.png](https://lab.enuesaa.dev/prototype/aws-application-signals-python/ec2iamrole.png)

EC2 インスタンスが立ち上がったら ssh しましょう。


## CloudWatch Agent をセットアップ

CloudWatch Agent をインストールしましょう。


```bash
$ dnf install amazon-cloudwatch-agent

```

設定ファイルを作成します。


```bash
$ vim cloudwatch-agent-config.json

```

```jsonc
// cloudwatch-agent-config.json
{
  "traces": {
    "traces_collected": {
      "application_signals": {}
    }
  },
  "logs": {
    "metrics_collected": {
      "application_signals": {}
    }
  }
}

```

CloudWatch Agent を立ち上げます。


```bash
$ /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config -m ec2 -s \
  -c file:cloudwatch-agent-config.json

```

設定ファイルのパスをフラグとして渡しているので適宜調整ください。


## Python アプリの作成

Python 3.12 をインストールします。


```bash
$ dnf install python3.12-pip
$ python3.12 --version
Python 3.12.10

```

続いてトレースするアプリを用意します。
Flask にしました。


```bash
$ pip3.12 install flask
$ vim main.py

```

```py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "hello"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

```

## aws-opentelemetry-distro

トレースするのに必要なパッケージをインストールします。


- [aws-opentelemetry-distro](https://github.com/aws-observability/aws-otel-python-instrumentation/tree/main/aws-opentelemetry-distro)
```bash
$ pip3.12 install aws-opentelemetry-distro

```



## アプリを立ち上げ

Flask を立ち上げましょう。

opentelemetry-instrument をかませるのがミソです。
これが 4316 ポート (CloudWatch Agent) へトレース情報を送信します。


```bash
$ OTEL_METRICS_EXPORTER=none \
  OTEL_LOGS_EXPORTER=none \
  OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true \
  OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT=http://localhost:4316/v1/metrics \
  OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://localhost:4316/v1/traces \
  opentelemetry-instrument python3.12 main.py

```

環境変数はいろいろありますが、
ドキュメントが詳しいので、そちらを参照いただければと思います。


- [https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-Enable-EC2Main.html](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-Enable-EC2Main.html#CloudWatch-Application-Signals-Enable-Other-instrument)
## リクエスト

リクエストしましょう。


```bash
$ curl http://127.0.0.1:8080/
hello

```

X-Ray にトレースが表示されます。


![cloudwatch-traces.png](https://lab.enuesaa.dev/prototype/aws-application-signals-python/cloudwatch-traces.png)

しばらくすると Application Signals にも情報が表示されます。


![application-signals-services.png](https://lab.enuesaa.dev/prototype/aws-application-signals-python/application-signals-services.png)

トレースやメトリクスとも連携されます。


![application-signals-traces.png](https://lab.enuesaa.dev/prototype/aws-application-signals-python/application-signals-traces.png)

