Amazon Managed Service for Prometheus 触ってみた

(2021-09-30 追記)
Preview 状態だった Amazon Managed Service for Prometheus が Generally Available となりました。めでたい！


https://aws.amazon.com/jp/blogs/aws/amazon-managed-service-for-prometheus-is-now-generally-available-with-alert-manager-and-ruler/

Preview 時に提供されていなかった alert manager 関連の機能が利用できるようになり、また、利用できるリージョンが 9 に増えました（東京も追加されました）！

(追記ここまで)

皆さん AWS re:Invent は楽しんでおりますか！
12 月は 12/18 まで開催中ですので、まだの人は見てみましょう！

https://reinvent.awsevents.com/

自分は今年の夏に EKS へ移行するのに合わせて、Kubernetes 上に Airflow, Grafana, Prometheus を苦しみながら導入したのですが、全部 Managed Service としてあっけなく発表されてしまいました。
ただ、これらのサービスを AWS Managed のサービスとしてではなく構築・運用したことで、それぞれのサービスについての概念・知見を習得することができたので後悔はしておりません。

さて EKS 上で管理している Prometheus についてですが、

- メモリを食いまくって落ちる
- インターネット経由して一定のセキュリティを担保した上でメトリクスを格納 & クエリしたい

といった困り・要望があり、ちょうどなんとかしないとなぁと思っていたところでした。
今回発表された Prometheus のマネージドサービスである Amazon Managed Service for Prometheus ですべて解決しそうだったのでどんなものかと触ってみたので共有します。

話は脱線しますが、EKS 移行劇については下記 note にまとめてありますので、ご興味ある方はどうぞ！

https://note.com/tyrwzl/n/n14703cfca236

# Amazon Managed Service for Prometheus について
Prometheus について詳しくは説明しません、他の記事をあたってください。

Amazon Managed Service for Prometheus は Prometheus 互換のメトリクスデータを格納したり、格納したデータをクエリしたりできるサービスみたいです。
Prometheus Exporter などを利用して、Amazon Managed Service for Prometheus にメトリクスを格納し、Grafana から Amazon Managed Service for Prometheus に対してメトリクスをクエリしてグラフとして確認する、といったように利用できます。
Prometheus のマネージドサービスといいましたが、「Prometheus で収集したメトリクスデータの格納庫」がイメージとしては近いのでしょうか。
そもそものスタンスとして Prometheus はメトリクスを永続保存しません。
永続保存したい場合、Thanos や Cortex といった別のサービスを使ってメトリクスデータを保管しておく必要がありました (弊社では Thanos を採用、Amazon Managed Service for Prometheus は Cortex を利用しているみたい)。
したがって、Amazon Managed Service for Prometheus を利用しても、コンテナからメトリクスをスクレイプしたりする Exporter などは自前でデプロイする必要がありますし、格納したデータをグラフなどで確認するには Grafana なども自前で用意する必要があります。
Grafana に関しては Amazon Managed Service for Grafana がありますね！(絶賛プレビュー申し込み中)。

## 誰が使うべき？
さて、Amazon Managed Service for Grafana のターゲットユーザー、使って得する人は誰でしょう？
そこは流石 AWS、きちんと FAQ に記載されていました。


> Q: Why should I use Amazon Managed Service for Prometheus?
You should use AMP if you have adopted an open source-based monitoring strategy, have already deployed or plan to adopt Prometheus for container monitoring, and prefer a fully managed experience where AWS provides enhanced security, scalability, and availability.
 
> Q: How does Amazon Managed Service for Prometheus relate to Amazon CloudWatch? Which one should I use?
You should use Amazon CloudWatch if you are looking for a comprehensive observability service that brings together logs, metrics, tracing, dashboarding, and alerting in a unified experience that encompasses AWS services, EC2, containers, and serverless.
You should use AMP if you are running containers and want a service that is fully compatible with the Prometheus open source project. You should also choose AMP if you are already running Prometheus and are looking to eliminate that ongoing operational cost while also improving security.

(https://aws.amazon.com/jp/grafana/faqs/ から抜粋)


既に Prometheus を利用してモニタリングシステムを構築していて、運用コストに嫌気が指している人をターゲットにしていそうです。
Amazon Managed Service for Prometheus を利用することで、収集したメトリクスデータの管理などについて気にかける必要がなくなります。

## 主要な機能

下記ドキュメントから読み取れたことを記載します。

https://docs.aws.amazon.com/prometheus/index.html

### セキュリティ
Amazon Managed Service for Prometheus ではメトリクスデータの格納と取得を実施するのに AWS IAM の認証情報が格納された AWS Signature Version 4 の署名が必要です。
したがって、AWS IAM によるセキュリティ機能の上に Prometheus を利用することができます。
更にインターネット経由でメトリクスデータのやり取りをしたくないユースケースのために、VPC Endpoint (Interface 型) を利用することができます。


### 可用性
メトリクスデータについてはドキュメントを確認する限り、Multi-AZ での保管をしており、3 AZ への展開をしています
データはまず EBS に保管し、その後 S3 に保存しているとのことです。

### データ保管期間
現時点では 150 日の保管期間のみしか選択できません。


### alert manager
2021-09-30 から alert manager の機能が利用できます。また、通知先として SNS を選択できるため、SNS → Lambda を経由して柔軟な通知を実行することができます。

### リージョン
下記 9 リージョンで利用できます。

- US East (N. Virginia)
- US East (Ohio)
- US West (Oregon)
- Europe (Frankfurt)
- Europe (Ireland)
- Europe (Stockholm)
- Asia Pacific (Singapore)
- Asia Pacific (Sydney)
- Asia Pacific (Tokyo).

# Amazon Managed Service for Prometheus 触ってみた with EKS 

下記ブログを参照したので、ブログを読んだ人は下記を読まないでください。
ただ、リージョンをまたいで使えるか検証したかったので、そこが気になる場合や日本語で読みたい場合は読んでください。

https://aws.amazon.com/jp/blogs/mt/getting-started-amazon-managed-service-for-prometheus/

下記のようにリージョンをまたいでいます。

| リソース |リージョン|
|----|----|
| Amazon Managed Service for Prometheus  |  us-east-1  |
| EKS |  ap-northeast-1  |

なお、下記では AWS CLI や eksctl、kubectl, helm を利用するのでそれらが利用可能、かつ、それぞれの認証情報が揃っている shell 環境が必要です、


## Amazon Managed Service for Prometheus の作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/08b06cd2-acbf-08e5-81c6-bd9e9c9ca0c9.png)

AWS マネジメントコンソールにログインして、Amazon Managed Service for Prometheus のページ (https://console.aws.amazon.com/prometheus/home) に行きましょう。
Amazon Managed Service for Prometheus はプレビュー状態ですが、プレビュー申請は不要です。
上記画像のようにサクッと workspace を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/684e4900-9120-f49b-60d5-03d2c9ed8ca9.png)

すると数秒後に Status が ACTIVE となってリソースが作成されます。
リソースが作成されると 2 種類の HTTP Endpoint (Endpoint - remote write URL, Endpoint - query URL) が発行され、それぞれメトリクスデータを格納するものと格納したメトリクスデータをクエリするものとなります。
なお、これらの URL はパブリックにアクセス可能な模様です。

```
$ dig aps-workspaces.us-east-1.amazonaws.com +short
3.223.166.82
100.24.159.220
52.70.212.28
54.210.4.8
35.169.187.85
54.243.211.98
```

## IAM ロール、プロバイダーの作成

次に Amazon Managed Service for Prometheus へメトリクスデータを格納、格納したメトリクスデータを取得するのに利用する IAM リソースを作成します。
ブログにて用意されている下記 bash スクリプトを実行します。
書き換えなければならないのは 1 行目の ```YOUR_EKS_CLUSTER_NAME``` と、今回 EKS が ap-northeast-1 にあるので最後の行の eksctl に ```--region``` パラメータを渡しているところです。

上記スクリプトを実行すると下記のようになります
エラー文が出力されているように見えますが、問題ありません

```
✦ ❯ bash init.sh 
Creating a new trust policy

An error occurred (NoSuchEntity) when calling the GetRole operation: The role with name EKS-AMP-ServiceAccount-Role cannot be found.
Appending to the existing trust policy

An error occurred (NoSuchEntity) when calling the GetPolicy operation: Policy arn:aws:iam::XXXXXXXXXX:policy/AWSManagedPrometheusWriteAccessPolicy was not found.
Creating a new permission policy AWSManagedPrometheusWriteAccessPolicy
{
    "Policy": {
        "PolicyName": "AWSManagedPrometheusWriteAccessPolicy",
        "PolicyId": "ANPARVSLQ63UWTO7GOCOY",
        "Arn": "arn:aws:iam::XXXXXXXXXX:policy/AWSManagedPrometheusWriteAccessPolicy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2020-12-17T12:50:08+00:00",
        "UpdateDate": "2020-12-17T12:50:08+00:00"
    }
}

An error occurred (NoSuchEntity) when calling the GetRole operation: The role with name EKS-AMP-ServiceAccount-Role cannot be found.
EKS-AMP-ServiceAccount-Role role does not exist. Creating a new role with a trust and permission policy
arn:aws:iam::XXXXXXXXXX:role/EKS-AMP-ServiceAccount-Role
[ℹ]  eksctl version 0.30.0
[ℹ]  using region ap-northeast-1
[ℹ]  will create IAM Open ID Connect provider for cluster "eks-cluster" in "ap-northeast-1"
[✔]  created IAM Open ID Connect provider for cluster "eks-cluster" in "ap-northeast-1"
```

IAM のページに行くと、下記のように IAM ロールが作成されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/968c4bc3-5340-ddd5-bb45-036bd7852038.png)


## Prometheusのインストール

Amazon Managed Service for Prometheus を触るために、なんか適当なデータを投入しなければなりません。
ということで、Prometheus を EKS にインストールします。
Helm を使ってコマンドを実行するだけです。

```
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

$ kubectl create ns prometheus
namespace/prometheus created

$ helm install prometheus-for-amp prometheus-community/prometheus -n prometheus
NAME: prometheus-for-amp
LAST DEPLOYED: Thu Dec 17 12:56:30 2020
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-for-amp-server.prometheus.svc.cluster.local


Get the Prometheus server URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9090


The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-for-amp-alertmanager.prometheus.svc.cluster.local


Get the Alertmanager URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9093
#################################################################################
######   WARNING: Pod Security Policy has been moved to a global property.  #####
######            use .Values.podSecurityPolicy.enabled with pod-based      #####
######            annotations                                               #####
######            (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) #####
#################################################################################


The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
prometheus-for-amp-pushgateway.prometheus.svc.cluster.local


Get the PushGateway URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9091

For more information on running Prometheus, visit:
https://prometheus.io/
```

下記のように ```prometheus``` ネームスペースに Prometheus 関連の POD が作成されていることがわかります。

```
$ k get po -n prometheus
NAME                                                    READY   STATUS    RESTARTS   AGE
prometheus-for-amp-alertmanager-5cb9f4478c-km4ht        2/2     Running   0          6m26s
prometheus-for-amp-kube-state-metrics-bc9cb958f-l7p7k   1/1     Running   0          6m26s
prometheus-for-amp-node-exporter-69qsw                  1/1     Running   0          6m27s
prometheus-for-amp-node-exporter-bg4ss                  1/1     Running   0          6m26s
prometheus-for-amp-node-exporter-fs74x                  1/1     Running   0          6m26s
prometheus-for-amp-pushgateway-56ff9d9d99-4z2sf         1/1     Running   0          6m26s
prometheus-for-amp-server-7f6d6fcf59-kpl5m              2/2     Running   0          6m26s
```


## AWS signing proxy のデプロイ

(2021-04-16 追記)
Prometheus 2.26.0 から Prometheus ネイティブでの AWS Signature Version 4 認証のサポートが導入されました。
Prometheus 2.26.0 を利用する場合は AWS signing proxy コンテナは不要となります。

https://aws.amazon.com/jp/blogs/opensource/prometheus-2-26-0-adds-aws-signature-version-4-support/

Prometheus 2.26.0 を利用する場合の手順は下記に記載されています。
https://aws.amazon.com/jp/blogs/mt/getting-started-amazon-managed-service-for-prometheus/

(2021-04-16 追記 ここまで)

先述したとおり、Amazon Managed Service for Prometheus にメトリクスデータを投入・取得するには AWS Signature Version 4 の署名が必要です。
先の Helm テンプレートは Amazon Managed Service for Prometheus のための Prometheus ではなく、AWS Signature Version 4 の署名を含める仕組みが用意されていません。
これを実現してくれるのが AWS signing proxy というもので、Prometheus のサイドカーコンテナとしてデプロイします。

ブログのに記載のある YAML をコピー & 自分の環境に合わせて上書きしてもいいのですが、Amazon Managed Service for Prometheus のマネジメントコンソールにも同じものが用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/bba6342a-a4bd-5e62-58b0-1170c8ee88cc.png)

マネジメントコンソールの YAML の場合は ```annotations``` の ```eks.amazonaws.com/role-arn``` の値を「IAM ロール、プロバイダーの作成」で作成した IAM ロール (arn:aws:iam::<AWS アカウント ID>:role/EKS-AMP-ServiceAccount-Role)の ARN に書き換えるだけで OK です。

YAML が用意できたら Helm テンプレートの Value として渡して再度 Prometheus をデプロイします。

```
$ helm upgrade --install prometheus-for-amp prometheus-community/prometheus -n prometheus -f ./amp_ingest_override_values.yaml

Release "prometheus-for-amp" has been upgraded. Happy Helming!
NAME: prometheus-for-amp
LAST DEPLOYED: Thu Dec 17 13:03:23 2020
NAMESPACE: prometheus
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-for-amp-server.prometheus.svc.cluster.local


Get the Prometheus server URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9090


The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-for-amp-alertmanager.prometheus.svc.cluster.local


Get the Alertmanager URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9093
#################################################################################
######   WARNING: Pod Security Policy has been moved to a global property.  #####
######            use .Values.podSecurityPolicy.enabled with pod-based      #####
######            annotations                                               #####
######            (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) #####
#################################################################################


The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
prometheus-for-amp-pushgateway.prometheus.svc.cluster.local


Get the PushGateway URL by running these commands in the same shell:
  export POD_NAME=$(kubectl get pods --namespace prometheus -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
  kubectl --namespace prometheus port-forward $POD_NAME 9091

For more information on running Prometheus, visit:
https://prometheus.io/
```


デプロイされたものを確認すると、Prometheus Server のみ再デプロイされています。

```
$ k get po -n prometheus
NAME                                                    READY   STATUS              RESTARTS   AGE
prometheus-for-amp-alertmanager-5cb9f4478c-km4ht        2/2     Running             0          7m10s
prometheus-for-amp-kube-state-metrics-bc9cb958f-l7p7k   1/1     Running             0          7m10s
prometheus-for-amp-node-exporter-69qsw                  1/1     Running             0          7m11s
prometheus-for-amp-node-exporter-bg4ss                  1/1     Running             0          7m10s
prometheus-for-amp-node-exporter-fs74x                  1/1     Running             0          7m10s
prometheus-for-amp-pushgateway-56ff9d9d99-4z2sf         1/1     Running             0          7m10s
prometheus-for-amp-server-0                             0/3     ContainerCreating   0          17s
```

詳細を確認してみるとサイドカーコンテナがついていることがわかります。

```
$ k describe po prometheus-for-amp-server-0  -n prometheus
Name:         prometheus-for-amp-server-0

...

Containers:
  prometheus-server-configmap-reload:
    Container ID:  docker://51f6c62b778acb9b6c895b7dc6f14efe54f9747ed07936206be487fe4227a2ef
    Image:         jimmidyson/configmap-reload:v0.4.0

...

  prometheus-server:
    Container ID:  docker://35840c35fcad0428b5568f469cd2e28209cda1eab52dc135bee1a1d8693546d7
    Image:         quay.io/prometheus/prometheus:v2.22.1

...

  aws-sigv4-proxy-sidecar:
    Container ID:  docker://6897c52c5114bee6886e254c8c526c80ce2f94fcd807ae202f4b5491bbbc6bdb
    Image:         public.ecr.aws/aws-observability/aws-sigv4-proxy:1.0

...


Events:
  Type    Reason                  Age   From                                                    Message
  ----    ------                  ----  ----                                                    -------
  Normal  Scheduled               50s   default-scheduler                                       Successfully assigned prometheus/prometheus-for-amp-server-0 to ip-10-0-44-92.ap-northeast-1.compute.internal
  Normal  SuccessfulAttachVolume  47s   attachdetach-controller                                 AttachVolume.Attach succeeded for volume "pvc-c1a0ad74-fe75-4646-86d8-61c51e320f87"
  Normal  Pulling                 40s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Pulling image "jimmidyson/configmap-reload:v0.4.0"
  Normal  Pulled                  35s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Successfully pulled image "jimmidyson/configmap-reload:v0.4.0"
  Normal  Created                 35s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Created container prometheus-server-configmap-reload
  Normal  Started                 35s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Started container prometheus-server-configmap-reload
  Normal  Pulling                 35s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Pulling image "quay.io/prometheus/prometheus:v2.22.1"
  Normal  Pulled                  24s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Successfully pulled image "quay.io/prometheus/prometheus:v2.22.1"
  Normal  Created                 23s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Created container prometheus-server
  Normal  Started                 23s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Started container prometheus-server
  Normal  Pulling                 23s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Pulling image "public.ecr.aws/aws-observability/aws-sigv4-proxy:1.0"
  Normal  Pulled                  19s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Successfully pulled image "public.ecr.aws/aws-observability/aws-sigv4-proxy:1.0"
  Normal  Created                 19s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Created container aws-sigv4-proxy-sidecar
  Normal  Started                 19s   kubelet, ip-10-0-44-92.ap-northeast-1.compute.internal  Started container aws-sigv4-proxy-sidecar
```



# Grafana のデプロイ

さて、Amazon Managed Service for Prometheus にメトリクスデータを投入できたか確認してみましょう。
Amazon Managed Service for Grafana のプレビュー申請が通ってないので、Grafana をデプロイします。

```
$helm repo add grafana https://grafana.github.io/helm-charts
"grafana" has been added to your repositories

$kubectl create ns grafana
namespace/grafana created

$helm install grafana-for-amp grafana/grafana -n grafana
NAME: grafana-for-amp
LAST DEPLOYED: Thu Dec 17 13:08:08 2020
NAMESPACE: grafana
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace grafana grafana-for-amp -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana-for-amp.grafana.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:

     export POD_NAME=$(kubectl get pods --namespace grafana -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana-for-amp" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace grafana port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################
```

Prometheus の場合と同様に AWS signing proxy をデプロイします (必要な YAML は Amazon Managed Service for Prometheusのマネジメントコンソールにはないのでブログを参照してください)。

```
$ helm upgrade --install grafana-for-amp grafana/grafana -n grafana -f ./amp_query_override_values.yaml
Release "grafana-for-amp" has been upgraded. Happy Helming!
NAME: grafana-for-amp
LAST DEPLOYED: Thu Dec 17 13:08:47 2020
NAMESPACE: grafana
STATUS: deployed
REVISION: 2
NOTES:
1. Get your 'admin' user password by running:

   kubectl get secret --namespace grafana grafana-for-amp -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana-for-amp.grafana.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:

     export POD_NAME=$(kubectl get pods --namespace grafana -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana-for-amp" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace grafana port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin
#################################################################################
######   WARNING: Persistence is disabled!!! You will lose your data when   #####
######            the Grafana pod is terminated.                            #####
#################################################################################
```

デプロイが完了したら、まず Grafana POD の名前を確認してから ```kubectl port-forward``` を利用してローカルのブラウザで開けるようにします。
(自分は Cloud9 上で実行したので 8080 番にフォワードしています。)


```
$ k get po -n grafana
NAME                               READY   STATUS    RESTARTS   AGE
grafana-for-amp-79d5454dbc-ghhp8   1/1     Running   0          3h42m
$ kubectl port-forward -n grafana pods/grafana-for-amp-79d5454dbc-ghhp8 8080:3000
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/36fe4d57-f410-d9b3-5ab3-3b9c16248105.png)


うまくいくと上記のようにログイン画面が出ます。
パスワードは下記コマンドで確認します

```
$ kubectl get secrets grafana-for-amp -n grafana -o jsonpath='{.data.admin-password}'|base64 --decode
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/f823940e-01bb-8e05-1702-433a26c4bfd1.png)


ログインできたら Grafana に Prometheus の設定をします。
Grafana のページ左側、歯車マークをクリックして "Data Sources" をクリックして、"Prometheus" を選択します。
すると上記のような画面が出るので、

- HTTP > URL: Amazon Managed Service for Prometheus のマネジメントコンソールの Endpoint - query URL
- Auth > SigV4 auth: ON
- SigV4 Auth Details > Authentication Provider: AWS SDK Default
- SigV4 Auth Details > Default Region: us-east-1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/479ca03a-9319-e0fe-f7e1-f892b70bac71.png)


設定終わったら上記画像のように Grafana のページの下の方に "Save & Test" というボタンがあるのでクリックして、"Data source is working" と出れば設定完了です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562414/3b3d563d-9f72-f3c6-8e1f-347e5d296d96.png)


実際にメトリクスデータをクエリしてみます。
Grafana のページ左側、コンパスマークをクリックします。
"Metrics" の右脇にクエリしたいメトリクス名を入力して右上のボタンをクリックするとグラフが表示されます。


# 今後試したいこと
今回はサラッと触っただけなので、メトリクスの数を増やして自前の Prometheus 環境とクエリ速度を比べたり、料金コストの比較をしてみたいと思います。

また、文頭の方で自前の Prometheus に対して「インターネット経由して一定のセキュリティを担保した上でメトリクスを格納 & クエリしたい」という要望を出していたのですが、これはカナリアリリースのために Spinnaker のカナリア分析ツール Kayenta で Prometheus のメトリクスを利用したいために出たものとなります。
なので、今後 kayenta で素直に Amazon Managed Service for Prometheus が利用できるか、Istio を利用しているので Istio Proxy と AWS signing proxy が共存できるのかなどを検証していきたいと思います。