0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

とある事情で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ワークスペースに収集される処理は対応しております。
ご参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?