見出し画像

Amazon Managed Service for Prometheus を Prometheus Operator と利用する

以前こちらで Amazon Managed Service for Prometheus を利用してみた記事を書きました。今回は Amazon Managed Service for Prometheus にメトリクスデータを投入する際の AWS 認証 AWS Signature Version 4 を利用して、更にメトリクスデータ投入する際に Prometheus Operator を利用した構成で試してみたいと思います。

Prometheus の AWS Signature Version 4 サポート

Amazon Managed Service for Prometheus が登場したときには、AWS signing proxy を Prometheus のサイドカーコンテナとしてデプロイしてあげる必要がありました。これは Amazon Managed Service for Prometheus にデータを投入する際には AWS Signature Version 4 による認証が必要なためです。その後、Prometheus v2.26.0 にて Prometheus 自体が AWS Signature Version 4 による認証を実施できるようになりました。
AWS signing proxy は不要になったため、Prometheus 自体に AWS 認証情報をもたせることで Amazon Managed Service for Prometheus に対してメトリクスデータを投入することができます。

Prometheus Operator による Prometheus のインストール

Prometheus Operator は Prometheus 関連のコンポーネントの Kubernetes 上へのインストールなどを管理できる Kubernetes Operator です。今回はこちらを利用して Kubernetes クラスタ上へ Prometheus をインストールしてみます(実際には kube-prometheus を利用します)。
kube-prometheus では jsonnet 形式で Prometheus Operator の構成を記述していき、最終的に Kubernetes クラスタへ適用するマニフェストを構築していきます。最終的に構築されるマニフェストにおいて、デフォルトで Prometheus が利用する サービスアカウントは prometheus-k8s という名前のものになります。そこで、IRSA を利用して Prometheus に対して AWS 認証情報をもたせることができます。具体的には次のような手順にて、kube-prometheus からインストールした Prometheus に AWS 認証情報をもたせることができます。

# kube-prometheus による Prometheus のインストール
$ mkdir my-kube-prometheus; cd my-kube-prometheus
$ jb init
$ jb install github.com/prometheus-operator/kube-prometheus/jsonnet/kube-prometheus@main
$ wget https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/example.jsonnet -O example.jsonnet
$ wget https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/build.sh -O build.sh
$ jb update

# example.jsonnet にて Amazon Managed Service for Prometheus の設定記述
$ vim example.jsonnet
$ bash ./build.sh example.jsonnet

$ kubectl apply -f manifests/setup
$ kubectl apply -f manifests/

# kube-prometheus にてインストールした Prometheus に IAM ロールを関連づける
$ aws iam create-policy \
    --policy-name AMPIngestPolicy \
    --policy-document file://iam-policy.json
$ eksctl create iamserviceaccount \
    --cluster=${CLUSTER_NAME} \
    --region=ap-northeast-1 \
    --namespace=monitoring \
    --name=prometheus-k8s \
    --attach-policy-arn=arn:aws:iam::${AWS_ACCOUNT_ID}:policy/AMPIngestPolicy \
    --override-existing-serviceaccounts \
    --approve

なお、example.jsonnet には下記のように remote write API の接続先となる Amazon Managed Service for Prometheus の URL を記載します(URL は Amazon Managed Service for Prometheus のマネジメントコンソールから、メトリクスデータの投入先となるワークスペースのページに記載されています)。

local kp =
  (import 'kube-prometheus/main.libsonnet') +
  {
    prometheus+:: {
      prometheus+: {
        spec+: {
          remoteWrite: [{
            url: '<Amazon Managed Service for Prometheus の Endpoint - remote write URL>',
            sigv4: {
              region: 'ap-northeast-1',
            },
            queueConfig: {
              maxSamplesPerSend: 1000,
              maxShards: 200,
              capacity: 2500,
            },
          }]
        }
      }
    },
    values+:: {
      common+: {
        namespace: 'monitoring',
      },
    },
  };

{ 'setup/0namespace-namespace': kp.kubePrometheus.namespace } +
{
  ['setup/prometheus-operator-' + name]: kp.prometheusOperator[name]
  for name in std.filter((function(name) name != 'serviceMonitor' && name != 'prometheusRule'), std.objectFields(kp.prometheusOperator))
} +
{ 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } +
{ 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } +
{ 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } +
{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
{ ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
{ ['kubernetes-' + name]: kp.kubernetesControlPlane[name] for name in std.objectFields(kp.kubernetesControlPlane) }
{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) }

また、途中 IAM ポリシーを作成する際に利用した iam-policy.json の中身は下記のようなものとなります。

{
  "Version": "2012-10-17",
   "Statement": [
       {"Effect": "Allow",
        "Action": [
           "aps:RemoteWrite", 
           "aps:GetSeries", 
           "aps:GetLabels",
           "aps:GetMetricMetadata"
        ], 
        "Resource": "*"
      }
   ]
}

これらを実行することで、下記のように Amazon Managed Service for Prometheus へとメトリクスデータが投入されていることがわかります。

Grafana から Amazon Managed Service for Prometheus へのクエリ

まとめ

今回は AWS signing proxy を利用せず、直接 Prometheus から AWS Signature Version 4 による認証を付与して Amazon Managed Service for Prometheus へメトリクスデータを投入してみました。また、Prometheus のインストールには Prometheus Operator を利用してみました。

上記の内容についてもう少し詳しく聞きたい方はお気軽にカジュアル面談にお申し込みください!


この記事が気に入ったらサポートをしてみませんか?