Application InsightsでWebサイトの外形監視をしよう！ 

# はじめに
AzureのApplication Insightsを使えばWebサイトの生き死にを簡単に監視することができます。
また、通知手段も電話やメール、SMSなど様々な通知方法が選べます。
以降では、監視対象のWebサイトがパブリック環境かプライベート環境かで手順が異なるので、それぞれ解説していきます。

# パブリック環境の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/4e4c43ca-33e7-4912-526c-68a90459ea01.png)

Webサイトがパブリックに公開されている場合は非常に簡単です。Azure portalから監視の設定ができます。
Application Insightsのリソースを作成して「可用性」タブから「標準テストの追加」を選ぶだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/76d17284-88b5-ee97-fed9-9212d1bd1893.png)
「URL」に監視したいサイトのURLを入れればOKです。簡単ですね。

参考

https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/availability-standard-tests

# プライベート環境の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/f2e37f02-61fb-331e-ab11-a18851bc9ec9.png)

実は手順自体はMSLearnに書いてあります。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/availability-private-test#disconnected-or-no-ingress-scenarios

該当箇所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/01a51d07-8628-63f4-48fd-cb4154b2b2ed.png)
ちょっとこれだけだとわかりづらいですね。以下では、詳細を解説していきます。

## 流れ
1. Azure Storageアカウントの作成
2. Azure LogAnalyticsの作成
3. Azure Functionsの作成
4. Azure Application Insightsの作成
5. Azure Monitor Private Endpointの作成
6. Log AnalyticsとApplication Insightsの接続
7. Azure Functionsを可用性監視対象の内部VMと同じVNetにVNet統合
8. Application Insightsにてアラートルールとアクショングループを作成

### ポイント
- Azure Private LinkとAzure Monitor Private Link Scopeを使用してApplication InsightsをカスタムVNetに接続します
- 先ほどMSLearnに書いてあったTrackAvailability()というApplication InsightsのAPIを定期的に呼び出すAzure Functionsのタイマートリガー関数を作成します
- 今回監視対象のIPはプライベート環境（カスタムVNet内）にいるため、該当のVNetに対してAzure FunctionsをVNet統合する必要があります

以下ではポイントに絞って手順を解説していきます。

## Storageアカウントの作成
Azure Functionsを作成するために、設定ファイルやソースファイルそのものを置いておくための場所としてStorageアカウントが必要。

作成方法は以下の記事を参考。
ちなみにストレージアカウントのネットワークは「すべてのネットワークから有効」にする。
「選択した仮想ネットワークとIPから有効」にするとFunctionsをデプロイするときにErrorになる。

https://www.cloudou.net/storage/blob001/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/bc372ced-8ea5-a614-1e54-df70df368ca0.png)

## Log Analyticsの作成
こちらも基本的にportalからポチポチ押していけば作れます。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/quick-create-workspace?tabs=azure-portal

## Azure Functionsの作成
以下に沿ってportalからポチポチ作りましょう。言語は「.NET」でやってみます。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/availability-azure-functions#create-a-timer-trigger-function

作れたら、ブラウザから関数を編集できる「App Service Editor」が便利です（作成したFunctionsのタブからいけます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/368c3c46-5426-e545-3715-7c705e1bfcba.png)

## コーディング
こちらも以下を参考に進めていきます。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/availability-azure-functions#add-and-edit-code-in-the-app-service-editor

```c#:runAvailabilityTest.csx
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/"); 
    } 
}
```
httpClient.GetStringAsync()の引数に指定するURLに対して外形監視ができます。
ちなみにこの時点で、パブリックなURLに対してであれば監視ができます（プライベート環境のURLを指定すると接続できず失敗します）。

サンプルの通りbingに対して外形監視した様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/2e0def6d-cc64-ae5a-4040-c2157051517f.png)
3回やったので「成功」が3件でていますね。

## Application InsightsとVNetをつなぐ（Private Link）

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/private-link-configure

Application Insightsを接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/f0dce52b-7502-1c0b-13e4-ff6cbbf692e3.png)

PrivateEndPointを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/9b1a7426-d49a-f90e-5977-3246b48e8637.png)

PrivateEndPointを接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/cf490c15-5276-0cd4-39f6-fdc81bd24e5d.png)
あと最終的には公式ドキュメント等にも書いてある通り、Appilcation InsightsとLog Analyticsスペースのパブリックアクセスをオフにする。

## VNet統合する
https://qiita.com/iron-samurai/items/b86777889df16829775d

Azure FunctionsとAzure VMが所属しているVNetを接続する必要があるため、VNet統合する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/09171f50-ccda-d3d2-c033-182ed4c07b28.png)

VNet統合する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/072b845e-43f7-f09e-2455-8e13ed444297.png)

## コードの修正
内部のWebサイトに対して可用性監視の設定をしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/99c5f201-7126-0a38-e7d3-9600f62641ae.png)

## 確認
上手くいっている！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/d4809fca-325e-967d-198b-ec4746b608de.png)

# アラートの追加
Application Insightsの「アラート」からアラートルールとアクショングループを作成する。Function「Time Trigger1 Successes」が0以下になったとき（＝アラートルール）、メールで通知するという設定（＝アクショングループ）を追加してみた。
なお、アクショングループでは通知ではなくWebhookなどのアクションを選択することもできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/5287c52f-b077-46f7-2a8a-7b455d32b934.png)


実際にDBサーバを落としてみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/6b2948bd-06e3-14e1-ca90-550fe23385d5.png)
エラー検知している！

メールも来た
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/e1bbf20a-94eb-dd72-1319-423d824fca11.png)
メールが来るのに8分くらいかかった。

DBを起動してみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/e9c41c3f-19f1-5358-2c66-f7fd3e28ed72.png)
またメールが来た！

# おわりに
今回はパブリック環境とプライベート環境でそれぞれ外形監視をする方法について見てみました。是非参考にしてみて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/926afb71-cc87-96e9-51da-8f041910b886.png)