Amazon Managed Service for Prometheusを使ってみた

2022年12月6日掲載

キービジュアル

こんにちは。ソフトバンクの木村です。

この記事は、ソフトバンク Advent Calendar 2022 の 6日目の記事になります

MSPサービスのオプションサービスである、クラウドネイティブ・アプリケーションプラットフォーム(CNAP)の開発業務を行っています。

CNAPの開発業務の中で、AWSが提供するPrometheusのマネージド・サービス「Amazon Managed Service for Prometheus(AMP)」の利用を検討したので、本記事ではサービスの機能概要や利用方法について解説します。

目次

  • この記事ではAmazon Managed Service for Prometheusの機能概要と利用方法について解説します。
  • Prometheusに関する前提知識があると読みやすいです。

Prometheusとは

PrometheusとはOSSの監視ツールです。Prometheusはサービスディスカバリの機能が強力であることや、さまざまなリソースを簡単に監視対象にできるため、コンテナ・Kubernetesを利用したシステムにおいてはデファクトな監視ツールとなっています。

しかし、Prometheusは単体ではデータの永続的な保存が考慮されたアーキテクチャになっていません。そのため、データの長期保存を考慮する場合、CortexThanosといった別のOSSストレージツールを組み合わせることになり、運用負荷が大きくなってしまいます。また、性能についても考慮が必要であり、大規模な運用になればなるほど運用負荷が大きくなってしまいます。

これらPrometheusの運用負荷を低減するために、いくつかのクラウドベンダがPrometheusのマネージドサービスを提供しています。今回はAWSが提供しているAmazon Managed Service for Prometheus(AMP)を紹介します

Amazon Managed Service for Prometheus(AMP)とは

Amazon Managed Service for Prometheus(AMP)はAWSが提供するPrometheusのマネージドサービスです。

AMPの特徴は、Prometheus全体をマネージド・サービスとして提供するのではなく、Prometheusのメトリクスの保存先となるWorkspaceを提供するという点です。自分で構築したPrometheusサーバとAMPのWorkspaceを接続することでメトリクスの収集を行います。

AMPで構築されたWorkspaceのデータは自動的にマルチAZで保存されて、データの永続的な保存が考慮されたアーキテクチャになっています。また、Workspaceは保存されるメトリクス量やクエリ数に応じてオートスケールするため、性能の考慮をする必要もありません。

利用方法

ここからは、AMPを利用する手順を説明します。

Workspaceの構築

まず、メトリクスの保存先となるWorkspaceを構築します。以下のコマンドを利用してWorkspaceを構築します。コマンド実行後出力されたworkspaceIdがWorkspaceを特定するIDとなるので控えておきます。

$ aws amp create-workspace
{
    "arn": "arn:aws:aps:ap-northeast-1:XXXXXXXXXXXX:workspace/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "status": {
        "statusCode": "CREATING"
    },
    "tags": {},
    "workspaceId": "ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

先程控えたworkspaceIdを指定してWorkspaceの詳細情報を取得します。prometheusEndpointがPrometheusサーバからWorkspaceへ接続する際のURLとなるので、値を控えておきます。

$ aws amp describe-workspace --workspace-id ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
{
    "workspace": {
        "arn": "arn:aws:aps:ap-northeast-1:XXXXXXXXXXXX:workspace/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "createdAt": "2022-11-26T17:40:45.120000+09:00",
        "prometheusEndpoint": "https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/",
        "status": {
            "statusCode": "ACTIVE"
        },
        "tags": {},
        "workspaceId": "ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
}

Prometheusサーバの構築

AMPのWorkspaceに接続するPrometheusサーバを準備します。今回はAWSが提供するマネージドKubernetesサービスであるAmazon Elastic Kubernetes Service (EKS)にて構築したクラスタ上に、Prometheusサーバとデータ確認用にダッシュボード製品であるGrafanaを構築します。
構築の際にはKubernetesのパッケージマネージャであるHelmを利用します。

IAMサービスロールの設定

PrometheusサーバからAMPのWorkspaceへメトリクスを取り込むため、またGrafanaからAMPのWorkspaceへクエリを実行するために、IAMサービスロールの設定を行います。

AWSの公式サイトにて、サービスロールの設定を一括で行うシェルスクリプトが用意されているので、そちらを利用して設定を行います。

シェルスクリプト内で実施している設定は以下になります。

  • EKSクラスタのOIDCプロバイダーの作成
  • Prometheusサーバが利用するIAMロールの設定
    • amp-iamproxy-ingest-role という名前のIAMロールを作成し、メトリクスの取り込みに必要なIAMポリシーをアタッチします。
  • Grafanaが利用するIAMロールの設定
    • amp-iamproxy-query-role という名前のIAMロールを作成し、クエリ実行に必要なIAMポリシーをアタッチします。

 PrometheusサーバとGrafanaの構築

今回はkube-prometheus-stackというHelmチャートを利用して、Prometheus・GrafanaおよびKubernetesの基本的なメトリクスを取得するexporter(kube-state-metrics/node-exporter)をまとめて構築します。

まず、PrometheusのHelmリポジトリの設定を行います。

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update

次に、インストール時に利用する設定ファイルを作成します。設定ファイル作成の際、以下の内容を編集します。

  • prometheus.prometheusSpec.remoteWrite.url に AMPのWorkspaceの書き込みのエンドポイントのURLを指定します
    • 例: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/[WorkspaceのID]/api/v1/remote_write
  • grafana.additionalDataSources.url に AMPのWorkspaceのURLを設定します。
    • 例:https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/[WorkspaceのID]/
  • prometheus.serviceAccount.annotations に Prometheusサーバが利用するIAMロールの値を設定します。
    • 例:arn:aws:iam::[アカウントID]:role/amp-iamproxy-ingest-role
  • grafana.serviceAccount.annotations に Grafanaが利用するIAMロールの値を設定します。
    • 例:arn:aws:iam::[アカウントID]:role/amp-iamproxy-query-role

 

$ cat prometheus_value.yaml
prometheus:
  serviceAccount:
    name: amp-iamproxy-ingest-service-account
    annotations: 
      eks.amazonaws.com/role-arn: arn:aws:iam::XXXXXXXXXXXX:role/amp-iamproxy-ingest-role
  prometheusSpec:
    remoteWrite:
      - url: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/api/v1/remote_write
        sigv4:
          region: ap-northeast-1
        queueConfig:
          maxSamplesPerSend: 1000
          maxShards: 200
          capacity: 2500
grafana:
  serviceAccount:
    name: amp-iamproxy-query-service-account
    annotations: 
      eks.amazonaws.com/role-arn: arn:aws:iam::XXXXXXXXXXXX:role/amp-iamproxy-query-role
  grafana.ini:
    auth:
      sigv4_auth_enabled: true
 sidecar:
    datasources:
      defaultDatasourceEnabled: false
  additionalDataSources:
    - name: amp-prometheus
      type: prometheus
      uid: amp-prometheus
      url: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/
      access: proxy
      isDefault: true
      jsonData:
        sigV4Auth: true
        sigV4AuthType: default
        sigV4Region: ap-northeast-1
      version: 1

作成した設定ファイルを指定して、インストールします。

$ kubectl create namespace prometheus-namespace
$ helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack -n prometheus-namespace -f prometheus_value.yaml

Prometheusメトリクスの確認

GrafanaにログインしてPrometheusメトリクスを確認します。通常の運用ではGrafanaにパブリックIPを付与してアクセスしますが、今回は検証のためGrafanaに対してport-forwardしてアクセスします。

$ kubectl port-forward -n prometheus-namespace  svc/kube-prometheus-stack-grafana 28080:80 

kube-prometheus-stackを利用して構築した場合、Grafanaの初期のユーザ名はadmin、パスワードはこちらのファイルに設定されている値になります。

ダッシュボードの一覧から、Kubernetes / Compute Resource / Cluster を選択し、Data source amp-prometheus を選択し、以下の通りメトリクスが取得できていれば成功です。

まとめ

今回はAmazon Managed Service for Prometheus(AMP)について紹介しました。AMPを利用することで、Prometheusの運用負荷の低減が可能になります。

AMPには今回紹介しなかったセキュリティ関連の機能やアラートマネージャの機能もあります。また、今回はEKSクラスタ上に構築したGrafanaからAMPのメトリクスを参照しましたが、AWSにはGrafanaのマネージド・サービスである、Amazon Managed Grafana(AMG)という製品もあります。これらの機能もあわせて、AMPを利用してみてはいかがでしょうか。

以上、最後までお読みいただきありがとうございました。

それでは、ソフトバンク Advent Calendar 2022 の 7日目にバトンを渡します。舩木さんよろしくお願いします。

関連サービス

Amazon Web Services (AWS)

ソフトバンクはAWS アドバンストティアサービスパートナーです。「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

クラウドネイティブ・アプリケーションプラットフォーム(CNAP)

クラウドネイティブ・アプリケーションプラットフォーム(CNAP)とは標準化されたアプリケーション実行環境を手軽に利用できるサービスです。リリースプロセスを自動化し、開発者自身がセルフサービスで実行環境を準備できるようになります。

おすすめの記事

条件に該当するページがございません