AzureのサービスからSyslogサーバへのログ保存

Azureのサービスでは「診断設定」でログ保管を行うが、ログの転送先は以下3つ

・Log Analytics ワークスペース

・Azure Event Hubs

・Azure ストレージアカウント

今回はこれらを中継して、Front Door→BLOBストレージ→Syslogサーバのログ転送手順を実施する。

Front Doorの転送設定

リソースの「監視」→「診断設定」から

「+診断設定を追加する」を選択

診断設定の名前を入力し、ストレージアカウントへのアーカイブで対象のBLOBストレージを選択して保存で完了

BLOBストレージでログの確認

BLOBストレージのリソースから「ストレージブラウザ」→「BLOBコンテナー」で見るとlogっぽいのがちらほら。いけてそう?

SyslogサーバーでAzCopy

1.Az Copy v10を入れる > 作業場所:Syslogサーバー

wget https://aka.ms/downloadazcopy-v10-linux -O azcopy.tgz && tar -xzf azcopy.tgz && sudo mv azcopy_linux_*/azcopy /usr/local/bin/

<参考>

AzCopy v10 を使用して Azure Storage にデータをコピーまたは移動する
AzCopy は、ストレージ アカウント間のデータ コピーに利用できるコマンドライン ユーティリティです。 この記事は、AzCopy をダウンロードし、ストレージ アカウントに接続し、データを転送する際に役立ちます。

VMでシステム割り当てマネージドIDを有効化 > 作業場所:Azure ポータル

VMのリソースから「セキュリティ」→「ID」→システム割り当て済みの状態を「オン」にして保存

有効化されるとAzureロールの割り当ての画面が出てくるので設定

ストレージ BLOB データ閲覧者ロールを割り当て

スコープはリソースで対象のストレージを選択する(サブスクリプションやリソーススコープだとうまく動かない)

Azure 組み込みロール - Azure RBAC
この記事では、Azure ロールベースのアクセス制御 (Azure RBAC) の Azure 組み込みロールについて説明します。 Actions、NotActions、DataActions、NotDataActions を一覧表示します...

AzCopyのログイン設定

通常AzCopyでAzureリソースに接続する時はテナントへのログインが求められるが、今回はログを継続してコピーし続ける必要があるので、ログインを自動化する。

sudo vi /etc/systemd/system/blob-sync.service
[Unit]
Description=Sync Blob logs to local Syslog
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
# ここで MSI ログインを自動化
Environment=AZCOPY_AUTO_LOGIN_TYPE=MSI
# 実際に動かすスクリプト
ExecStartPre=/usr/local/bin/azcopy login --identity
ExecStart=/usr/local/bin/blob2syslog.sh
# ログを journal に残す
StandardOutput=journal
StandardError=journal

同期スケジュールの設定

sudo vi /etc/systemd/system/blob-sync.timer
[Unit]
Description=Run blob-sync.service every 30 minutes

[Timer]
OnCalendar=*:0/30
Persistent=true            # VM 再起動後も「経過分」を即実行

[Install]
WantedBy=timers.target


systemd に読み込ませる
sudo systemctl daemon-reload

タイマーを有効化&即起動
sudo systemctl enable --now blob-sync.timer

同期スクリプトを作成して実行権を付ける

sudo vi /usr/local/bin/blob2syslog.sh
#!/usr/bin/env bash
# --- Blob 上のログをローカルへ同期し、Syslog に取り込む ---
set -euo pipefail

SRC="https://<ストレージ名>.blob.core.windows.net/insights-logs-frontdooraccesslog"
TMP="/var/tmp/bloblogs"

# ① Entra ID (Managed Identity) で自動ログイン
#    systemd 環境変数に AZCOPY_AUTO_LOGIN_TYPE=MSI を設定済みなので不要

# ② Blob から差分だけ取得
/usr/local/bin/azcopy sync "$SRC" "$TMP" --recursive --output-level=quiet

# ③ 直近 30 分以内にコピーした *.json を Syslog へ 1 行ずつ送信
find "$TMP" -name '*.json' -mmin -30 -print0 |
  xargs -0 jq -c '.[]' |
  logger -p local0.notice

※ストレージ名はAzureポータルのBLOBストレージリソースから「設定」→「エンドポイント」→「Blob service」で確認

実行権を付与

sudo chmod +x /usr/local/bin/blob2syslog.sh

動作確認

タイマーが登録されているか

systemctl list-timers --all | grep blob-sync

手動で1回実行

sudo systemctl start blob-sync.service

直後にログを確認

journalctl -u blob-sync.service -n 30

Syslogに取り込まれているか

sudo tail -n 20 /var/log/syslog
# または rsyslog の環境によって /var/log/messages

それっぽいのが出たので転送できてそう。

終わりに

systemctl start blob-sync.serviceで一生エラーが出続けたが、RBACのターゲットがリソースを指定せずリソースグループを指定していたからだった。

コメント