位置情報と IP アドレスの処理

この記事では、Application Insights で位置情報検索と IP アドレスの処理がどのように機能するか、また、既定の動作を変更する方法について説明します。

既定の動作

既定では、IP アドレスは一時的に収集されますが、Application Insights には格納されません。 このプロセスは、いくつかの基本的な手順に従って実行されます。

テレメトリが Azure に送信されると、Application Insights では IP アドレスを使用して位置情報検索を行います。 Application Insights は、この検索結果を使用して、client_Cityclient_StateOrProvinceclient_CountryOrRegion の各フィールドを設定します。 アドレスは破棄され、0.0.0.0client_IP フィールドに書き込まれます。

位置情報データを削除するには、次の記事を参照してください。

テレメトリの種類は次のとおりです。

  • ブラウザー テレメトリ: Application Insights は、送信者の IP アドレスを収集します。 インジェスト エンドポイントは IP アドレスを計算します。
  • サーバー テレメトリ: Application Insights テレメトリ モジュールでクライアントの IP アドレスが一時的に収集されます。 X-Forwarded-For ヘッダーが設定されている場合、IP アドレスはローカルに収集されません。 受信した IP アドレス リストに複数の項目がある場合は、最後の IP アドレスを使用して位置情報フィールドが設定されます。

この動作の仕様は、個人データおよび IP アドレス位置情報の不必要な収集を回避するのに役立ちます。 可能な限り、個人データの収集を回避することをお勧めします。

Note

既定では IP アドレスを収集しませんが、この動作はオーバーライドすることができます。 ただし、コレクションがどのコンプライアンス要件にも地域の規制にも違反していないことを確認することをお勧めします。

Application Insights での個人データ処理の詳細については、個人データのガイダンスに関するページをご覧ください。

IP アドレスが収集されない場合、IP アドレスを使用してパイプラインによって設定される市区町村やその他の位置情報属性も収集されません。 IP 収集はソースでマスクすることもできます。 それには 2 つの方法があります。 次のようにすることができます。

IP アドレス データのストレージ

IP の収集と格納を有効にするには、Application Insights コンポーネントの DisableIpMasking プロパティを true に設定する必要があります。 このプロパティは、Azure Resource Manager テンプレート (ARM テンプレート) を使用するか、REST API を呼び出すことによって設定できます。

ARM テンプレート

{
       "id": "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/microsoft.insights/components/<resource-name>",
       "name": "<resource-name>",
       "type": "microsoft.insights/components",
       "location": "westcentralus",
       "tags": {
              
       },
       "kind": "web",
       "properties": {
              "Application_Type": "web",
              "Flow_Type": "Redfield",
              "Request_Source": "IbizaAIExtension",
              // ...
              "DisableIpMasking": true
       }
}

ポータル

1 つの Application Insights リソースの動作のみを変更する必要がある場合は、Azure portal を使用します。

  1. Application Insights リソースに移動し、[Automation]>[テンプレートのエクスポート] を選択します。

  2. [デプロイ] を選択します。

    [デプロイ] ボタンを示すスクリーン ショット。

  3. [テンプレートの編集] を選択します。

    [編集] ボタンとリソース グループに関する警告が表示されているスクリーンショット。

    注意

    上のスクリーンショットで示されているエラーが発生した場合は解決が可能です。 エラーの内容: "リソース グループは、テンプレート内の 1 つ以上のリソースがサポートしていない場所にあります。 別のリソース グループを選択してください。" 一時的にドロップダウン リストから別のリソース グループを選択してから、元のリソース グループを再選択してください。

  4. JSON テンプレートで、resources 内の properties を見つけます。 最後の JSON フィールドにコンマを追加して、"DisableIpMasking": true という新しい行を追加します。 その後、 [保存] を選びます。

    要求ソースのプロパティの後にコンマと新しい行が追加されたことを示すスクリーンショット。

  5. [確認と作成]>[作成] の順に選択します。

    Note

    "デプロイに失敗しました" と表示されている場合は、microsoft.insights/components という種類のデプロイの詳細を確認し、状態を確認します。 成功した場合は、DisableIpMasking に加えられた変更がデプロイされます。

  6. デプロイが完了すると、新しいテレメトリ データが記録されます。

    テンプレートをもう一度選択して編集すると、新しく追加されたプロパティを使用せずに既定のテンプレートのみが表示されます。 IP アドレス データが表示されず、"DisableIpMasking": true が設定されていることを確認する必要がある場合、次の PowerShell コマンドを実行します。

    # Replace `Fabrikam-dev` with the appropriate resource and resource group name.
    # If you aren't using Azure Cloud Shell, you need to connect to your Azure account
    # Connect-AzAccount 
    $AppInsights = Get-AzResource -Name 'Fabrikam-dev' -ResourceType 'microsoft.insights/components' -ResourceGroupName 'Fabrikam-dev'
    $AppInsights.Properties
    

    結果として、プロパティの一覧が返されます。 プロパティのいずれかが DisableIpMasking: true になっているはずです。 Azure Resource Manager で新しいプロパティをデプロイする前に PowerShell コマンドを実行する場合、プロパティは存在しません。

REST API

次の REST API ペイロードでも、同じ変更が行われます。

PATCH https://management.azure.com/subscriptions/<sub-id>/resourceGroups/<rg-name>/providers/microsoft.insights/components/<resource-name>?api-version=2018-05-01-preview HTTP/1.1
Host: management.azure.com
Authorization: AUTH_TOKEN
Content-Type: application/json
Content-Length: 54

{
       "location": "<resource location>",
       "kind": "web",
       "properties": {
              "Application_Type": "web",
              "DisableIpMasking": true
       }
}

PowerShell

PowerShell 'Update-AzApplicationInsights' コマンドレットは、DisableIPMasking パラメーターを使用して IP マスクを無効にできます。

Update-AzApplicationInsights -Name "aiName" -ResourceGroupName "rgName" -DisableIPMasking:$true

'Update-AzApplicationInsights' コマンドレットについて、詳しくは「Update-AzApplicationInsights」をご覧ください。

テレメトリ初期化子

DisableIpMasking よりも柔軟な代替方法が必要な場合は、テレメトリ初期化子を使用して、IP アドレスのすべてまたは一部をカスタム フィールドにコピーすることができます。 このクラスのコードは、.NET バージョン間で同じです。

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;

namespace MyWebApp
{
    public class CloneIPAddress : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            ISupportProperties propTelemetry = telemetry as ISupportProperties;

            if (propTelemetry !=null && !propTelemetry.Properties.ContainsKey("client-ip"))
            {
                string clientIPValue = telemetry.Context.Location.Ip;
                propTelemetry.Properties.Add("client-ip", clientIPValue);
            }
        }
    } 
}

Note

ISupportProperties にアクセスできない場合は、Application Insights SDK の最新の安定したリリースを実行していることを確認してください。 ISupportProperties は、カーディナリティの値が高いことを意図しています。 GlobalProperties は、リージョン名や環境名などの小さなカーディナリティの値に適しています。

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;

builder.services.AddSingleton<ITelemetryInitializer, CloneIPAddress>();

Node.js

appInsights.defaultClient.addTelemetryProcessor((envelope) => {
    const baseData = envelope.data.baseData;
    if (appInsights.Contracts.domainSupportsProperties(baseData)) {
        const ipAddress = envelope.tags[appInsights.defaultClient.context.keys.locationIp];
        if (ipAddress) {
            baseData.properties["client-ip"] = ipAddress;
        }
    }
});

テレメトリ初期化子の結果を表示する

サイトに新しいトラフィックを送信して数分待ってから、クエリを実行してコレクションが動作していることを確認できます。

requests
| where timestamp > ago(1h) 
| project appName, operation_Name, url, resultCode, client_IP, customDimensions.["client-ip"]

新しく収集された IP アドレスは customDimensions_client-ip 列に表示されます。 既定の client-ip 列では、4 つすべてのオクテットがゼロのままになります。

localhost からテストし、customDimensions_client-ip の値が ::1 の場合、この値は想定される動作です。 ::1 の値は、IPv6 のループバック アドレスを表します。 これは、IPv4 での 127.0.0.1 と同じです。

よく寄せられる質問

このセクションでは、一般的な質問への回答を示します。

市区町村、国、地域などの位置情報データはどのように計算されますか?

Web クライアントの IP アドレス (IPv4 または IPv6) を検索します。

  • ブラウザー テレメトリ:送信者の IP アドレスを収集します。
  • サーバー テレメトリ:Application Insights モジュールでクライアントの IP アドレスが収集されます。 X-Forwarded-For が設定されている場合は収集されません。
  • Application Insights で IP アドレスと位置情報データが収集される方法について詳しくは、「位置情報と IP アドレスの処理」を参照してください。

別のヘッダーから IP アドレスを取得するように ClientIpHeaderTelemetryInitializer を構成できます。 たとえば一部のシステムでは、プロキシ、ロード バランサー、または CDN によって X-Originating-IP に移動されます。 詳細については、こちらを参照してください

ワークスペースベースのリソースに移行した場合は、Power BI を使用してマップに要求テレメトリを表示できます。

次のステップ

  • Application Insights での個人データ収集について、さらに学習します。
  • Application Insights の IP アドレス収集のしくみについて、さらに学習します。 この記事は、Microsoft のエンジニアの 1 人が書き込んだ外部の古いブログ投稿です。 IP アドレスが 0.0.0.0 として記録される現在の既定の動作より前のものです。 この記事では、組み込みのテレメトリ初期化子のメカニズムについて、より詳しく説明されています。