ノーコードでエアコンの電力消費を可視化する手順(Telegraf + Promethes + Grafana Mimir + Grafana)ではRaspberry Pi環境内ですべて完結していましたが、Grafana Minir
の代わりにAmazon Managed Service for Prometheus (AMP)
を使うことも可能です。
全体構成
用意するもの
ハードウェア
- SwitchBotプラグミニ
- Raspberry Pi 4
前回と同じ環境です。
ソフトウェア
- Telegraf
- Grafana
- AWS SigV4 Proxy
- Amazon Managed service for Prometheus (AMP)
AWS SigV4 Proxy
The AWS SigV4 Proxy will sign incoming HTTP requests and forward them to the host specified in the Host header. You can strip out arbirtary headers from the incoming request by using the -s option.
出典:公式サイト
AWS SigV4 Proxyは、受信したHTTPリクエストに署名し、Hostヘッダで指定されたホストに転送します。 -sオプションを使用すると、受信リクエストからアービタリ・ヘッダーを取り除くことができます。
翻訳:DeepL
Amazon Managed service for Prometheus (AMP)へのアクセスにはAWSのSigV4署名が必要となりますが、TelegrafはSigV4署名に対応していません。AWS SigV4 ProxyはSigV4署名未対応のアプリケーションからの通信をプロキシし、署名を付けてAWSへリクエストを送信してくれます。
SigV4署名に対応していない製品からもAWSに署名を付けたアクセスが可能になります。他にも色々なケースで利用できると思います。
Amazon Managed service for Prometheus (AMP)
Amazon Managed Service for Prometheus は、Prometheus との互換性を持つモニタリングおよびアラートサービスです。このサービスにより、コンテナ化されたアプリケーションとインフラストラクチャの大規模なモニタリングを簡単に行えるようになります。
出典:公式サイト
AWSマネージドなPrometheusサーバーです。(名前が長い) 利用料は書き込んだメトリクスの量とストレージ容量での従量課金となります。
GrafanaのAWSマネージド・サービスとしてAmazon Managed Grafanaもあります。
Amazon Managed service for Prometheus (AMP)
ワークスペースの作成
マネジメントコンソールでAMPの管理画面を開きます。
作成
ボタンをクリックします。
WorkSpace エイリアス
を入力し、ワークスペースを作成する
ボタンをクリックします。
エンドポイント - リモート書き込み URL
、Workspace ID
、エンドポイント - クエリ URL
は後で使用しますのでメモしておきましょう。
設定と呼べる設定はありませんでした。
IAMポリシーとユーザーの作成
AMPへのアクセスにIAMユーザーのアクセスキーとシークレットアクセスキーが必要です。
必要なポリシーはこちら
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"aps:RemoteWrite",
"aps:QueryMetrics",
"aps:GetMetricMetadata",
"aps:GetLabels",
"aps:GetSeries"
],
"Resource": "arn:aws:aps:ap-northeast-1:[AWSアカウントID]:workspace/[Workspace ID]"
}
]
}
aps:RemoteWrite
がRemote Wirteする際に必要で、その他はGrafanaでクエリーする際に必要なアクションとなります。
略称はAMP
ですが、アクションの接頭辞はaps
です。
ややこしや~
AWS SigV4 Proxy
次にSigV4 Proxyの設定を行います。
.aws
ディレクトリを作成し先ほど作成したIAMユーザーの認証情報を.aws/config
と.aws/credentials
に設定します。
docker-compose.yamlのservice
セクションに以下を記述します。
- docker-compose.yaml (抜粋)
aws-sigv4-proxy:
image: public.ecr.aws/aws-observability/aws-sigv4-proxy
volumes:
- ./.aws:/root/.aws
expose:
- 8080
environment:
- AWS_SDK_LOAD_CONFIG=true
command: [
"--name", "aps",
"--region", "ap-northeast-1",
"--host", "aps-workspaces.ap-northeast-1.amazonaws.com",
"-v"
]
コンテナイメージはDocker HubではなくECR Publicで公開されています。GitHubにはDockerfileが用意されているので自前でビルドすることも可能です。
SwitchBot APIから電力消費量を取得
前回の記事を参考にしてください。
Telegraf
前回はOutputプラグインとしてPrometheus Client
を利用しましたが、Telegrafから直接Remote Wirteできることがわかりましたので、変更しました。
種別 | Plugin名 | 内容 |
---|---|---|
Input | HTTP | 1つまたは複数の HTTP(または HTTPS)エンドポイントからメトリックスを収集します。エンドポイントは、サポートされている入力データ形式の 1 つでフォーマットされたメトリッ クを持っている必要があります。各データ形式は、入力設定に追加できる独自の設定オプションのセットを持っています。 |
Output | HTTP | HTTP 出力プラグインは、出力データ形式の 1 つを使用してエンコードされた HTTP メッセージでメトリックスを送信します。バッチ処理をサポートする data_formats の場合、メトリクスはバッチ処理で送信されます。 |
HTTP OutputプラグインでPrometheus Remote Writeを行う方法はこちらに記載がありました。
https://github.com/influxdata/telegraf/tree/master/plugins/serializers/prometheusremotewrite
- telegraf.conf (抜粋)
[[outputs.http]]
## URL is the address to send metrics to
url = "http://aws-sigv4-proxy:8080/workspaces/[Workspace ID]/api/v1/remote_write"
## Data format to output.
data_format = "prometheusremotewrite"
[outputs.http.headers]
Content-Type = "application/x-protobuf"
Content-Encoding = "snappy"
X-Prometheus-Remote-Write-Version = "0.1.0"
url
がSigV4 Proxy宛になっていることがポイントです。
Grafana
バージョン7.3.5以降でSigV4による署名がサポートされたようです。
SigV4による署名を有効にするには環境変数でAWS_SDK_LOAD_CONFIG=true
とGF_AUTH_SIGV4_AUTH_ENABLED=true
を指定する必要があります。
参考サイト https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-query-standalone-grafana.html
- docker-compose.yaml (抜粋)
grafana:
image: grafana/grafana-oss
ports:
- "3000:3000"
volumes:
- grafana-storage:/var/lib/grafana
environment:
- AWS_SDK_LOAD_CONFIG=true
- GF_AUTH_SIGV4_AUTH_ENABLED=true
docker compose up
後、データソース設定の際にAuth
部分のSigV4 auth
を有効にした上で、SigV4 Auth Details
にてアクセスキーとシークレットアクセスキーを指定します。
URL欄はhttps://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/[Workspace ID]/
を入力します。
リージョンの指定も必要です。
以上で設定完了です。
- docker-compose.yaml (全体)
version: '3'
services:
grafana:
image: grafana/grafana-oss
ports:
- "3000:3000"
volumes:
- grafana-storage:/var/lib/grafana
environment:
- AWS_SDK_LOAD_CONFIG=true
- GF_AUTH_SIGV4_AUTH_ENABLED=true
telegraf:
image: telegraf
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
aws-sigv4-proxy:
image: public.ecr.aws/aws-observability/aws-sigv4-proxy
volumes:
- ./.aws:/root/.aws
expose:
- 8080
environment:
- AWS_SDK_LOAD_CONFIG=true
command: [
"--name", "aps",
"--region", "ap-northeast-1",
"--host", "aps-workspaces.ap-northeast-1.amazonaws.com",
"-v"
]
volumes:
grafana-storage:
おまけ
電力量と電気料金を算出してみました。
扇風機
1時間使用した場合
洗濯機
1回の選択
在宅勤務
ノートPCとモニターの消費電力。9:00~19:00の合計
12:00~13:00の休憩中は電力消費も抑えられるんですね