Log Analytics ワークスペースのリージョン間レプリケーションを試す

azure
Published: 2024-06-14

はじめに

Build 2024 にあわせて、Log Analytics ワークスペースのレプリケーションがプレビューになりました。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/workspace-replication

あるリージョンの Log Analytics ワークスペースに書き込まれたデータを Azure 側で別リージョンの Log Analytics ワークスペースに非同期コピーする機能です。これまでは、Log Analytics ワークスペースに保存するデータをリージョン冗長しようとすると、データを書き込む側で複数のリージョンに書き込む必要がありました。送る側ではなく受け取る側で別リージョンにレプリケーションしてくれるとなると、ストレージアカウントの GRS の様に気軽にリージョン冗長を実現できます。

現時点で費用は発表されていません。ただし、プレビューの発表では次のように記載されているので、単純に2倍にはならなそうです。

Note that replication isn’t free of charge, but is much more affordable than dual homing (ingesting to two workspaces places on different regions) and is easier to manage and maintain. When you enable replication, your logs are effectively ingested to 2 different regions, and billing is done per replicated GB

Public Preview: Log Analytics Workspace Replication

プレビュー中ということもあり多くの制約事項はありますが、動作を理解するために実際に試してみました。

制限事項と制約事項

設定

ポータルからは設定できません。API を直接叩く必要があります。レプリケーションを true にして複製先リージョンを指定します。今回は eastus の Log Analytics ワークスペースを westus2 にレプリケーションします。

$body = @{
    "properties" = @{
        "replication"= @{
            "enabled"= $true
            "location"= "westus2"
        }
    }
    "location"= "eastus"
} | ConvertTo-Json

$apiversion = "?api-version=2023-01-01-preview"
$resource = "/subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/workspaces/la-eu3"
$id = $resource + $apiversion

$res = invoke-azrest -Path $id -Method Put -Payload $body

上手く行くと replication > provisioningState が EnableRequested になります。また、リソース自体の provisioningState が Updating になります。

($res.content | ConvertFrom-Json).properties.replication

enabled location provisioningState  lastModifiedDate
------- -------- ----------------- -----------------
   True westus2  EnableRequested   2024/06/05 5:31:29

しばし待つと、replication > provisioningState が Enabling を経て Succeeded になります。また、リソース自体の provisioningState も Succeeded になります。

$res = invoke-azrest -Path $id -Method GET
 ($res.content | ConvertFrom-Json).properties.replication

enabled location provisioningState lastModifiedDate
------- -------- ----------------- ----------------
   True westus2  Succeeded         2024/06/05 5:31:29

この設定が完了すると、Log Analytics ワークスペースの ID と同じ名前のデータ収集エンドポイントが自動的に作成されます。

$ws = Get-AzOperationalInsightsWorkspace -ResourceGroupName loganarepli -Name la-eu3
$uniqueName = $ws.CustomerId -replace "-",""

Get-AzDataCollectionEndpoint -ResourceGroupName loganarepli -Name $uniqueName | Select-Object Name, FailoverConfigurationActiveLocation,FailoverConfigurationLocation,Kind,MetadataProvisionedByResourceId,SystemDataCreatedByType | fl *

Name                                : 0b30514a419e4455a442f23b92df1aa4
FailoverConfigurationActiveLocation : eastus
FailoverConfigurationLocation       : {{
                                        "location": "eastus"
                                      }, {
                                        "location": "westus2"
                                      }}
Kind                                : SystemManaged
MetadataProvisionedByResourceId     : /subscriptions/MY-SUB-ID/resourceGroups/loganarepli/providers/Microsoft.OperationalInsights/workspaces/la-eu3        
SystemDataCreatedByType             : Application

FailoverConfigurationLocation というプロパティが存在しているのが分かります。また、自動的に作成されたので SystemDataCreatedByType が Application であったり、どの Log Analytics ワークスペースによって作成されたかがわかるプロパティが存在していたりと、普段人間が作るデータ収集エンドポイントとはちょっと違います。

あとはこのデータ収集エンドポイントを、仮想マシンに紐づけるデータ収集ルールに関連付けます。仮想マシンにデータ収集エンドポイントを紐づけるのではなく、データ収集ルールにデータ収集エンドポイントを紐づける必要があります。

> Get-AzDataCollectionRule -ResourceGroupName loganarepli -name dcr-la-eu3 | Select-Object DataCollectionEndpointId
   
DataCollectionEndpointId
------------------------
/subscriptions/MY-SUB-ID/resourceGroups/loganarepli/providers/microsoft.insights/dataCollectionEndpoints/0b30514a419e4455a442f23b92df1aa4

動作確認

本来は Log Analytics の検索画面にレプリケーション先の Workspaces のデータを検索するトグルが出るはずなのですが、私の環境では表示されませんでした。なので、実際にレプリケーション先のリージョンに切り替えてみて、各種動作を確認します。

切り替え前の名前解決結果は次の通りです。確認対象の FQDN は次の3つです。

  • データ収集エンドポイントの構成アクセスエンドポイント
  • データ収集エンドポイントのログインジェストエンドポイント
  • Log Analytics ワークスペースのログ取り込みエンドポイント

次のログの通り、いずれも EastUS に含まれるグローバル IP アドレスが返ってきています。

# データ収集エンドポイントの構成アクセスエンドポイント
> nslookup 0b30514a419e4455a442f23b92df1aa4-byxn-eastus.z1.handler.control.monitor.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    amcs-prod-eus-1-handler.eastus.cloudapp.azure.com
Address:  20.49.109.88
Aliases:  0b30514a419e4455a442f23b92df1aa4-byxn-eastus.z1.handler.control.monitor.azure.com
          eastus.handler.control.monitor.azure.com
          amcs-prod-eus-handler.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.49.109.88
> ($res.content | ConvertFrom-Json).details

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     20.49.104.0/21
ServiceTag          AzureCloud        20.49.104.0/21
ServiceTag          AzureCloud.eastus 20.49.104.0/21
ServiceTag          AzureMonitor      20.49.109.80/28

# データ収集エンドポイントのログインジェストエンドポイント
> nslookup 0b30514a419e4455a442f23b92df1aa4-byxn-eastus.logs.z1.ingest.monitor.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    gig-la-prod-cluster-eus-5-fe.eastus.cloudapp.azure.com
Address:  20.121.252.6
Aliases:  0b30514a419e4455a442f23b92df1aa4-byxn-eastus.logs.z1.ingest.monitor.azure.com
          eastus.prod.la.ingest.monitor.core.windows.net
          gig-la-prod-eastus.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.121.252.6
> ($res.content | ConvertFrom-Json).details                                  

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     20.121.0.0/16
ServiceTag          AzureCloud        20.121.0.0/16
ServiceTag          AzureCloud.eastus 20.121.0.0/16

# Log Analytics ワークスペースのログ取り込みエンドポイント
> nslookup 0b30514a-419e-4455-a442-f23b92df1aa4.ods.opinsights.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    ipv4-eus-oi-ods-cses-f.eastus.cloudapp.azure.com
Address:  40.71.12.233
Aliases:  0b30514a-419e-4455-a442-f23b92df1aa4.ods.opinsights.azure.com
          ods.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/40.71.12.233
> ($res.content | ConvertFrom-Json).details                                  

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     40.71.12.0/24
ServiceTag          AzureCloud        40.71.0.0/16
ServiceTag          AzureCloud.eastus 40.71.0.0/16
ServiceTag          AzureMonitor      40.71.12.224/28

Log Analytics ワークスペースをフェイルオーバします。現時点でフェイルオーバは API 直叩きです。指定するリソース ID はレプリケーション元の Log Analytics ワークスペースの ID ではなく、レプリケーション先のリージョンを含む ID になります。

> $apiversion = "?api-version=2023-01-01-preview"
> $resource = "/subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/locations/westus2/workspaces/la-eu3"
> $id = $resource + "/failover" + $apiversion 

> invoke-azrest -Path $id -Method POST

フェイルオーバはアクティビティログにしっかり記録されます。Log Analytics ワークスペースとデータ収集エンドポイントに対するアクションが記録されました。

EventTimestamp : 2024/06/05 8:26:46
EventName      : Begin request
Status         : Started
OperationName  : microsoft.operationalinsights/locations/workspaces/failover/action
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/locations/westus2/workspaces/la-eu3

EventTimestamp : 2024/06/05 8:26:48
EventName      : End request
Status         : Accepted
OperationName  : microsoft.operationalinsights/locations/workspaces/failover/action
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/locations/westus2/workspaces/la-eu3

EventTimestamp : 2024/06/05 8:26:51
EventName      : Begin request
Status         : Started
OperationName  : Trigger failover on a data collection endpoint
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.insights/datacollectionendpoints/0b30514a419e4455a442f23b92df1aa4

EventTimestamp : 2024/06/05 8:26:52
EventName      : End request
Status         : Succeeded
OperationName  : Trigger failover on a data collection endpoint
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.insights/datacollectionendpoints/0b30514a419e4455a442f23b92df1aa4

EventTimestamp : 2024/06/05 8:27:09
EventName      : End request
Status         : Succeeded
OperationName  : microsoft.operationalinsights/locations/workspaces/failover/action
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/locations/westus2/workspaces/la-eu3

切り替えた後の DNS 名前解決結果は次の通りです。データ収集エンドポイントのログインジェストエンドポイントと Log Analytics ワークスペースのログ取り込みエンドポイントが westus2 のグローバル IP アドレスに切り替わっていることが分かります。データ収集エンドポイントの構成アクセスエンドポイントは切り替わらないようです。

# データ収集エンドポイントの構成アクセスエンドポイント
> nslookup 0b30514a419e4455a442f23b92df1aa4-byxn-eastus.z1.handler.control.monitor.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    amcs-prod-eus-1-handler.eastus.cloudapp.azure.com
Address:  20.49.109.88
Aliases:  0b30514a419e4455a442f23b92df1aa4-byxn-eastus.z1.handler.control.monitor.azure.com
          eastus.handler.control.monitor.azure.com
          amcs-prod-eus-handler.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.49.109.88
> ($res.content | ConvertFrom-Json).details                                  

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     20.49.104.0/21
ServiceTag          AzureCloud        20.49.104.0/21
ServiceTag          AzureCloud.eastus 20.49.104.0/21
ServiceTag          AzureMonitor      20.49.109.80/28

# データ収集エンドポイントのログインジェストエンドポイント
> nslookup 0b30514a419e4455a442f23b92df1aa4-byxn-eastus.logs.z1.ingest.monitor.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    gig-la-prod-cluster-wus2-5-fe.westus2.cloudapp.azure.com
Address:  20.99.187.20
Aliases:  0b30514a419e4455a442f23b92df1aa4-byxn-eastus.logs.z1.ingest.monitor.azure.com
          westus2.prod.la.ingest.monitor.core.windows.net
          gig-la-prod-westus2.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.99.187.20
> ($res.content | ConvertFrom-Json).details                                  

category            name               prefix
--------            ----               ------
BgpServiceCommunity Azure West US 2    20.99.128.0/17
ServiceTag          AzureCloud         20.99.128.0/17
ServiceTag          AzureCloud.westus2 20.99.128.0/17

# Log Analytics ワークスペースのログ取り込みエンドポイント
> nslookup 0b30514a-419e-4455-a442-f23b92df1aa4.ods.opinsights.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    ipv4-wus2-oi-ods-cses-c.westus2.cloudapp.azure.com
Address:  13.66.147.148
Aliases:  0b30514a-419e-4455-a442-f23b92df1aa4.ods.opinsights.azure.com
          wus2-oi-ods.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/13.66.147.148       
> ($res.content | ConvertFrom-Json).details                                  

category            name               prefix
--------            ----               ------
BgpServiceCommunity Azure West US 2    13.66.146.0/23
ServiceTag          AzureCloud         13.66.128.0/17
ServiceTag          AzureCloud.westus2 13.66.128.0/17
ServiceTag          AzureMonitor       13.66.147.144/28

フェイルバックします。こちらも現時点では API 直叩きです。指定するリソース ID はフェイルオーバ後にレプリケーション先になっている eastus の Log Analytics ワークスペースになります。

$apiversion = "?api-version=2023-01-01-preview"
$resource = "/subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/workspaces/la-eu3"
$id = $resource + "/failback" + $apiversion

invoke-azrest -Path $id -Method POST 

フェイルバック後の名前解決結果は次の通りです。 EastUS に含まれるグローバル IP アドレスにもどっていることが分かります。

> nslookup 0b30514a419e4455a442f23b92df1aa4-byxn-eastus.z1.handler.control.monitor.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    amcs-prod-eus-1-handler.eastus.cloudapp.azure.com
Address:  20.49.109.88
Aliases:  0b30514a419e4455a442f23b92df1aa4-byxn-eastus.z1.handler.control.monitor.azure.com
          eastus.handler.control.monitor.azure.com
          amcs-prod-eus-handler.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.49.109.88 
> ($res.content | ConvertFrom-Json).details                                  

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     20.49.104.0/21
ServiceTag          AzureCloud        20.49.104.0/21
ServiceTag          AzureCloud.eastus 20.49.104.0/21
ServiceTag          AzureMonitor      20.49.109.80/28

> nslookup 0b30514a419e4455a442f23b92df1aa4-byxn-eastus.logs.z1.ingest.monitor.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    gig-la-prod-cluster-eus-5-fe.eastus.cloudapp.azure.com
Address:  20.121.252.6
Aliases:  0b30514a419e4455a442f23b92df1aa4-byxn-eastus.logs.z1.ingest.monitor.azure.com
          eastus.prod.la.ingest.monitor.core.windows.net
          gig-la-prod-eastus.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.121.252.6
> ($res.content | ConvertFrom-Json).details                                  

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     20.121.0.0/16
ServiceTag          AzureCloud        20.121.0.0/16
ServiceTag          AzureCloud.eastus 20.121.0.0/16

> nslookup 0b30514a-419e-4455-a442-f23b92df1aa4.ods.opinsights.azure.com
サーバー:  UnKnown
Address:  192.168.111.254

権限のない回答:
名前:    ipv4-eus-oi-ods-cses-b.eastus.cloudapp.azure.com
Address:  20.42.73.204
Aliases:  0b30514a-419e-4455-a442-f23b92df1aa4.ods.opinsights.azure.com
          ods.trafficmanager.net

> $res = Invoke-WebRequest https://azcheck.aimless.jp/ip/20.42.73.204
> ($res.content | ConvertFrom-Json).details                                  

category            name              prefix
--------            ----              ------
BgpServiceCommunity Azure East US     20.42.0.0/17
ServiceTag          AzureCloud        20.42.0.0/17
ServiceTag          AzureCloud.eastus 20.42.0.0/17
ServiceTag          AzureMonitor      20.42.73.128/25

フェイルバックもしっかりアクティビティログに記録されます。

EventTimestamp : 2024/06/05 10:47:42
EventName      : Begin request
Status         : Started
OperationName  : microsoft.operationalinsights/workspaces/failback/action
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/workspaces/la-eu3

EventTimestamp : 2024/06/05 10:47:43
EventName      : End request
Status         : Accepted
OperationName  : microsoft.operationalinsights/workspaces/failback/action
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/workspaces/la-eu3

EventTimestamp : 2024/06/05 10:47:44
EventName      : Begin request
Status         : Started
OperationName  : Trigger failback on a data collection endpoint
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.insights/datacollectionendpoints/0b30514a419e4455a442f23b92df1aa4

EventTimestamp : 2024/06/05 10:47:44
EventName      : End request
Status         : Succeeded
OperationName  : Trigger failback on a data collection endpoint
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.insights/datacollectionendpoints/0b30514a419e4455a442f23b92df1aa4

EventTimestamp : 2024/06/05 10:48:03
EventName      : End request
Status         : Succeeded
OperationName  : microsoft.operationalinsights/workspaces/failback/action
ResourceId     : /subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/workspaces/la-eu3

どちらの Log Analytics にクエリを実行したかは、診断ログで出力される LAQueryLogs の WorkspaceRegion に記録されます。8:26に westus2 にフェイルオーバ、10:47に eastus にフェイルバックしていますので、フェイルオーバ中のクエリがフェイルオーバ先の westus2 で実行されていることを確認できます。

> $query = 'LAQueryLogs | where _ResourceId == "/subscriptions/MY-SUB-ID/resourcegroups/loganarepli/providers/microsoft.operationalinsights/workspaces/la-eu3" | project TimeGenerated, QueryText,WorkspaceRegion | where QueryText contains "Heartbeat" | sort by TimeGenerated asc'
> $res = Invoke-AzOperationalInsightsQuery -WorkspaceId 3f570f54-9093-4fba-8828-cab36f1edc66 -Query $query
> $res = ($res.Results | Convertto-Json).replace("\n","") | ConvertFrom-Json -Depth 100
> $res | Where-Object {$_.QueryText -eq "Heartbeat"}

TimeGenerated       QueryText WorkspaceRegion
-------------       --------- ---------------
2024/06/05 7:35:58  Heartbeat eastus
2024/06/05 7:56:48  Heartbeat eastus
2024/06/05 7:57:53  Heartbeat eastus
2024/06/05 8:01:14  Heartbeat eastus
2024/06/05 8:16:56  Heartbeat eastus
2024/06/05 8:17:54  Heartbeat eastus
2024/06/05 10:37:01 Heartbeat westus2
2024/06/05 10:37:04 Heartbeat westus2
2024/06/05 10:38:08 Heartbeat westus2
2024/06/05 10:38:45 Heartbeat westus2
2024/06/05 10:48:55 Heartbeat eastus

まとめ

パブリックプレビューになった Log Analytics ワークスペースのレプリケーションを試しました。レプリケーション先のリソースを自分で管理する必要はなく、Azure 側が DNS レベルで自動的に切り替えてくれるので、気軽に使えそうです。現時点では Application insight や VM Insight など高頻度で利用する機能がサポートされていないので、GA までにはサポートされるとありがたいです。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。