🔐

Azure Monitor の閉域化 (AMPLS) - Application Insights編

2024/06/10に公開

はじめに

以前に Azure Monitor の閉域化 (AMPLS) -LAW編 をアップしましたが、今回は Application Insights (App Insights) を閉域化する手順について書きたいと思います

※ App Insights を閉域化する場合も LAW と同様に AMPLS を利用します
※ AMPLSって何ぞや?という方は LAW編 の記事をご参照ください

検証環境の構成図

作成の流れ

  1. AMPLS の作成
  2. App Insights の作成
  3. Private Endpoint の作成
  4. AMPLS への接続 (App Insights, LAW)
  5. Azure Functions の作成 + vNet統合
  6. ログ収集の状況確認

1. AMPLS の作成

1-1. AMPLS を新規作成する

1-2. AMPLS が作成されたことを確認する

2. App Insights の作成

2-1. Azure Monitor にアクセスする

2-2. App Insights の作成

2-3. App Insights が作成されたことを確認する

3. Private Endpoint の作成

3-1. Private Endpoint を新規作成する




※プライベート DNS ゾーンについての詳細は公式サイトをご参照ください

3-3. Private Endpoint と プライベート DNS ゾーンが作成されたことを確認する

3-4. プライベート DNSゾーンを Spoke-VNet にリンクする

※ 全てのプライベート DNS ゾーンで Spoke1-VNet との紐づけを行う


4. Azure Monitor リソースの接続 (App Insights / LAW)

4-1. 作成した AMPLS へ App Insights と LAW を接続する

4-2. Azure Monitor リソースが接続されたことを確認する (App Insights / LAW)

4-3. Azure Monitor リソースに対してアクセス制限を設定する (App Insights / LAW)

本環境では 「検索は Internet から実施可、受け取るデータは AMPLS 経由のみ」 という構成にしています。本設定は Azure Monitor リソースの「ネットワーク分離」にて行います


5. Azure Functions の作成 + vNet統合

作成手順や各プランで何が出来るか?についての詳細は公式サイトをご参照ください

5-1. Azure Functions の作成画面に移動する

5-2. Azure Functions を作成する





5-3. HTTP Triger を作成する



5-4. HTTP Triger のコードを修正する

ログ検索をしやすくするために、実行時に出力されるメッセージを追加します

追加するコード
# Log the completion of the function
Write-Host "Function execution completed. (This message has been added by takutsu.)


5-5. VNet統合の設定

パブリックネットワークではなく、プライベートネットワーク(仮想ネットワーク)経由で Azure Functions からログを送付する設定を行います


6. ログ収集の状況確認

App Insights にて Functions のログが転送されていることを確認します

KQL
traces
|where message contains “INFORMATION"

補足1:HTTP Triger のコードについて

サンプルのコードは以下の通りです

HTTP Triger (サンプルコード)
using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

$body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."

if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

# Log the completion of the function
Write-Host "Function execution completed. (This message has been added by takutsu.)"

各コードの説明を ChatGPT に作成してもらったので補足として載せておきます
細かくはチェックしてませんが、合っているような気がします。が、間違っていたらこそっと教えてください:-)

コード 説明
using namespace System.Net System.Net 名前空間を使用することを宣言し、HttpStatusCode などのクラスを利用可能にします。
param($Request, $TriggerMetadata) Azure Functionsの入力バインディングを受け取るためのパラメータブロックです。$Request はHTTPリクエストを、$TriggerMetadata はトリガーに関するメタデータを表します。
Write-Host "PowerShell HTTP trigger function processed a request." 関数がリクエストを処理したことをログに出力します。
Write-Host "Request received. Processing the request." カスタムログメッセージで、リクエストが受信され処理が開始されたことを示します。
$name = $Request.Query.Name HTTPリクエストのクエリパラメータからNameを取得し、変数$nameに格納します。
if (-not $name) { $name = $Request.Body.Name } クエリパラメータにNameが存在しない場合、リクエストボディからNameを取得します。
if ($name) { Write-Host "Name parameter received: $name" } else { Write-Host "Name parameter not found in query or body." } 取得した名前をログに出力します。名前が見つからない場合もその旨をログに出力します。
$body = "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response." デフォルトのレスポンスメッセージを変数$bodyに設定します。
if ($name) { $body = "Hello, $name. This HTTP triggered function executed successfully." } $nameが存在する場合、パーソナライズされたレスポンスメッセージを設定します。
Write-Host "Response body set to: $body" 設定されたレスポンスボディをログに出力します。
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ StatusCode = [HttpStatusCode]::OK; Body = $body }) HTTPレスポンスのステータスコードを200 OKに設定し、レスポンスボディを$bodyに設定します。
Write-Host "Function execution completed. (This message has been added by takutsu.)" 関数の実行が完了したことをログに出力します。

補足2:App Insights へのパブリックからのアクセスを制限したい場合

項番4-3の「Azure Monitor リソースに対してアクセス制限を設定する (App Insights / LAW)」の設定を以下の様に変更することで、パブリックから App Insight へのアクセスを制限することができます

  1. 設定変更箇所

  1. アクセス確認


まとめ

以前の AMPLS の 記事 では LAW と DCE を対象としていましたが、今回は App Insights を対象として検証を実施しました。Azure Functions を作成したのは初めてだったので AMPLS より Azure Functions の作成に時間が掛かりました。。インフラエンジニアの方はあまり Azure Functions の作成などは経験が無いと思いますが、その部分の手順を分かりやすく纏めたつもりです。本記事が App Insights の検証の際に少しでもお役に立てば幸いです

Appendix

公式Docs
https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview

https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/create-workspace-resource?tabs=bicep

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-function-app-portal?pivots=programming-language-powershell

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-scale

Zennの記事
https://zenn.dev/microsoft/articles/zenn-ampls-instruction

Microsoft (有志)

Discussion