Azure Functions を利用したプライベート可用性テストについて

Last Update: feedback 共有

こんにちは、Azure Monitoring サポート チームの北山です。

Application Insights には可用性テストの機能があります。
可用性テストの機能をご利用いただく事で、監視対象の Web サイトに対して自動的にリクエストを送信することが可能です。
監視対象の Web サイトからのレスポンスをチェックし、期待したレスポンスが返却されない場合にアラートを通知する事が可能です。

Application Insights 可用性テスト

Application Insights のサービスから監視対象の Web サイトに対して定期的にリクエストを送信するため、監視対象の Web サイトはパブリックからの通信を許可いただく必要がございます。
しかし、お客様の環境によってはパブリックからの通信を許可していない可能性がございます。
この場合は、標準の可用性テストがご利用いただけません。

この記事では、TimerTrigger 関数で指定された構成に従って定期的に実行される、独自のテスト ロジックが実装された Azure Functions から、Application Insights API の一つである TrackAvailability() を使って可用性テストの結果を送信する方法について説明します。

目次

Azure Functions を用いたプライベート可用性テスト構築の手順

1. VNET 統合を実施した Azure Functions を用意します。

パブリックからの通信を許可していない Web サイトにアクセスするために、VNET 統合した Azure Functions リソースを準備します。
VNET 統合を実施すると、Azure Functions からの通信が VNET を経由します。
監視対象の Web サイトにアクセス可能な VNET 上に Azure Functions リソースをデプロイすることで、定期的に監視対象の Web サイトへテストのためのリクエストが可能です。

Azure Functions の VNET 統合の方法につきましては、下記の公開情報をご参考くださいませ。

上記公開情報をご参考に、ランタイムが .NET の Azure Functions リソースをご準備くださいませ。

弊社検証環境では、Windows OS の .NET 6.0 にて確認いたしました。

2. Azure Functions にテスト ロジックを実装します。

その 1 でご準備いただいた Functions リソースに対して、タイマー トリガーの関数を作成します。
関数名やスケジュールは、貴社のご要件に合うよう適宜ご指定くださいませ。

その後、当該 Functions リソースの左側ペインより「App Service Editor (プレビュー)」を開きます。

下図のように、当該関数に対して右クリックし新しいファイルを作成します。
作成するファイル名は、「function.proj」です。

function.proj に対して、下記のコードを貼り付けます。

1
2
3
4
5
6
7
8
<Project Sdk="Microsoft.NET.Sdk"> 
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights" Version="2.15.0" /> <!-- Ensure you’re using the latest version -->
</ItemGroup>
</Project>

次に runAvailabilityTest.csx というファイルを作成し、下記のコードを貼り付けます。

下記のコードは、監視対象の Web サイトに対して GET リクエストを送信するコードです。
こちらはサンプル コードのため、Bing のサイトにアクセスするよう実装しております。

1
2
3
4
5
6
7
8
9
10
using System.Net.Http;

public async static Task RunAvailabilityTestAsync( ILogger log )
{
using (var httpClient = new HttpClient())
{
// TODO: Replace with your business logic
await httpClient.GetStringAsync( "https://www.bing.com/" );
}
}

次のコードを run.csx にコピーします。
これによって既存のコードが全て置き換えられます。

下記のサンプル コードは、当該 Functions のアプリケーション設定に指定された接続文字列 (APPLICATIONINSIGHTS_CONNECTION_STRING) を使って、テスト結果の送信先である Application Insights を指定しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#load "runAvailabilityTest.csx" 
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.Logging;

private static TelemetryClient telemetryClient;

// =============================================================
// ****************** DO NOT MODIFY THIS FILE ******************
// Business logic must be implemented in RunAvailabilityTestAsync function in runAvailabilityTest.csx
// If this file does not exist, please add it first
// =============================================================
public async static Task Run( TimerInfo myTimer, ILogger log, Microsoft.Azure.WebJobs.ExecutionContext executionContext )
{
if (telemetryClient == null)
{
// Initializing a telemetry configuration for Application Insights based on connection string
var telemetryConfiguration = new TelemetryConfiguration();
telemetryConfiguration.ConnectionString = Environment.GetEnvironmentVariable( "APPLICATIONINSIGHTS_CONNECTION_STRING" );
telemetryConfiguration.TelemetryChannel = new InMemoryChannel();
telemetryClient = new TelemetryClient( telemetryConfiguration );
}

string testName = executionContext.FunctionName;
string location = Environment.GetEnvironmentVariable( "REGION_NAME" );
var availability = new AvailabilityTelemetry
{
Name = testName,
RunLocation = location,
Success = false,
};

availability.Context.Operation.ParentId = Activity.Current.SpanId.ToString();
availability.Context.Operation.Id = Activity.Current.RootId;
var stopwatch = new Stopwatch();
stopwatch.Start();

try
{
using (var activity = new Activity( "AvailabilityContext" ))
{
activity.Start();
availability.Id = Activity.Current.SpanId.ToString();
// Run business logic
await RunAvailabilityTestAsync( log );
}
availability.Success = true;
}

catch (Exception ex)
{
availability.Message = ex.Message;
throw;
}

finally
{
stopwatch.Stop();
availability.Duration = stopwatch.Elapsed;
availability.Timestamp = DateTimeOffset.UtcNow;
telemetryClient.TrackAvailability( availability );
telemetryClient.Flush();
}
}

その後、当該関数が実行されると、テスト コードの結果として Application Insights に可用性テストの結果が記録されます。

注意事項

上記サンプル コードは、あくまでサンプルです。
お客様の環境によっては GET リクエストではなく POST リクエストの実行結果を確認する事も想定されます。
そのため、お客様の監視要件に合わせてテスト コードを実装いただけますと幸いです。

まとめ

本記事では、パブリックからのアクセスを許可していない環境への可用性テストの方法ついてご案内いたしましたが、ご理解いただけましたでしょうか。

本記事が少しでもお役に立ちましたら幸いです。
最後までお読みいただきありがとうございました!

関連する記事

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。