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 DetailsAuthentication Provider でクレデンシャル情報の設定もしてください)。

これで、アプリケーションメトリクスが利用できるようになりました。例えば、メトリクスブラウザで scrape_duration_seconds{} を設定してみてください。以下のような画面が表示されるはずです。

まとめ

この記事では、最近発表された Amazon Managed Service for Prometheus を使って、Amazon EC2 インスタンスを使った非コンテナ化環境でのメトリクス収集のアーキテクチャのセットアップを詳しく説明しました。EC2 インスタンス上でメトリクスの収集を自動化するために、関連するすべての依存関係を持つ AMI を事前設定するか、AWS Systems Manager を使うことができます。 Amazon Managed Service for PrometheusAmazon Managed Service for Grafana、そして OpenTelemetry についてはリンク先をご参照ください。

Rodrigue Koffi

Rodrigue は Amazon Web Services のソリューションアーキテクトです。彼は分散システム、オブザーバビリティ、機械学習に情熱を傾けています。DevOpsとソフトウェア開発の経験が豊富で、Go言語でのプログラミングが好きです。Twitter ID は @bonclay7 です。

翻訳はソリューションアーキテクトの 藤嶋 が担当しました。原文はこちらです。本記事は翻訳にあたり、一部の画面キャプチャを翻訳時点の最新版に差し替えており、一部記述を追加しています。