次の方法で共有


チュートリアル: Azure Event Grid と Azure Functions を使用して、Event Hubs でキャプチャされたデータを Azure Storage から Azure Synapse Analytics に移行する

このチュートリアルでは、Event Hubs でキャプチャされたデータを Azure Blob Storage から Azure Synapse Analytics に移行します。 Azure Event Grid と Azure Functions を使用して、日付を専用 SQL プールに移行します。

アプリケーションの概要

この図は、このチュートリアルでお客様が作成するソリューションのワークフローを示しています。

  1. Azure イベント ハブに送信されたデータが Azure BLOB ストレージにキャプチャされます。
  2. データのキャプチャが完了すると、イベントが生成されて Azure Event Grid に送信されます。
  3. Azure Event Grid は、このイベント データを Azure 関数アプリに転送します。
  4. 関数アプリによってイベント データの BLOB URL が使用され、ストレージから BLOB が取得されます。
  5. 関数アプリによって BLOB データが Azure Synapse Analytics に移行されます。

この記事では、次の手順を実行します。

  • チュートリアルに必要なインフラストラクチャをデプロイする
  • 関数アプリにコードを発行する
  • Event Grid のサブスクリプションを作成する
  • サンプル データを Event Hubs にストリーム配信する
  • キャプチャされたデータを Azure Synapse Analytics で確認する

前提条件

  • Azure Event Grid と Azure Event Hubs 、特にキャプチャ機能に関する知識。 Azure Event Grid に慣れていない場合は、「Azure Event Grid とは」をご覧ください。 Azure Event Hubs のキャプチャ機能について、詳しくは「Azure Event Hubs で Azure Blob Storage または Azure Data Lake Storage にイベントをキャプチャする」をご覧ください。

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

  • .NET デスクトップ開発、Azure 開発、ASP.NET と Web 開発、Node.js 開発、Python 開発用のワークロードを含む Visual Studio

  • EventHubsCaptureEventGridDemo サンプル プロジェクト。 サンプルには次のものが含まれます。

    • WindTurbineDataGenerator。 Capture 機能が有効になっているイベント ハブにサンプル風力タービン データを送信する単純な発行元。
    • FunctionDWDumper。 Avro ファイルが Azure Storage BLOB にキャプチャされたときに Azure Event Grid から通知を受け取る Azure 関数。 BLOB URI を受信し、その内容を読み取り、このデータを Azure Synapse Analytics にプッシュします。

インフラストラクチャをデプロイする

このセクションでは、 Resource Manager テンプレートを使用して必要なインフラストラクチャをデプロイします。 テンプレートをデプロイすると、次のリソースが作成されます。

  • キャプチャ機能が有効になっているイベント ハブ
  • キャプチャされたファイルのストレージ アカウント
  • 関数アプリをホストするための App Service プラン
  • イベントを処理するための関数アプリ
  • データ ウェアハウスをホストするための SQL Server
  • 移行したデータを格納するための Azure Synapse Analytics (専用 SQL プール)

Azure CLI を使用してインフラストラクチャをデプロイする

  1. Azure portal にサインインします。

  2. 上部にある [Cloud Shell] ボタンを選択します。

    Cloud Shell ボタンの選択を示す Azure portal のスクリーンショット。

    ブラウザーの下部に Cloud Shell が開かれるのがわかります。

    Cloud Shell が初期化されていることを示すスクリーンショット。

  3. Cloud Shell には、Bash と PowerShell のバージョンが用意されています。 ターミナル領域の上部にあるボタンを使用して、オプションを切り替えます。 Cloud Shell が PowerShell として開かれた場合は、[ Bash] を選択します。

  4. 次の CLI コマンドを実行して、Azure リソース グループを作成します。

    1. 次のコマンドをコピーして Cloud Shell ウィンドウに貼り付けます。 必要に応じて、リソース グループの名前と場所を変更します。

      az group create --name rgDataMigration --___location eastus
      
    2. Enter キーを押します。

      次に例を示します。

      user@Azure:~$ az group create --name rgDataMigration --___location eastus
      
      {
        "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rgDataMigration",
        "___location": "eastus",
        "managedBy": null,
        "name": "rgDataMigration",
        "properties": {
          "provisioningState": "Succeeded"
        },
        "tags": null,
        "type": "Microsoft.Resources/resourceGroups"
      }
      
  5. 次の CLI コマンドを実行して、前のセクションで説明したすべてのリソースをデプロイします。 リソースには、イベント ハブ、ストレージ アカウント、関数アプリ、Azure Synapse Analytics が含まれます。

    1. コマンドをコピーして Cloud Shell ウィンドウに貼り付けます。 または、テキスト エディターにコピーして値を設定し、コマンドを Cloud Shell にコピーすることもできます。 Azure リソース名が原因でエラーが発生した場合は、リソース グループを削除し、名前を修正して、コマンドを再試行してください。

      重要

      コマンドを実行する前に、次のエンティティの値を指定します。

      • お客様が先ほど作成したリソース グループの名前。
      • イベント ハブ名前空間の名前。
      • イベント ハブの名前。 値はそのまま (hubdatamigration) でもかまいません。
      • SQL サーバーの名前。
      • SQL ユーザーの名前とパスワード。
      • データベースの名前。
      • ストレージ アカウントの名前。
      • 関数アプリの名前。
      az deployment group create \
          --resource-group rgDataMigration \
          --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/event-grid/EventHubsDataMigration.json \
          --parameters eventHubNamespaceName=<event-hub-namespace> eventHubName=hubdatamigration sqlServerName=<sql-server-name> sqlServerUserName=<user-name> sqlServerPassword=<password> sqlServerDatabaseName=<database-name> storageName=<unique-storage-name> functionAppName=<app-name>
      
    2. Cloud Shell ウィンドウで Enter キー を押してコマンドを実行します。 多数のリソースを作成するため、このプロセスには時間がかかる場合があります。 コマンドの結果として、エラーがないことを確認します。

  6. ポータルで Cloud Shell ボタンを選択するか、Cloud Shell ウィンドウの右上隅にある [X ] ボタンを選択して Cloud Shell を閉じます。

リソースが作成されたことを確認する

  1. Azure portal の検索ボックスに、「 リソース グループ」と入力します。 結果から[ リソース グループ]を選択します。

  2. 必要に応じて、検索ボックスにリソース グループの名前を入力して、リソース グループをフィルター処理します。

  3. 一覧で、お客様のリソース グループを選択します。

    リソース グループの選択を示すスクリーンショット。

  4. 次のリソースがリソース グループに表示されていることを確認します。

    リソース グループ内のリソースを示すスクリーンショット。

Azure Synapse Analytics でテーブルを作成する

このセクションでは、前に作成した専用 SQL プールにテーブルを作成します。

  1. リソース グループ内のリソースの一覧で、専用 SQL プールを選択します。

  2. [ 専用 SQL プール ] ページの [ 共通タスク] で、[ クエリ エディター (プレビュー)] を選択します。

    Azure portal の [専用 SQL プール] ページで [クエリ エディター] の選択を示すスクリーンショット。

  3. SQL サーバーのユーザー名とパスワードを入力し、[ OK] を選択します。 クライアントによる SQL サーバーへのアクセスを許可するメッセージが表示された場合は、[SQL サーバー <your SQL server> の許可リスト IP <your IP Address>] を選択し、[OK] を選択します。

  4. クエリ ウィンドウに、次の SQL スクリプトをコピーして実行します。

    CREATE TABLE [dbo].[Fact_WindTurbineMetrics] (
        [DeviceId] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [MeasureTime] datetime NULL,
        [GeneratedPower] float NULL,
        [WindSpeed] float NULL,
        [TurbineSpeed] float NULL
    )
    WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN);
    

    クエリ エディターを示すスクリーンショット。

  5. データが作成されたことをチュートリアルの最後に確認できるように、このタブまたはウィンドウを開いたままにしておきます。

Azure Functions アプリを発行する

最初に、Azure portal から Functions アプリの発行プロファイルを取得します。 次に、発行プロファイルを使用して、Visual Studio から Azure Functions プロジェクトまたはアプリを発行します。

発行プロファイルを取得

  1. [ リソース グループ ] ページで、 Azure Functions アプリを選択します。

    リソース グループのリソースの一覧にある関数アプリの選択を示すスクリーンショット。

  2. アプリの 関数アプリ ページで、発行プロファイルの取得 を選択します。

    関数アプリ ページのコマンド バーにある **[発行プロファイルを取得]** ボタンの選択を示すスクリーンショット。

  3. ファイルをダウンロードして、EventHubsCaptureEventGridDemo フォルダーの FunctionEGDDumper サブフォルダーに保存します。

発行プロファイルを使用して Functions アプリを発行する

  1. Visual Studio を起動します。

  2. お客様が前提条件の一環として GitHub からダウンロードした EventHubsCaptureEventGridDemo.sln ソリューションを開きます。 これは /samples/e2e/EventHubsCaptureEventGridDemo フォルダーにあります。

  3. ソリューション エクスプローラーで、[FunctionEGDWDumper] プロジェクトを右クリックし、[発行] を選択します。

  4. 次の画面で、[開始] または [発行プロファイルの追加] を選択します。

  5. [発行] ダイアログ ボックスの [対象][プロファイルのインポート] を選択し、[次へ] を選択します。

    **[発行]** ダイアログ ボックスの選択 **[プロファイルのインポート]** を示すスクリーンショット。

  6. [ プロファイルのインポート ] タブで、先ほど FunctionEGDWDumper フォルダーに保存した発行設定ファイルを選択します。 [完了] を選択します。

  7. Visual Studio でプロファイルが構成されたら、[発行] を選択 します。 発行が成功したことを確認します。

  8. Web ブラウザーで [Azure Function] ページを開いて、中央のペインで [Functions] を選びます。 EventGridTriggerMigrateData 関数が一覧に表示されていることを確認します。 表示されない場合は、もう一度 Visual Studio から発行し、ポータルのページを最新の状態に更新してください。

    関数の作成の確認を示すスクリーンショット。

関数を発行すれば、イベントをサブスクライブする準備が整います。

イベントをサブスクライブする

  1. Web ブラウザーの新しいタブまたは新しいウィンドウで、Azure portal にサインインします。

  2. Azure portal で、「リソース グループ」を検索して選択します。

  3. 必要に応じて、検索ボックスにリソース グループの名前を入力して、リソース グループをフィルター処理します。

  4. 一覧で、お客様のリソース グループを選択します。

  5. リソースの一覧から [Event Hubs 名前空間] を選択します。

  6. [ Event Hubs 名前空間] ページで、[ イベント] を選択し、ツール バーの [ + イベント サブスクリプション ] を選択します。

    [イベント サブスクリプションの追加] リンクが選択されている Event Hubs 名前空間の [イベント] ページのスクリーンショット。

  7. [イベント サブスクリプションの作成] ページで、次の手順に従います。

    1. イベント サブスクリプションの名前を入力します。

    2. システム トピックの名前を入力します。 システム トピックは、送信者がイベントを送信するためのエンドポイントを提供します。 詳細については、 システムトピックを参照してください。

    3. [エンドポイントのタイプ] で、[Azure 関数] を選択します。

    4. [エンドポイント] で、リンクを選択します。

    5. [Azure 関数の選択] ページで、次のものが自動的に入力されない場合は、次の手順に従います。

      1. Azure 関数のある Azure サブスクリプションを選択します。
      2. 関数のリソース グループを選択します。
      3. 関数アプリを選択します。
      4. デプロイ スロットを選択します。
      5. EventGridTriggerMigrateData 関数を選択します。
    6. [Azure 関数の選択] ページで、[選択の確認] を選択します。

    7. 次に、[イベント サブスクリプションの作成] ページに戻り、[作成] を選択します。

      イベント サブスクリプションの作成ページのスクリーンショット。

  8. イベント サブスクリプションが作成されていることを確認します。 Event Hubs 名前空間の [イベント] ページで [イベント サブスクリプション] タブに切り替えます。

    イベント ページの [イベント サブスクリプション] タブを示すスクリーンショット。

データを生成するアプリを実行する

イベント ハブの設定、SQL プール (旧称 SQL Data Warehouse)、Azure 関数アプリ、およびイベント サブスクリプション専用の設定が完了しました。 イベント ハブのデータを生成するアプリケーションを実行する前に、いくつかの値を構成します。

  1. Azure portal で、先ほど移動したお客様のリソース グループに移動します。

  2. Event Hubs 名前空間を選択します。

  3. [Event Hubs 名前空間] ページで、[共有アクセス ポリシー] を選択します。

  4. ポリシーの一覧で RootManageSharedAccessKey を選択します。

    Event Hubs 名前空間の共有アクセス ポリシー ページを示すスクリーンショット。

  5. プライマリ接続文字列の横にあるコピー ボタンを選択します。

  6. お客様の Visual Studio ソリューションに戻ります。

  7. [WindTurbineDataGenerator] プロジェクトを右クリックし、[スタートアップ プロジェクトとして設定] を選択します。

  8. WindTurbineDataGenerator プロジェクトで、program.cs を開きます。

  9. <EVENT HUBS NAMESPACE CONNECTION STRING> をポータルからコピーした接続文字列に置き換えます。

  10. hubdatamigration以外のイベント ハブに別の名前を使用した場合は、<EVENT HUB NAME>をイベント ハブの名前に置き換えます。

    private const string EventHubConnectionString = "Endpoint=sb://demomigrationnamespace.servicebus.windows.net/...";
    private const string EventHubName = "hubdatamigration";
    
  11. ソリューションをビルドします。 WindTurbineGenerator.exe アプリケーションを実行します。

  12. 数分後に、クエリ ウィンドウが開いている他のブラウザー タブで、データ ウェアハウスのテーブルに対してクエリを実行して、移行されたデータを確認します。

    select * from [dbo].[Fact_WindTurbineMetrics]
    

    クエリ結果を示すスクリーンショット。

重要

この例では、接続文字列を使用して Azure Event Hubs 名前空間に対して認証を行い、チュートリアルを簡単に保ちます。 運用環境では Microsoft Entra ID 認証を使用することをお勧めします。 アプリケーションを使用する場合は、アプリケーションのマネージド ID を有効にし、Event Hubs 名前空間に適切なロール (Azure Event Hubs 所有者、Azure Event Hubs データ送信者、または Azure Event Hubs データ レシーバー) を割り当てます。 詳しくは、Microsoft Entra ID を使用した Event Hubs へのアクセスの認可に関する記事をご覧ください。

ソリューションを監視する

このセクションは、ソリューションの監視またはトラブルシューティングに役立ちます。

ストレージ アカウントでキャプチャされたデータを表示する

  1. リソース グループに移動し、イベント データのキャプチャに使用するストレージ アカウントを選択します。

  2. [ ストレージ アカウント ] ページで、[ ストレージ ブラウザー] を選択します。

  3. [BLOB コンテナー] を展開し、[windturbinecapture] を選択します。

  4. 右側のペインで、対象の Event Hubs 名前空間と同じ名前のフォルダーを開きます。

  5. 対象のイベント ハブと同じ名前のフォルダー (hubdatamigration) を開きます。

  6. フォルダーをドリルスルーすると、AVRO ファイルが表示されます。 次に例を示します。

    ストレージにキャプチャされたファイルを示すスクリーンショット。

Event Grid トリガーによって関数が呼び出されたことを確認する

  1. リソース グループに移動し、関数アプリを選択します。

  2. 中央のペインで [Functions] タブを選びます。

  3. 一覧から EventGridTriggerMigrateData 関数を選択します。

  4. [関数] ページで、左側のメニューの [監視] を選択します。

  5. 呼び出しログをキャプチャするアプリケーション分析情報を構成するために、[構成] を選択します。

  6. 新しい Application Insights リソースを作成するか、既存のリソースを選択します。

  7. 関数の [監視] ページに戻ります。

  8. イベントを送信しているクライアント アプリケーション (WindTurbineDataGenerator) がまだ実行されていることを確認します。 実行されていない場合は、アプリを実行します。

  9. 数分 (5 分以上) 待ってから、[最新の情報に更新] ボタンを選択して、関数の呼び出しを確認します。

    関数の呼び出しを示すスクリーンショット。

  10. 詳細を表示するには、呼び出しを選択します。

    Event Grid により、イベント データがサブスクライバーに配信されます。 次の例は、イベント ハブを介したデータ ストリーミングが BLOB にキャプチャされるときに生成されるデータを示します。 特に、data オブジェクトの fileUrl プロパティがストレージ内の BLOB を指すことに注意してください。 関数アプリによってこの URL が使用され、キャプチャされたデータを含む BLOB ファイルが取得されます。

    {
      "topic": "/subscriptions/<AZURE SUBSCRIPTION ID>/resourcegroups/rgDataMigration/providers/Microsoft.EventHub/namespaces/spehubns1207",
      "subject": "hubdatamigration",
      "eventType": "Microsoft.EventHub.CaptureFileCreated",
      "id": "4538f1a5-02d8-4b40-9f20-36301ac976ba",
      "data": {
        "fileUrl": "https://spehubstorage1207.blob.core.windows.net/windturbinecapture/spehubns1207/hubdatamigration/0/2020/12/07/21/49/12.avro",
        "fileType": "AzureBlockBlob",
        "partitionId": "0",
        "sizeInBytes": 473444,
        "eventCount": 2800,
        "firstSequenceNumber": 55500,
        "lastSequenceNumber": 58299,
        "firstEnqueueTime": "2020-12-07T21:49:12.556Z",
        "lastEnqueueTime": "2020-12-07T21:50:11.534Z"
      },
      "dataVersion": "1",
      "metadataVersion": "1",
      "eventTime": "2020-12-07T21:50:12.7065524Z"
    }
    

データが専用 SQL プールに格納されていることを確認する

クエリ ウィンドウが開いているブラウザー タブで、専用 SQL プールのテーブルに対してクエリを実行して、移行されたデータを確認します。

最終的なクエリ結果を示すスクリーンショット。