Amazon Web Services ブログ
Amazon Managed Service for Prometheus を使用して EC2 環境を監視する
2021年4月16日追記:この記事は、Prometheus サーバーでの AWS Signature Version 4 サポート によって導入された変更を反映するように更新されました。
先日、Prometheus メトリクスの取り込み、クエリ、保存を行うフルマネージドでセキュアな Prometheus 互換環境を作成できるAmazon Managed Service for Prometheus (AMP) を発表しました。AWS Management & Governance の以前のブログ記事で、コンテナ化された環境を監視するためにAMPをセットアップする方法を説明しました。いくつかのクリティカルなユースケースでは、コンテナ化はずっと先のことだったり、時には不可能な場合があります。
この記事では、Amazon Elastic Compute Cloud (Amazon EC2) またはオンプレミス環境で稼働しているシステムでどのように AMP を使うのかを説明します。
セットアップ
この例では、以下のステップで説明します。
- Amazon Linux が起動している Amazon EC2 インスタンスをセットアップする
- Goで書かれたデモアプリケーションを実行し、Prometheus クライアントライブラリを使用して
/metrics
配下に Prometheus エンドポイントを作成する - AMP のワークスペースを作成する
- Prometheusサーバーを実行して、プロキシ経由でAMPにアプリケーションメトリクスをエクスポートする
- AMP ワークスペースをクエリするためにリモートのGrafana サーバーを設定する。最近発表したAmazon Managed Service for Grafana を使用して AMP をクエリすることも可能。
対応するアーキテクチャは、次のように視覚化することができます。
今回の例では、Ireland (eu-west-1) リージョンを選択しています。サービス別でサポートされている AWS リージョンを確認するには、AWS リージョンサービスリスト をご覧ください。
Amazon EC2 のセットアップ
このウォークスルーの最初のステップは、 EC2 インスタンスをセットアップすることです。そのインスタンスでアプリケーションをホストし、後で作成する AMP ワークスペースにそのメトリクスを転送します。インスタンスにはIAMロールを使用することをお勧めします。このロールには、ポリシー AmazonPrometheusRemoteWriteAccess
をアタッチして、インスタンスに最低限のアクセス許可を与えることができます。
デモアプリケーション
インスタンスが設定されたら、インスタンスにログインしてサンプルアプリケーションを実行できます。main.go
という名前のファイルを作成し、以下に示す内容を追加してください。HTTP 経由でいくつかのシステムメトリックを自動的に公開するために Prometheus http ハンドラを使用してください。Prometheus クライアントライブラリを使用して、独自のメトリクスを実装することができます。
package main
import (
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
)
func main() {
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8000", nil)
}
サンプルアプリケーションを実行する前に、すべての依存関係がインストールされていることを確認しましょう。
sudo yum update -y
sudo yum install -y golang
go get github.com/prometheus/client_golang/prometheus/promhttp
go run main.go
アプリケーションは、ポート 8000
で稼働している必要があります。この段階で、アプリケーションによって公開されるすべての Prometheus メトリクスを確認できるはずです。
curl -s http://localhost:8000/metrics
...
process_max_fds 4096
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 10
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 1.0657792e+07
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.61131955899e+09
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 7.77281536e+08
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes -1
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 1
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
AMP ワークスペースを作成する
ワークスペースを作成するには、AWS コンソールで AMP にアクセスし、ワークスペースの名前を入力します。
作成後、AMP によってremote write 用の URL とクエリ用の URL が提供されます。
Prometheus サーバーを実行する
expression browser を含む Prometheus の最新安定版をインストールするには、 Prometheus Guide を参照してください。この例では、次のように Amazon Linux に Prometheus v2.26.0 をインストールします。
prometheus.yaml
という名前の新しいファイルを作成し、 remote_write
の設定を AWS コンソールの AMP ワークスペースにあるワークスペース IDで書き換えてください。(訳注: 以下の内容でprometheus.yamlを作成し、 <YOUR-WORKSPACE-ID>
をAMPワークスペースのIDに置き換えてください)
global:
scrape_interval: 15s
external_labels:
monitor: 'prometheus'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:8000']
remote_write:
-
url: https://aps-workspaces.eu-west-1.amazonaws.com/workspaces/<YOUR-WORKSPACE-ID>/api/v1/remote_write
queue_config:
max_samples_per_send: 1000
max_shards: 200
capacity: 2500
sigv4:
region: eu-west-1
Prometheus を実行し、アプリケーションメトリクスを AMP に送信する準備がようやく整いました。
prometheus --config.file=prometheus.yaml
メトリクスが AMP に送られるようになりました! Prometheus サーバーのコンソールに出力が表示されるはずです。
Grafana でメトリクスを可視化する
Grafana は、 Prometheus のメトリクスを可視化するためによく使われているプラットフォームです。ローカルマシン で、 Grafana をインストール (訳注: Grafana 7.3.5、またはそれより新しい必要があります)し、AMP ワークスペースをデータソースとして設定しましょう。
ローカル環境に、ワークスペースをクエリするための次の権限またはそれ以上の権限があることを確認してください。(訳注: 必要な権限を利用可能な Access Key ID および Secret Access Key をローカル環境にご用意ください)
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"aps:GetLabels",
"aps:GetMetricMetadata",
"aps:GetSeries",
"aps:QueryMetrics",
"aps:DescribeWorkspace"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
IAM の権限で AMP へのクエリに署名するため、Grafana を実行する前に AWS Sigv4 認証を有効にします。
export AWS_SDK_LOAD_CONFIG=true
export GF_AUTH_SIGV4_AUTH_ENABLED=true
grafana-server --config=/usr/local/etc/grafana/grafana.ini \
--homepath /usr/local/share/grafana \
cfg:default.paths.logs=/usr/local/var/log/grafana \
cfg:default.paths.data=/usr/local/var/lib/grafana \
cfg:default.paths.plugins=/usr/local/var/lib/grafana/plugin
Grafana にログインし、データソース設定ページ /datasources に移動して AMP ワークスペースをデータソースとして追加します。URL は末尾に /api/v1/query
をつけないようにしてください。
Sigv4 auth
を有効にして、適切なリージョンを選択して保存してください(訳注: SigV4 Auth Details
の Authentication Provider
でクレデンシャル情報の設定もしてください)。
これで、アプリケーションメトリクスが利用できるようになりました。例えば、メトリクスブラウザで scrape_duration_seconds{}
を設定してみてください。以下のような画面が表示されるはずです。
まとめ
この記事では、最近発表された Amazon Managed Service for Prometheus を使って、Amazon EC2 インスタンスを使った非コンテナ化環境でのメトリクス収集のアーキテクチャのセットアップを詳しく説明しました。EC2 インスタンス上でメトリクスの収集を自動化するために、関連するすべての依存関係を持つ AMI を事前設定するか、AWS Systems Manager を使うことができます。 Amazon Managed Service for Prometheus、 Amazon Managed Service for Grafana、そして OpenTelemetry についてはリンク先をご参照ください。
翻訳はソリューションアーキテクトの 藤嶋 が担当しました。原文はこちらです。本記事は翻訳にあたり、一部の画面キャプチャを翻訳時点の最新版に差し替えており、一部記述を追加しています。