Azure AutomationのエラーをLog Analyticsで検知する

Automationのエラーを検知する方法です。
Automationのジョブ自体が失敗した場合はポータルからひと目で分かりますが、ジョブは正常終了しているものの、内部的にエラーメッセージを吐いているケースがあります。
その場合は、ジョブを1つずつ選択して、確認していかなければならず、非常に手間の掛かる作業です。
Log Analyticsを活用して検知させてみます。

# OMSワークスペース作成

* [新規]からLog Analyticsを選択して新規作成します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c950aa97-a895-bb08-9b6e-010582512b63.png)


* 任意の値を入力し、[OK]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6c2c558f-bbe5-2ea2-9460-9e8fd838cc14.png)

* 作成されたリソースに移動し、OMSポータルを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4c049569-164f-4504-ce5e-63aa8612e5eb.png)

* OMSポータル画面が表示されればOKです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0361ee71-9151-ad78-d909-850b2daadbd8.png)

# Cloud Shell起動

Cloud Shell PowerShellを選択します。手順は公式ページ参照。
[Cloud Shell クイックスタート](https://docs.microsoft.com/ja-jp/azure/cloud-shell/quickstart-powershell)

# OMSワークスペースとAutomationアカウントの統合

* Cloud Shellで以下のコマンドを実行し、アラート検知したいAutomationアカウントのリソースIDを取得します  
  出力結果の、ResourceIdを保存しておきます

```
Find-AzureRmResource -ResourceType "Microsoft.Automation/automationAccounts"
```

* OMSワークスペースのリソースIDを取得します  
  出力結果の、ResourceIdを保存しておきます

```
Find-AzureRmResource -ResourceType "Microsoft.OperationalInsights/workspaces"
```

* OMSとAutomationを統合します

```
Set-AzureRmDiagnosticSetting -ResourceId $automationAccountId -WorkspaceId $workspaceId -Enabled $true
```

* 結果確認  

```
Get-AzureRmDiagnosticSetting -ResourceId $automationAccountId
```

* 以下のようにEnabledがTrueになっていればOKです

```
Logs
    Category        : JobLogs
    Enabled         : True
    RetentionPolicy
    Enabled : False
    Days    : 0


    Category        : JobStreams
    Enabled         : True
    RetentionPolicy
    Enabled : False
    Days    : 0


    Category        : DscNodeStatus
    Enabled         : True
    RetentionPolicy
    Enabled : False
    Days    : 0
```

* Log Analyticsと統合されていないAutomationアカウントの場合は、以下のようにEnabledがFalse表示になります

```
Logs
    Category        : JobLogs
    Enabled         : False
    RetentionPolicy
    Enabled : False
    Days    : 0


    Category        : JobStreams
    Enabled         : False
    RetentionPolicy
    Enabled : False
    Days    : 0


    Category        : DscNodeStatus
    Enabled         : False
    RetentionPolicy
    Enabled : False
    Days    : 0
```

# ログ確認

* Automationで何かジョブを実行してみましょう

* OMSポータルのログ検索ボタンを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e23804e2-e697-4dc4-e0c1-7b7177431698.png)

* クエリ入力欄に以下のように入力し、検索ボタンをクリックします
```
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.AUTOMATION"
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d69c1203-4373-7bf2-dbb7-c653dc9684cd.png)

* 以下のようにAutomation実行ログが表示されたらOKです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e5f171a7-1707-2a88-aa1b-9e8ec076725a.png)

# アラート設定

### Job失敗アラート

* 以下クエリを実行します

```
AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobLogs" and (ResultType == "Failed" or ResultType == "Suspended")
```

* OMSポータルログ検索画面の、アラートをクリックします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7604686d-8a52-87ef-2133-a723bb56439b.png)

* アラートルールを入力していきます。
  時間枠/アラートの頻度については記事の最後に注意点を書きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/956f9019-816f-f66b-0a5d-dd995fa39149.png)

* Slack通知したい場合は、Webhookを以下のように設定します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6103a531-58e9-7652-f1ee-25a40ef46968.png)

* カスタムJSONペイロードの設定例

```
{
    "attachments": [
        {
            "title":"OMS Alerts",
            "fields": [
                {
                    "title": "Alert Rule Name",
                    "value": "#alertrulename"},
                {
                    "title": "Link To SearchResults",
                    "value": "<#linktosearchresults|OMS Search Results>"},
                {
                    "title": "Search Interval",
                    "value": "#searchinterval"},
                {
                    "title": "Threshold Operator",
                    "value": "#thresholdoperator"},
                {
                    "title": "Threshold Value",
                    "value": "#thresholdvalue"}
            ],
            "color": "danger"
        }
    ],
    "username": "Azure OMS Alert",
    "icon_emoji": ":ghost:"
}
```

### Job Streamsエラーアラート

* ログ検索画面で、以下のクエリを実行します

```
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobStreams" and StreamType_s == "Error"
| summarize AggregatedValue = count() by JobId_g
```

* Job失敗アラートと同様にアラートを設定します

### 特定のRunbookのみをアラート対象にする場合

* 以下のクエリを実行し、アラート設定します

```
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.AUTOMATION" and Category == "JobStreams" and StreamType_s == "Error"
| where RunbookName_s == "[Runbook名]"
```

# アラート通知結果

### メール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a5ba23e0-fef6-fa57-1827-07d13c04f7a5.png)

### Slack
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/44efb908-46ec-73f4-df12-b00c9cbe1dd9.png)

# Log Analyticsのアラート設定(時間枠とアラート頻度について)

時間枠：過去何分以内の結果を対象とするか
アラート頻度：アラートを確認する頻度

AutomationからLog Analyticsへの転送間隔については定義することができません。
（何度か試した結果、大体10分以内には転送されていましたが）

で、ここで時間枠とアラート頻度の設定に気を付けないといけないのですが、
例えば、時間枠10分、アラート頻度10分、の設定にしていて、Automationからのログ転送が15分掛かった場合、
10分前のログにしか遡ってくれないため、15分前のエラーログは検知してくれないのです。

なので、アラート頻度を10分より短くしたい場合、時間枠は15分以上に延ばしたほうがよいと思います。

ただ、これも10分以内に転送されると仮定した場合の話しです。
公式だとLog Analyticsへの転送は、SLAが6時間以内になっています。

[Log Analyticsの価格](https://azure.microsoft.com/ja-jp/pricing/details/log-analytics/)

時間枠とアラート頻度は要件に応じて検討する必要があります。

Log Analyticsは本来分析用途なので、リアルタイムでの監視が必要な場合は、Runbook内に自分で確認のロジックを書くしかなさそうです。