Azure Local は新しい更新プログラムが提供され、適用準備が完了している場合、Azlure Local クラスターのブレードに未適用の更新プログラムが存在していること示すメッセージが表示されます。
この仕組みを使用して、Azure Local クラスターで未適用の更新プログラムが存在し、適用準備ができている環境があった場合に、Azure Monitor からアラートを通知することができるかを検証した際の内容となります。
Azure Local のクラスターのシステムアラートの「UpdateAvailable」の警告としても、未適用のアップデートは検知されているようですので、Azure Monitor のルールを手動で作成しての通知 / 分析情報を取得しアラート処理ルールを使用して通知の 2 種類の方法で通知ができそうでした。
Azure Monitor を使用した通知
前述のとおり、未適用の更新プログラムが存在している場合、Azure Local クラスターのブレードを開いた際に表示が行われます。
この時の情報ですが、Azure Resource Graph の ExtensibilityResources の情報から取得が行われているようです。
Azure Resource Graph Explorer から次のクエリを実行すると、Azure Local クラスターの更新プログラムの適用情報のサマリーを取得し、更新プログラムの適用準備ができているクラスターの取得ができます。
ExtensibilityResources | where type =~ 'microsoft.azurestackhci/clusters/updateSummaries' | where properties.state =~'UpdateAvailable'
この情報を Azure Monitor ログで取得することで、更新プログラムの適用準備ができたタイミングで通知を行うことができます。
Azure Resource Graph と Log Analytics を使用してアラートを作成する 等でサンプルが公開されていますが、Azure Monitor ログから Resource Graph にアクセスする際には「arg("")」を使用することでアクセスができます。
これを使用して、次のクエリを使用してアラートを作成することで、Azure Local に適用可能な更新プログラムの準備ができたタイミングで、通知を行うことができます。
arg("").ExtensibilityResources | where type =~ 'microsoft.azurestackhci/clusters/updateSummaries' | where properties.state =~'UpdateAvailable' | project resourceGroup, cluster=extract(@"/clusters/([^/]+)", 1, id), properties.state, properties.currentVersion, systemData.CreatedAt,systemData.LastModifiedAt
properties.state を調整すれば、任意の状態になった場合に通知することも可能ですので、基本形が把握できていればいろいろと活用できるのではないでしょうか。
頻繁にアラートが飛ぶのを抑制する場合には、測定 / アラートロジックの間隔を調整し、
アラートのミュート期間を調整することで、1 日の中で何度もアラートが送信されてくるのを抑制することができます。
分析情報の有効化によるアラートの通知
Azure Local の 分析情報 (Insights) を有効化することで、未適用の更新プログラムの検知を行うこともできそうです。
分析情報の「正常性」でも UpdateAvailable の検知が行われていました。
これは次のようなクエリで情報の参照が行われているようです。
Event | where EventLog =~ "Microsoft-Windows-Health/Operational" | extend description = parse_json(RenderedDescription) | extend CorrelationId = tostring(description.CorrelationId) | where CorrelationId =~ 'a24502f4-f511-4fe3-94ee-f7064d242393' | where tostring(description.Fault.RootObjectType) == 'Microsoft.Health.EntityType.Cluster' | extend Fault = description.Fault | extend ShortDescription = split(tostring(Fault.Type), '.')[-1] | extend Severity = toint(Fault.Severity) | extend FaultingResourceType = split(tostring(Fault.ObjectType), '.')[-1] | extend FaultingResourceId = tostring(Fault.ObjectId) | extend ReportedTime = datetime_add('Microsecond', tolong(Fault.Timestamp) / 10, make_datetime(1601, 1, 1)) | extend Detail = pack( "Severity", iff(Severity == 0, "Healthy", iff(Severity == 1, "Warning", iff(Severity == 2, "Critical", "Unknown"))), "Faulting Resource ID", FaultingResourceId, "Faulting Resource Type", FaultingResourceType, "Reported Time", ReportedTime, "Short Description", ShortDescription, "Description", tostring(Fault.Description), "Remediation", tostring(Fault.Remediation) ) | sort by ReportedTime asc | project ShortDescription, Detail, FaultingResourceType, FaultingResourceId, Severity, ReportedTime
分析情報を有効にすると、Azure Local の 「Microsoft-Windows-Health/Operational」のイベントが データ収取ルール で取得が行われます。
アラート処理ルール として、Azure Local のリソースまたはリソースグループに対して処理ルールを設定しておくことで検知されたアラートを通知することができます。
個別にアラートを設定するよりは、分析情報経由でアラート処理ルールを使用したほうが汎用性がありそうですね。