はじめに
とある事情でKubernetes Clusterのログ出力を取得するKQL結果をアーカイブすることになったので、備忘録を残します。
対象ユースケース:
- KQLの実行結果をLog Analyticsワークスペース以外で確認したい
- 環境毎にLog Analyticsワークスペースが分かれているので、環境毎にLog Queryをアーカイブしたい
- Log Analyticsワークスペースの保管期間を超えてLog Queryを外部に保管したい
実行環境
Azure CLIが導入済み
az Login済み
PowerShellを実行可能な端末
フォルダ構成
スクリプトに関するフォルダ構成はこのような形になっています。
KQLは非常に長くなることがあるので、別にファイルとして記述しております。
Root Path
├── archive/
│ ├── 202401010000.csv
│ ...
├── log_query/
│ ├── log_query_fuga.txt
│ ...
└── <当該Script>.ps1
引数・環境変数の定義
環境変数をここで定義ています。
変数は、環境とCluster名を使用しています。
param(
[string]$ENV,
[string]$CONTAINER_NAME
)
開発・本番などのLog AnalyticsワークスペースIDを定義しています。
ここではハードコーディングしていますが、必要に応じてグローバル変数に置き換えてください。
日付はログローテーションの為定義しています。
# 開発環境Log Analytics Workspace ID
$WORKSPACEID_DEV = "<Workspace ID for DEV>"
# 本番環境Log Analytics Workspace ID
$WORKSPACEID_PRD = "<Workspace ID for PRD>"
# アーカイブ先のディレクトリ
$ARCHIVE_DIR = "archive"
# 日付
$DATE = Get-Date -Format "yyyyMMddHHmm"
Script内で、KQLファイルが記述されているファイルとScriptとの相対的な位置を使用するので、その為の記述です。
# 現在のディレクトリの位置を記録
$LOCATION_ORG = Get-Location
# スクリプトの位置に移動
$SCRIPT_DIR = $PSScriptRoot
Set-Location $SCRIPT_DIR
詳しくはこちらの記事をご参照ください。
引数の環境変数文字列に応じて、KQLを実行するLog Analyticsワークスペースを切り替えます。
# 引数ENVを大文字に変換
$ENV = $ENV.ToUpper()
# 引数ENVから環境の切り替え
if($ENV -eq "DEV"){
# DEV環境
$WORKSPACEID = $WORKSPACEID_DEV
}
if($ENV -eq "PRD"){
# PRD環境
$WORKSPACEID = $WORKSPACEID_PRD
}
KQLに関する処理
KQLの取得
ファイルとして記載されたKQLを読み込み、実行します。
任意のコンテナー、任意のPod/Jobなど分ける場合、引数となる環境変数が多くなる場合あり。
# 引数CONTAINER_NAMEからLog Queryの取得
$QUERY_PATH = "./log_query/log_query_$CONTAINER_NAME.txt"
KQLの実行
アーカイブ対象となるKubernetes Clusterのログが出力されるLog AnalyticsワークスペースからLog Queryを取得し、結果を格納します。
Write-Host $QUERY
$QUERY = @"
$(Get-Content -Path $QUERY_PATH)
"@
# Log Analyticsから分析結果を取得
$QUERY_RESULT = Invoke-AzOperationalInsightsQuery -WorkspaceId $WORKSPACEID -Query $QUERY
エラーハンドリング
Query応答に応じて、エラーハンドリングをします。
必要に応じて、内容は変えてください。
正常にQueryが返ってきていた場合、対象フォルダにファイル名が日付のCSVファイルがアーカイブされます。
if($QUERY_RESULT.Error){
Write-Host "クエリーにエラーが生じました。: $($QUERY_RESULT.Error)"
exit 1
}
if($QUERY_RESULT.Results){
Write-Host "クエリーの結果をアーカイブします。"
if(-not (Test-Path ./$ARCHIVE_DIR/<任意のアーカイブ先のフォルダ名>)) {
New-Item -ItemType Directory -Path ./$ARCHIVE_DIR/<任意のアーカイブ先のフォルダ名>
}
$QUERY_RESULT.Results | Export-CSV -Path ./$ARCHIVE_DIR/$CONTAINER_NAME/$DATE.csv -Encoding Default
Write-Host "アーカイブ先のパス: ./$ARCHIVE_DIR/<任意のアーカイブ先のフォルダ名>/$DATE.csv"
}
Scriptに書く魔法の言葉
最後の後処理として、Scriptを実行する前のディレクトリに移動します。
# PowerShell Script実行前の位置にディレクトリ移動
Set-Location $LOCATION_ORG
最後に
KQLを実行し、任意のLog AnalyticsワークスペースからLog Queryを取得する処理の流れをご紹介しました。Kubernetes Clusterに限らず、Log Analyticsワークスペースに収集される処理は対応しております。
ご参考になれば幸いです。