
Grafana AlloyをAWS IoT Greengrass CoreデバイスにインストールしてGrafanaダッシュボードでログとメトリクスを監視してみた
はじめに
AWS IoT Greengrass Coreデバイスを利用していると、Greengrass関連のログやデバイス側のメトリクスを見たいことってありますよね?
もちろんログマネージャーコンポーネントを導入すればGreengrass関連のログはCloudWatch Logsに出力することが可能ですし、デバイス側のメトリクスもメトリクスコンポーネントやAmazon CloudWatch Agentを導入すれば取得可能です。
ただ、CloudWatch Logsの取り込み料金が気になるな〜、CloudWatch Logsに取り込んだ場合に少しログが見づらいな〜、ツールを一つにまとめたいな〜など色々気になるところもあります。
ということで、偶然手元にGrafana Cloudの環境があったので、Greengrass CoreデバイスにGrafana Alloyを導入してログを可視化してみることにしました。
構成
構成はこんな感じです。

- Greengrass CoreデバイスにAlloyをインストール
- ログ(
/greengrass/v2/logs/*) → Loki - メトリクス(
cpu, memory等) → Prometheus
- ログ(
- LokiとPromethuesはそれぞれGrafana Cloudでホストされているので、受け取ったデータをそのままGrafanaで可視化
前提
Greengrass CoreデバイスはすでにAWS IoT Greengrassに登録済みで動いているものとします。
また、Greengrass CoreデバイスはDockerが利用可能な環境です。
環境の準備
まずはGreengrass CoreデバイスにAlloyをセットアップします。
フォルダ構成は以下のとおりです。
.
├── config.alloy
├── docker-compose.yaml
└── secrets
└── grafana_api_key
シンプルにdocker-compose.yamlとalloyの設定ファイル(config.alloy)
そしてalloyが認証に利用するAPIトークンを保管するsecretsディレクトリを用意します。
APIトークンの発行は後ほど行います。
docker-compose.yaml
今回はホスト側のメトリクスとログを取得できるように設定しています。
イメージは公式のgrafana/alloyを使います。
version: '3.8'
services:
alloy:
image: grafana/alloy:latest
container_name: alloy
user: root
pid: host
ports:
- "12345:12345"
volumes:
- ./config.alloy:/etc/alloy/config.alloy:ro
- ./secrets:/etc/alloy/secrets:ro
- /greengrass/v2/logs:/var/log/greengrass:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/host/root:ro
- alloy_data:/var/lib/alloy/data
command: >
run --server.http.listen-addr=0.0.0.0:12345
--storage.path=/var/lib/alloy/data
/etc/alloy/config.alloy
restart: always
volumes:
alloy_data:
次にalloyの定義ファイルを作成します。
alloy.configでログ、メトリクスをLoki, Prometheusに送信する設定を定義します。
endpointとusernameの取得
alloy.configを作成するにあたりLokiとPrometheusのendpoint urlとusernameを取得する必要があります。
endpointとusernameはGrafana Cloud Portalから確認できます。
Grafana LabsからMy Accountへアクセスして、Grafana Cloud Portalに入ります。

Manage your Grafana Cloud stackのDetailsをクリックします。
自身のアカウントに紐づくStackの一覧がみれます。

LokiとPrometheusのDetailsをクリックすると、urlやusernameを確認できます。

Lokiの場合だとこんな感じです。

この二つは後ほど使うので控えておきます。
トークン発行
次に認証に必要なAPIトークンを発行します。
先ほどに続きGrafana Cloud Portal上で操作します。
まずはアクセスポリシーを作成します。
Access Policies > Create access policy の順に進みます。

logsとmetricsの書き込みを許可するアクセスポリシーを作成します。

次に作成したアクセスポリシーのAdd Tokenからトークンを作成します。


生成されたトークンをsecrets/grafana_api_keyに書き込みます。
これでalloy.configの作成に必要な準備が整いました。
alloy.config
先ほど控えておいたurl, usernameを使ってalloy.configを書いていきます。
今回はログの一部分を抽出してラベル付を行うといったことはしていません、必要に応じて追加してください。
// ========================================
// Grafana Cloud API キー(Loki・Prometheus 共通)
// ========================================
local.file "grafana_api_key" {
filename = "/etc/alloy/secrets/grafana_api_key"
is_secret = true
}
// ========================================
// ログ収集(Greengrass)
// ========================================
// 収集対象のログファイルを指定
// /var/log/greengrass/ 配下の全ての .log ファイルを監視
local.file_match "greengrass_logs" {
path_targets = [{"__path__" = "/var/log/greengrass/*.log"}]
}
// ログファイルを読み取り、Loki に送信
loki.source.file "greengrass_read" {
targets = local.file_match.greengrass_logs.targets
forward_to = [loki.write.grafanacloud.receiver]
}
// Loki への送信設定
loki.write "grafanacloud" {
endpoint {
url = "https://logs-prod-030.grafana.net/loki/api/v1/push"
basic_auth {
username = "123456"
password = local.file.grafana_api_key.content
}
}
// external_labels: 全てのログエントリに自動付与されるラベル
external_labels = {
host = "greengrass_core_device_01",
}
}
// ========================================
// メトリクス収集
// ========================================
// システムメトリクスを取得
prometheus.exporter.unix "core_device_01" {
}
// メトリクスを読み取り、Prometheusに送信
prometheus.scrape "unix" {
targets = prometheus.exporter.unix.core_device_01.targets
forward_to = [prometheus.remote_write.grafanacloud.receiver]
scrape_interval = "60s"
}
// Prometheus への送信設定
prometheus.remote_write "grafanacloud" {
endpoint {
url = "https://prometheus-prod-49-prod-ap-northeast-0.grafana.net/api/prom/push"
basic_auth {
username = "789012"
password = local.file.grafana_api_key.content
}
}
}
コンテナ起動
これで準備が整ったのでコンテナを立ち上げます。
docker-compose up -d
コンテナが起動したので、alloyのコンソールにアクセスしてみます。
今回はホストに手元の端末からアクセスできるようにしているので、http://<ホストのDNS名>:12345/でalloyのコンソールにアクセスします。
全てのコンポーネントでステータスがHealthyになっていることが確認できますね

Graphタブで依存関係も確認しておきます。

依存関係もバッチリです!
Grafanaで可視化
それではログ、メトリクスが保存できているか、Grafana側からクエリを実行して確認してみます。
Connections > Data sources の順に進み、各データソースの名前を検索します。
データソース名は先ほど確認したStack一覧からDetailsをクリックすればデータソース名を確認できます。
まずはLokiにログが保存されていることを確認します。
Exploreを使ってクエリを実行してみます。

今回はhost=greengrass_core_device_01というラベルを付与しているので、{host="greengrass_core_device_01"}でクエリを実行します。

おっ!ログが確認できましたね!
ログをGrafanaで可視化することができれば、ログレベルや文字列でフィルタリングしたり、時間軸もダッシュボード上から簡単に指定することができるので、かなりログ調査が楽になります。
![[CleanShot 2025-12-27 at 14.43.49@2x.png]]
次にメトリクスも確認します。
同じようにPromethuesのデータソースにExploreでクエリを実行します。
こちらもメトリクスが確認できました!
これでGreengrass Coreデバイスのテレメトリデータが取得できていることが確認できました。
Grafana Assistantで原因調査
ログが取れたので試しにGreengrassでエラーを発生した時の原因調査をしてみます。
現在、LokiのデータであればGrafana Assistantからログ調査できるのでやってみます!
Greengrassのカスタムコンポーネントをデプロイする際にエラーが出ることってよくありますよね。
今回はそんなケースでログを調査できるか試してみます。
以下、デプロイ時にエラーが出ていたのでGrafana Assistantに「デプロイ中にエラー出ているので原因調査してください」とお願いしてみました。

複数のログファイルを横断して原因を調査してくれました。
単純なエラーでしたが、ロールエイリアスの権限不足でした。
Greengrassのセットアップ時などはそもそもログをAWSに送る前に躓いて、こういったログ調査を行うために物理デバイスにログインして調査が必要という場面も少なくありません。
また、デバイス側では確認が必要なログが複数のファイルに跨って出力されいたり、ログが見づらかったりと、調査に時間がかかることもよくあります。
これを1つのダッシュボードからリッチな画面で確認できるのは大変ありがたいです。
また、Grafana Assistantを使えば複数のログファイルやメトリクスを横断して調査してくれるのもありがたいですね。
まとめ
今回はGreengrass CoreデバイスにAlloyを導入してGrafanaで可視化する流れを書いてみました。
Grafana CloudがLokiやPrometheusをホストしてくれているので、それぞれサーバーをたてる必要がなく導入ハードルはかなり低いかと思います。
また、お試しだけであればGrafana Cloudの無料範囲内でできたので、面白そう!という方はぜひ試してみてください。










