株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

【Citrix DaaS運用者向け】Citrix DaaSのモニターログをPowerShellで自動取得する

こんにちは。ネットワールドCitrix担当の鈴木です。
Citrix DaaSでは、Directorという監視ツールから様々なログを取得することが可能です。例えばセッション接続の履歴、マシンリソース使用率、ログオン時間の統計などのログを閲覧することができます。

これらのログには保持期間が設けられており、基本的にAdvancedエディション利用の場合は31日、Premiumエディション利用の場合は90日です。しかし、組織によっては情報システムの要件として、ログを1年間など長期間保有するよう求められている場合があります。この要件を満たすためには、データをエクスポートしてファイルサーバーなどに保存しておく必要があります。エクスポートはDirectorのGUIからできるのですが、これを定期的に手作業でやるのは大変ですよね。。。

そこで今回は、DirectorのモニターログをPowerShellで自動的に取得するスクリプトをご紹介します。自動化によって、毎月わざわざコンソールにログインしてログを取る、、という面倒な作業からおさらばすることができます。また、うっかり取り忘れてしまった!という事件も防ぐことができると思います。流れとしては、Citrix Cloud APIに対して認証、トークン取得、APIリクエストでログを取得、となります。

イメージ

1. 本記事の目的

Citrix DaaSのモニターログをPowerShellで自動取得する
~自動化によって、時間節約・やり忘れリスク回避 を実現しよう!~

2. 手順

========================================
2-1. 顧客情報と認証情報の取得
2-2. PowerShellスクリプト作成
2-3. Windowsのタスクスケジューラで自動化
========================================

必要なもの:
PowerShellを実行できるマシン
-PowerShellバージョン 今回は5.1.17763.2867で試しました
しかしCitrix Developerサイトには「Ensure that the PowerShell version is 7 or above.」という記述あり。。
(まあ、動けばいいや)
-インターネット経由でスクリプト内記載のURLにアクセス可能であること
-タスクスケジューラが実行できること

2-1. 顧客情報と認証情報の取得

まずはCitrix Cloudから

  • カスタマーID
  • クライアントID
  • クライアントシークレット

の3つの情報を取得します。
コンソールを起動し、左上のバーガーアイコンから[IDおよびアクセス管理]を選択します。
[APIアクセス]タブ > [セキュアクライアント]を展開します。
まずは カスタマーIDを確認します。[顧客IDパラメーターに <カスタマーID> を使用します。] が該当箇所です。

カスタマーID取得

次にクライアントIDとクライアントシークレットを作成します。[セキュアクライアントの名前を入力]に任意の名前を入力し、[クライアントの作成]をクリックします。
クライアントIDとクライアントシークレットが発行されます。いずれの情報も安全な場所へ保管します。[ダウンロード]をクリックするとcsvファイルが発行されます。

クライアントIDとクライアントシークレット

特にクライアントシークレットは再取得ができないので、確実に保管してください。

2-2. PowerShellスクリプト作成

本記事で紹介するスクリプトはGitHubからもご確認いただけます。
github.com

スクリプトの内容を簡単に解説しますと、

  • 手順2-1.で取得した情報を変数に格納
  • トークンを取得する関数GetBearerTokenを定義
  • GetBearerTokenの実行
  • ログデータ取得のためのAPIリクエスト
  • ログデータの出力

となります。
下記6点をご自身の環境に合わせてカスタマイズしてください。

#------------------------------------------------------------------------------------------
# 手順2-1.で取得した情報を変数に格納
#------------------------------------------------------------------------------------------
$customerId = "xxxxxxxxxxxx"                        #(1)カスタマーID
$clientId = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"   #(2)クライアントID
$clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxx"          #(3)クライアントシークレット

(1)(2)(3)
手順2-1.で取得した情報を変数に格納します。

#------------------------------------------------------------------------------------------
# トークンを取得する関数GetBearerTokenの定義
#------------------------------------------------------------------------------------------
function GetBearerToken {

param (
[Parameter(Mandatory=$true)]
[string] $clientId,
[Parameter(Mandatory=$true)]
[string] $clientSecret
)

$body = @{
    grant_type = "client_credentials";
    client_id = $clientId;
    client_secret = $clientSecret
}

$trustUrl = "https://< EndpointBasedOnGeographicalRegion >/cctrustoauth2/root/tokens/clients"  #(4)

$response = Invoke-RestMethod -Uri $trustUrl -Method POST -Body $body

$bearerToken = $response.access_token

return $bearerToken;
}

(4)
$trustUrl = "https://< EndpointBasedOnGeographicalRegion >/cctrustoauth2/root/tokens/clients"< EndpointBasedOnGeographicalRegion > の部分は、ご利用のコントロールプレーンに応じたFQDNを入力してください。
日本リージョン:api.citrixcloud.jp
米国リージョン:api-us.cloud.com
南アジア太平洋リージョン:api-ap-s.cloud.com
EUリージョン:api-eu.cloud.com
例えば日本リージョンをご利用の場合は
$trustUrl = https://api.citrixcloud.jp/cctrustoauth2/root/tokens/clients
となります。

#------------------------------------------------------------------------------------------
# GetBearerTokenの実行
#------------------------------------------------------------------------------------------
$bearerToken = GetBearerToken $clientId $clientSecret
$token = "CwsAuth Bearer="+ $bearerToken



#------------------------------------------------------------------------------------------
# ログデータ(JSON)取得のためのAPIリクエスト
#------------------------------------------------------------------------------------------
$headers = @{
    authorization = $token;
    "Citrix-CustomerId" = $customerId;
}

$url = "https://< EndpointBasedOnGeographicalRegion >/monitorodata/< DataSets >"  #(5)
$result = Invoke-WebRequest -Uri $url -Headers $headers 

(5)
$url = https:// < EndpointBasedOnGeographicalRegion >/monitorodata/< DataSets >< EndpointBasedOnGeographicalRegion >は(4)と同様で、< DataSets >には取得したいデータセットを入力してください。
取得可能なデータセットの一覧は下記サイトからご確認いただけます。
[参考]:About Citrix Monitor Service API
developer-docs.citrix.com

例えばConnectionsは、ログインした端末のIPアドレスやログイン時間などのリストが取得できます。
日本リージョンを使っていて、Connectionsのデータを取得したい場合は
$url = https://api.citrixcloud.jp/monitorodata/connections
となります。

#------------------------------------------------------------------------------------------
# ログデータの出力
#------------------------------------------------------------------------------------------
$filename = Get-Date -Format "yyyy-MMdd-HHmmss"
$result.content | Out-File "< FolderPath >\< FolderName >$filename.json"  #(6)

(6)
$result.content | Out-File "< FolderPath >\< FolderName >$filename.json"
出力するjsonファイルのパスとファイル名を入力してください。

本スクリプトはCUGCのブログ記事およびCitrix Developer用サイトを参考に作成しました。
[参考]:Monitoring Citrix Cloud with OData and PowerShell
www.mycugc.org

[参考]:Citrix Cloud API Overview
developer.cloud.com

2-3. Windowsのタスクスケジューラで自動化

Windowsのタスクスケジューラで、スクリプトを定期的に実行するように設定します。タスクの[操作]の部分はこんな感じで設定します。

タスクスケジューラ 操作

プログラム/スクリプト:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加:
-ExecutionPolicy Bypass ".\MonitorDataFromCC.ps1"
開始:
C:\Work

C:\Work フォルダを作成し、その中に手順2-2.で作成した.ps1ファイルを格納します。
[プログラム/スクリプト]はPowerShellの実行ファイルのパスを入力します。
[引数の追加]は、-ExclusionPolicy Bypass と記述することで実行が制御されないようにします。.ps1ファイル名も入力します。
[開始]は.ps1ファイルを格納したフォルダのパスです。

3. 結果

毎日10時にスクリプト実行するように設定しているのですが、
このようにJSONファイルが取得できることが確認できました!

結果

補足ですが、いざログ解析が必要になった場合は、JSONファイルをExcelで読み込むと表形式に変換できて便利です。
下記サイトが参考になりました!

[参考]:JSONファイルをExcelに変換
qiita.com

4. まとめ

Citrix DaaSのモニターログをPowerShellで自動取得する方法について紹介しました。手順としては、コンソールから顧客情報と認証情報を取得、これらをもとにAPIリクエストで目的のデータセットを取得するスクリプトを作成、タスクスケジューラで定期実行設定、という流れでした。運用の自動化によって、時間の節約とミスの削減に貢献できればいいなと思っています。
最後までお読みいただき、ありがとうございました!

■免責事項■
本記事については、可能な限り正確な情報をお伝えすることに努めておりますが、動作を保証するものではありません。
弊社では本記事の内容によって生じた損害に対する一切の責任を負いかねますので、予めご了承ください。