BEMAロゴ

エンジニアの
成長を支援する
技術メディア

【サクッと試せるSLO】AWS CloudWatch Application Signals の検証とPythonアプリへの導入手順

はじめに

DevOps Leadカンパニーの勝野です。

本カンパニーでは週の12%を研究開発・組織づくりに充てる「DevOpsLab」という取り組みを行っています。

今回はそのLab活動の一環で、AWS CloudWatch Application Signals(以下、Application Signals)の調査・検証を行ったので、このサービスについて紹介します。

SREプラクティスの導入、特にSLO(Service Level Objective)の運用開始には、メトリクス取得、アプリケーションの計装、ダッシュボード構築、アラート設計など、多くの初期設定がハードルとなります。

Application Signalsはこれらのハードルを下げるサービスになります。

読者対象

  • SREやアプリケーション運用に興味があるエンジニア

  • AWS環境でのオブザーバビリティ(可観測性)向上に関心がある方

  • SLO運用の導入を検討している方

Application Signalsとは?

AWS CloudWatch Application SignalsOpen in new tabにより、AWS上で稼働するアプリケーションを自動計測し追跡することが可能です。

主な特徴は以下の通りです。

  • OpenTelemetryベースの自動計装

    • 対応する言語・フレームワークであれば、アプリケーションコードに手を加えることなく、リクエスト数、レイテンシ、エラーレートといったメトリクスやトレースを自動で収集可能

  • 統合されたダッシュボード

    • デフォルトで収集したデータを元にしたダッシュボードが用意されているため、自らダッシュボードを作成せずとも、直感的にデータの確認が可能

  • 簡単なSLO設定

    • 自動で取得したリクエストに対して、コンソール上から可用性やレイテンシに関するSLOを簡単に設定・管理を行える

    • エラーバジェットやバーンレートの自動計算、それらを利用したアラート設定も可能

検証内容

1. 対象アプリケーションの準備とデプロイ

今回の検証ではサンプルアプリとしてprivate-isuOpen in new tabを利用しました。

提供されているAMIを利用してEC2インスタンスを構築し、インターネットからアクセス出来るようにしました。

この際、EC2インスタンスには CloudWatchAgentServerPolicy のIAMポリシーをアタッチします。これにより、EC2インスタンスからCloudWatchへのデータ送信が許可されます。

全体の構成イメージとしては下記です。

ここで注意点として、Application Signalsの自動計装がサポートする言語は、2026年5月現在、Java、.NET、 PHP、 Ruby、Python、Node.js、GoLangとなっています。

今回private-isuのサービスはデフォルトのRuby製のサービスから、普段私が利用することが多いPython製のサービスに変更しています。

サポートされているシステムの詳細は下記を参照ください。

2. Application Signalsの有効化

続いてEC2上のWebアプリケーションを計測できるよう設定を行います。

2-1. CloudWatch Agentのインストールと設定

EC2インスタンスにCloudWatch Agentをインストールし、設定ファイルを配置して起動します。

# Cloudwatch Agentのインストール
wget https://amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

# 設定ファイルの配置
cat <<EOF | sudo tee /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json > /dev/null
{
  "traces": {
    "traces_collected": {
      "application_signals": {}
    }
  },
  "logs": {
    "metrics_collected": {
      "application_signals": {}
    }
  }
}
EOF

# Cloudwatch Agentの起動
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

これにより、インスタンスからメトリクスやトレースデータをCloudWatchサービスに送信できるようになります。

2-2. Pythonアプリケーションの計測設定(OpenTelemetry)

次に、PythonアプリケーションがOpenTelemetryによって自動的に計測されるように設定します。

ライブラリの追加
pip を使って、OpenTelemetry関連のライブラリをインストールします。

sudo -u isucon /home/isucon/private_isu/webapp/python/.venv/bin/pip install opentelemetry-distro[otlp] aws-opentelemetry-distro

起動スクリプトの修正
アプリケーションの起動を管理している systemd のサービスファイルを修正し、OpenTelemetryを有効化するための環境変数を設定します。

具体的には、ExecStart のアプリケーション起動コマンドの前に opentelemetry-instrument を追加し、各種 Environment 変数を設定します。

# /etc/systemd/system/isu-python.service の抜粋

[Service]
# ... (一部省略) ...

# OpenTelemetry & Application Signals の設定
Environment="OTEL_METRICS_EXPORTER=none"
Environment="OTEL_LOGS_EXPORTER=none"
Environment="OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true"
Environment="OTEL_PYTHON_DISTRO=aws_distro"
Environment="OTEL_PYTHON_CONFIGURATOR=aws_configurator"
Environment="OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf"
Environment="OTEL_TRACES_SAMPLER=xray"
Environment="OTEL_TRACES_SAMPLER_ARG=endpoint=http://localhost:2000"
Environment="OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT=http://localhost:4316/v1/metrics"
Environment="OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://localhost:4316/v1/traces"
Environment="OTEL_RESOURCE_ATTRIBUTES="service.name=do-lab-sre-web""

# 起動コマンドを opentelemetry-instrument 経由で実行する
ExecStart=/home/isucon/private_isu/webapp/python/.venv/bin/opentelemetry-instrument /home/isucon/private_isu/webapp/python/.venv/bin/gunicorn app:app -b 0.0.0.0:8080 --log-file - --access-logfile -

# ... (一部省略) ...

主な環境変数の意味は以下の通りです。

  • OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true: Application Signalsを有効化します。

  • OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: トレースデータのエクスポート先(ローカルのCloudWatch Agent)を指定します。

  • OTEL_RESOURCE_ATTRIBUTES: service.name でApplication Signals上に表示されるサービス名を定義します。

この設定が完了したら、サービスを再起動します。

3. AWS側の設定

AWSコンソール側での設定としては、まずは下記に従ってCloudWatch Application Signalsを有効化します。

その後アプリケーションにリクエストが流れると、CloudWatch上で自動的にサービスが検出されます。

今回サービス名は do-lab-sre-web としていたので、それを検索してサービスを開くと、画面上から様々な情報を確認することが出来るようになっています。

検証でわかったApplication Signalsの便利なところ

実際に触ってみて、特に「これは便利だ!」と感じた点をいくつかご紹介します。

1. アプリケーションコード変更不要の自動計装

前述の通り、アプリケーションのコードには一切手を加えることなく、詳細なデータを収集できました。

これは、既存のアプリケーションにオブザーバビリティを導入する際のハードルを劇的に下げてくれると感じました。

OpenTelemetryについての詳細は理解が不十分な箇所も多いため、今後も学習していきたいです。

2. リッチなダッシュボード

サービスが検出されると、CloudWatchコンソールからは以下のような情報を確認できます。

これらはデフォルトで用意されているものであり、特別な設定をせずとも利用可能になります。

  • アプリケーションマップ

    • サービス間の依存関係が可視化され、どこで問題が発生しているかが一目でわかります

    • 今回の例はシンプルなのであまり活用するイメージが持ちづらいのですが、特にマイクロサービスアーキテクチャでは効果がありそうだと感じました

  • トレース

    • 個々のリクエストがどのように処理されたのかを確認できます

    • これにより1連の処理の流れにおいて「このクエリが悪い」といったように、どこがボトルネックになっているのか等の調査を行えます

3. 簡単なSLOの設定

自動検出されたサービスオペレーション(例: GET /)に対して数クリックでSLOの設定が可能です。

設定の際には、可用性やレイテンシー、測定間隔や目標値、バーンレート設定などSLOを設定する上で必要な要素を盛り込めます。

またSLOを設定すると、達成度やエラーバジェット、バーンレートを画面からも確認できるようになります。

さらに定義したSLOには、CloudWatch Alarmを簡単に設定できます。

例えば、「エラーバジェットの消費ペースが速すぎる(バーンレートが高い)」状態を検知してアラートを発報することが可能です。

まとめ

検証を通して、AWS CloudWatch Application Signalsによりデータ収集、SLO管理、アラート設定などの負担を軽減できると感じました。

今回は時間の都合で試せませんでしたが、Application Signals MCPを活用したAIOpsの実現にも興味が出てきました。

AWS上のアプリケーションに対して、オブザーバビリティ向上やSLO運用を始めたいと考えている方の参考になれば幸いです。

この記事が役に立ったと思ったら、
ぜひ「いいね」とシェアをお願いします!

リンクをコピーXでシェアするfacebookでシェアする

この記事を書いた人

ykatsuno
ykatsuno
2020年に大手SIerに新卒入社。AI精度改善やWebアプリ開発/運用などに従事。2023年にメンバーズに入社後はクライアント先でSREとしてプロダクトの信頼性向上に向けた取り組みを行っている。
詳しく見る
ページトップへ戻る