シングルテナント Azure Logic Apps で Standard ロジック アプリ用のカスタム組み込みコネクタを作成する

適用対象: Azure Logic Apps (Standard)

Standard ロジック アプリ ワークフローで使用できないコネクタが必要な場合は、シングルテナント Azure Logic Apps の Standard ワークフローで使用できるサービス プロバイダー ベースの組み込みコネクタで使用されるものと同じ拡張性モデルを使用して、独自の組み込みコネクタを作成できます。 この拡張性モデルは、Azure Functions 機能拡張モデルに基づいています。

この記事では、1 つの Azure Functions ベースのトリガーとアクションがないカスタム組み込み Azure Cosmos DB コネクタのサンプルを作成する方法について説明します。 トリガーは、新しいドキュメントが Azure Cosmos DB のリース コレクションまたはコンテナーに追加された後、Azure Cosmos DB ドキュメントとして入力ペイロードを使用するワークフローが実行されたときに発生します。

操作 操作の詳細 説明
トリガー ドキュメントを受け取ったとき このトリガー操作は、指定した Azure Cosmos DB データベースとコレクションで挿入操作が行われるときに実行されます。
アクション なし このコネクタでは、アクション操作は定義されません。

このサンプル コネクタでは、Azure Functions 用の Azure Cosmos DB トリガーと同じ機能を使用します。これは、Azure Functions のトリガーとバインドに基づいています。 完全なサンプルについては、サンプル カスタム組み込み Azure Cosmos DB コネクタ - Azure Logic Apps コネクタ拡張機能に関するページを参照してください。

詳細については、次のドキュメントを確認してください。

前提条件

手順の概要

次のアウトラインでは、コネクタの例をビルドする手順の概要について説明します。

  1. クラス ライブラリ プロジェクトを作成します。

  2. プロジェクトで、Microsoft.Azure.Workflows.WebJobs.Extension NuGet パッケージを NuGet 参照として追加します。

  3. NuGet パッケージを使用して、IServiceOperationsProvider および IServiceOperationsTriggerProvider という名前のインターフェイスのメソッドを実装することで、組み込みコネクタの操作を提供します。

  4. カスタムの組み込みコネクタを Azure Functions ランタイム拡張機能に登録します。

  5. 使用できるようコネクタをインストールします。

クラス ライブラリ プロジェクトを作成する

  1. Visual Studio Code で、.NET Core 3.1 クラス ライブラリ プロジェクトを作成します。

  2. プロジェクトで、Microsoft.Azure.Workflows.WebJobs.Extension という名前の NuGet パッケージを NuGet 参照として追加します。

サービス プロバイダー インターフェイスを実装する

サンプルの組み込みコネクタの操作を提供するには、Microsoft.Azure.Workflows.WebJobs.Extension NuGet パッケージで、次のインターフェイスのメソッドを実装します。 次の図は、Azure Logic Apps デザイナーとランタイムで、Azure Functions ベースのトリガーを持つカスタム組み込みコネクタに対して想定されるメソッド実装とのインターフェイスを示しています。

サンプル Azure Cosmos DB カスタム組み込みコネクタのメソッド実装を示す概念クラス図。

IServiceOperationsProvider

このインターフェイスには、操作マニフェストを提供し、カスタム組み込みコネクタでサービス プロバイダーの特定のタスクまたは実際のビジネス ロジックを実行する次のメソッドが含まれています。 詳細については、「IServiceOperationsProvider」を参照してください。

  • GetService()

    Azure Logic Apps のデザイナーでは、GetService() メソッドを使用して、サービスの説明、デザイナーに必要な接続入力パラメーター、機能、ブランドの色、アイコン URL など、カスタム サービスの高度なメタデータを取得する必要があります。

  • GetOperations()

    Azure Logic Apps のデザイナーでは、GetOperations() メソッドでカスタム サービスによって実装された操作を取得する必要があります。 操作リストは Swagger スキーマに基づいています。 また、デザイナーでは、特定の操作の入力パラメーターを理解し、操作の出力のスキーマに基づいて、プロパティ トークンとして出力を生成するためにも操作メタデータが使用されます。

  • GetBindingConnectionInformation()

    トリガーが Azure Functions ベースのトリガーの種類である場合、Azure Logic Apps のランタイムでは、必要な接続パラメーター情報を Azure Functions トリガー バインドに提供するために GetBindingConnectionInformation() メソッドが必要です。

  • InvokeOperation()

    コネクタにアクションがある場合、Azure Logic Apps のランタイムでは、ワークフロー実行中に実行されるコネクタ内の各アクションを InvokeOperation() メソッドで呼び出す必要があります。 コネクタにアクションがない場合は、InvokeOperation() メソッドを実装する必要はありません。

    この例では、Azure Cosmos DB カスタム組み込みコネクタにアクションはありません。 ただし、このメソッドは完全性のためにこの例に含まれています。

これらのメソッドとその実装の詳細については、この記事の後半でこれらのメソッドを確認してください。

IServiceOperationsTriggerProvider

カスタム組み込みコネクタでは、Azure Functions トリガーまたはアクションをサービス プロバイダー トリガーとして追加または公開できます。 Azure Functions ベースのトリガーの種類と、Azure マネージド コネクタ トリガーと同じ Azure Functions バインドを使用するには、次のメソッドを実装して、Azure Functions で必要に応じて接続情報とトリガー バインドを提供します。 詳細については、「IServiceOperationsTriggerProvider」を確認してください。

  • GetFunctionTriggerType() メソッドは、Azure Functions トリガー バインドのパラメーターと同じ文字列を返すために必要です。

  • GetFunctionTriggerDefinition() には既定の実装があるため、このメソッドを明示的に実装する必要はありません。 ただし、デザイナーで公開されない追加のパラメーターを指定するなど、トリガーの既定の動作を更新する場合は、このメソッドを実装し、既定の動作をオーバーライドできます。

実装するメソッド

次のセクションでは、コネクタの例で実装するメソッドについて説明します。 完全なサンプルについては、サンプル CosmosDbServiceOperationProvider.cs を確認してください。

GetService()

デザイナーでは、サービスの概要説明を取得するには、次のメソッドが必要です。

public ServiceOperationApi GetService()
{
   return this.CosmosDBApis.ServiceOperationServiceApi();
}

GetOperations()

デザイナーでは、サービスによって実装される操作を取得するには、次のメソッドが必要です。 この操作リストは Swagger スキーマに基づいています。

public IEnumerable<ServiceOperation> GetOperations(bool expandManifest)
{
   return expandManifest ? serviceOperationsList : GetApiOperations();
}

GetBindingConnectionInformation()

Azure Functions ベースのトリガーの種類を使用するために、次のメソッドでは、Azure Functions トリガー バインドに必要な接続パラメーター情報を提供します。

public string GetBindingConnectionInformation(string operationId, InsensitiveDictionary<JToken> connectionParameters)
{
   return ServiceOperationsProviderUtilities
      .GetRequiredParameterValue(
         serviceId: ServiceId,
         operationId: operationID,
         parameterName: "connectionString",
         parameters: connectionParameters)?
      .ToValue<string>();
}

InvokeOperation()

Azure Cosmos DB カスタム組み込みコネクタの例にはアクションはありませんが、完全性のために次のメソッドが含まれています。

public Task<ServiceOperationResponse> InvokeOperation(string operationId, InsensitiveDictionary<JToken> connectionParameters, ServiceOperationRequest serviceOperationRequest)
{
   throw new NotImplementedException();
}

GetFunctionTriggerType()

コネクタでトリガーとして Azure Functions ベースのトリガーを使用するには、Azure Functions トリガー バインドのパラメーターと同じ文字列を返す必要があります。

次の例では、既定の組み込み Azure Cosmos DB トリガー "type": "cosmosDBTrigger" の文字列を返します。

public string GetFunctionTriggerType()
{
   return "CosmosDBTrigger";
}

GetFunctionTriggerDefinition()

このメソッドには既定の実装があるため、このメソッドを明示的に実装する必要はありません。 ただし、デザイナーが公開しない追加のパラメーターを指定するなど、トリガーの既定の動作を更新する場合は、このメソッドを実装し、既定の動作をオーバーライドできます。

コネクタを登録する

Azure Functions ランタイム開始プロセス中にカスタムの組み込みコネクタ拡張機能を読み込むには、Azure Functions 拡張機能の登録をスタートアップ ジョブとして追加し、コネクタをサービス プロバイダーの一覧にサービス プロバイダーとして登録する必要があります。 組み込みトリガーが入力として必要とするデータの種類に基づいて、必要に応じてコンバーターを追加します。 次の例では、Azure Cosmos DB ドキュメントの Document データ型を JObject 配列に変換します。

次のセクションでは、カスタム組み込みコネクタを Azure Functions 拡張機能として登録する方法について説明します。

スタートアップ ジョブを作成する

  1. [assembly:WebJobsStartup] という名前のアセンブリ属性を使用してスタートアップ クラスを作成します。

  2. IWebJobsStartup インターフェイスを実装します。 Configure() メソッドで、拡張機能を登録し、サービス プロバイダーを挿入します。

    たとえば、次のコード スニペットは、サンプル カスタム組み込み Azure Cosmos DB コネクタのスタートアップ クラスの実装を示しています。

    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Hosting;
    using Microsoft.Extensions.DependencyInjection.Extensions;
    
    [assembly: Microsoft.Azure.WebJobs.Hosting.WebJobsStartup(typeof(ServiceProviders.CosmosDb.Extensions.CosmosDbTriggerStartup))]
    
    namespace ServiceProviders.CosmosDb.Extensions
    {
       public class CosmosDbServiceProviderStartup : IWebJobsStartup
       {
          // Initialize the workflow service.
          public void Configure(IWebJobsBuilder builder)
          {
                // Register the extension.
                builder.AddExtension<CosmosDbServiceProvider>)();
    
                // Use dependency injection (DI) for the trigger service operation provider.
                builder.Services.TryAddSingleton<CosmosDbTriggerServiceOperationsProvider>();
          }
       }
    }
    

    詳細については、サービスの登録 - .NET Azure Functions での依存関係の挿入の使用に関するページを確認してください。

サービス プロバイダーを登録する

次に、サービス プロバイダーの実装を Azure Logic Apps エンジンに Azure Functions 拡張機能として登録します。 この例では、Azure Functions 用の組み込みの Azure Cosmos DB トリガーを新しいトリガーとして使用します。 この例では、新しい Azure Cosmos DB サービス プロバイダーを、既に Azure Logic Apps 拡張機能の一部になっているサービス プロバイダーの既存の一覧に登録します。 詳細については、「Azure Functions バインド拡張機能を登録する」を確認してください。

using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs.Description;
using Microsoft.Azure.WebJobs.Host.Config;
using Microsoft.Azure.Workflows.ServiceProviders.Abstractions;
using Microsoft.WindowsAzure.ResourceStack.Common.Extensions;
using Microsoft.WindowsAzure.ResourceStack.Common.Json;
using Microsoft.WindowsAzure.ResourceStack.Common.Storage.Cosmos;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

namespace ServiceProviders.CosmosDb.Extensions
{
   [Extension("CosmosDbServiceProvider", configurationSection: "CosmosDbServiceProvider")]
   public class CosmosDbServiceProvider : IExtensionConfigProvider
   {
      // Initialize a new instance for the CosmosDbServiceProvider class.
      public CosmosDbServiceProvider(ServiceOperationsProvider serviceOperationsProvider, CosmosDbTriggerServiceOperationsProvider operationsProvider)
      {
         serviceOperationsProvider.RegisterService(serviceName: CosmosDBServiceOperationsProvider.ServiceName, serviceOperationsProviderId: CosmosDBServiceOperationsProvider.ServiceId, serviceOperationsProviderInstance: operationsProvider);
      }

      // Convert the Azure Cosmos DB Document array to a generic JObject array.
      public static JObject[] ConvertDocumentToJObject(IReadOnlyList<Document> data)
      {
         List<JObject> jobjects = new List<JObject>();

         foreach(var doc in data)
         {
            jobjects.Add((JObject)doc.ToJToken());
         }

         return jobjects.ToArray();
      }

      // In the Initialize method, you can add any custom implementation.
      public void Initialize(ExtensionConfigContext context)
      {
         // Convert the Azure Cosmos DB Document list to a JObject array.
         context.AddConverter<IReadOnlyList<Document>, JObject[]>(ConvertDocumentToJObject);
      }
   }
}

コンバーターを追加する

Azure Logic Apps には、JObject 配列を使用して Azure Functions 組み込みトリガーを処理する一般的な方法があります。 ただし、Azure Cosmos DB ドキュメントの読み取り専用リストを JObject 配列に変換する場合は、コンバーターを追加できます。 コンバーターの準備ができたら、この例で前述したように、コンバーターを ExtensionConfigContext の一部として登録します。

// Convert the Azure Cosmos DB  document list to a JObject array.
context.AddConverter<IReadOnlyList<Document>, JObject[]>(ConvertDocumentToJObject);

実装されたクラスのクラス ライブラリ図

完了したら、Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB.dll 拡張バンドル内のすべてのクラスの実装を示す次のクラス図を確認します。

  • CosmosDbServiceOperationsProvider
  • CosmosDbServiceProvider
  • CosmosDbServiceProviderStartup

完全なクラス実装を示す概念コード マップ図。

コネクタをインストールする

前のセクションの NuGet 参照を追加するには、Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB.dll という名前の拡張機能バンドルで extensions.json ファイルを更新します。 詳細については、Azure/logicapps-connector-extensions リポジトリに移動し、add-extension.ps1 という名前の PowerShell スクリプトを確認してください。

  1. カスタム組み込みコネクタを含むように拡張機能バンドルを更新します。

  2. Visual Studio Code 拡張機能の Azure Logic Apps (Standard) がインストールされている Visual Studio Code で、ロジック アプリ プロジェクトを作成し、次の PowerShell コマンドを使用して拡張機能パッケージをインストールします。

    PowerShell

    dotnet add package "Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB" --version 1.0.0  --source $extensionPath
    

    または、PowerShell プロンプトを使用してロジック アプリ プロジェクトのディレクトリから、add-extension.ps1 という名前の PowerShell スクリプトを実行します。

    .\add-extension.ps1 {Cosmos-DB-output-bin-NuGet-folder-path} CosmosDB
    

    Bash

    代わりに Bash を使用するには、ロジック アプリ プロジェクトのディレクトリから、次のコマンドを使用して PowerShell スクリプトを実行します。

    powershell -file add-extension.ps1 {Cosmos-DB-output-bin-NuGet-folder-path} CosmosDB
    

    カスタム組み込みコネクタの拡張機能が正常にインストールされた場合は、次の例のような出力が表示されます。

    C:\Users\{your-user-name}\Desktop\demoproj\cdbproj>powershell - file C:\myrepo\github\logicapps-connector-extensions\src\Common\tools\add-extension.ps1 C:\myrepo\github\logicapps-connector-extensions\src\CosmosDB\bin\Debug\CosmosDB
    
    Nuget extension path is C:\myrepo\github\logicapps-connector-extensions\src\CosmosDB\bin\Debug\
    Extension dll path is C:\myrepo\github\logicapps-connector-extensions\src\CosmosDB\bin\Debug\netcoreapp3.1\Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB.dll
    Extension bundle module path is C:\Users\{your-user-name}\.azure-functions-core-tools\Functions\ExtensionBundles\Microsoft.Azure.Functions.ExtensionBundle.Workflows1.1.9
    EXTENSION PATH is C:\Users\{your-user-name}\.azure-functions-core-tools\Functions\ExtensionBundles\Microsoft.Azure.Functions.ExtensionBundle.Workflows\1.1.9\bin\extensions.json and dll Path is C:\myrepo\github\logicapps-connector-extensions\src\CosmosDB\bin\Debug\netcoreapp3.1\Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB.dll
    SUCCESS: The process "func.exe" with PID 26692 has been terminated.
       Determining projects to restore...
       Writing C:\Users\{your-user-name}\AppData\Local\Temp\tmpD343.tmp`<br>
    info : Adding PackageReference for package 'Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB' into project 'C:\Users\{your-user-name}\Desktop\demoproj\cdbproj.csproj'.
    info : Restoring packages for C:\Users\{your-user-name}\Desktop\demoproj\cdbproj.csproj...
    info : Package 'Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB' is compatible with all the specified frameworks in project 'C:\Users\{your-user-name}\Desktop\demoproj\cdbproj.csproj'.
    info : PackageReference for package 'Microsoft.Azure.Workflows.ServiceProvider.Extensions.CosmosDB' version '1.0.0' updated in file 'C:\Users\{your-user-name}\Desktop\demoproj\cdbproj.csproj'.
    info : Committing restore...
    info : Generating MSBuild file C:\Users\{your-user-name}\Desktop\demoproj\cdbproj\obj\cdbproj.csproj.nuget.g.props.
    info : Generating MSBuild file C:\Users\{your-user-name}\Desktop\demoproj\cdbproj\obj\cdbproj.csproj.nuget.g.targets.
    info : Writing assets file to disk. Path: C:\Users\{your-user-name}\Desktop\demoproj\cdbproj\obj\project.assets.json.
    log : Restored C:\Users\{your-user-name}\Desktop\demoproj\cdbproj\cdbproj.csproj (in 1.5 sec).
    Extension CosmosDB is successfully added.
    
    C:\Users\{your-user-name}\Desktop\demoproj\cdbproj\>
    
  3. func.exe プロセスが実行されている場合は、次の手順に進む前に、そのプロセスを閉じるか終了してください。

コネクタをテストする

  1. Visual Studio Code で、Standard ロジック アプリと空のワークフローをデザイナーで開きます。

  2. デザイナー画面で、[操作の選択] を選択してコネクタ操作ピッカーを開きます。

  3. 操作検索ボックスで、[組み込み] を選択します。 検索ボックスに「cosmos db」と入力します。

    操作ピッカーには、カスタム組み込みコネクタとトリガーが表示されます。次に例を示します。

    Visual Studio Code と、新しいカスタム組み込み Azure Cosmos DB コネクタを使用した Standard ロジック アプリ ワークフローのデザイナーを示すスクリーンショット。

  4. [トリガー] の一覧から、カスタムの組み込みトリガーを選択してワークフローを開始します。

  5. 接続ペインで、次のプロパティ値を指定して接続を作成します。次に例を示します。

    プロパティ 必須 説明
    接続名 はい <Azure-Cosmos-DB-connection-name> 作成する Azure Cosmos DB 接続の名前
    接続文字列 はい <Azure Cosmos DB-DB-connection-string> 新しく受信した各ドキュメントを追加する Azure Cosmos DB データベース コレクションまたはリース コレクションの接続文字列。

    コネクタを初めて使用するときの接続ウィンドウを示すスクリーンショット。

  6. 完了したら [作成] を選択します。

  7. トリガーのプロパティ ペインで、トリガーに次のプロパティ値を指定します。次に例を示します。

    プロパティ 必須 説明
    データベース名 はい <Azure-Cosmos-DB-database-name> 使用する Azure Cosmos DB データベースの名前
    [コレクション名] Yes <Azure-Cosmos-DB-collection-name> 新しく受信した各ドキュメントを追加する Azure Cosmos DB コレクションの名前。

    トリガーのプロパティ ウィンドウを示すスクリーンショット。

    この例では、コード ビューのワークフロー定義 (workflow.json ファイル内) には、次のサンプルのような triggers JSON オブジェクトが含まれています。

    {
       "definition": {
          "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
          "actions": {},
          "contentVersion": "1.0.0.0",
          "outputs": {},
          "triggers": {
             "When_a_document_is_received": {
                "inputs":{
                   "parameters": {
                      "collectionName": "States",
                      "databaseName": "SampleCosmosDB"
                   },
                   "serviceProviderConfiguration": {
                      "connectionName": "cosmosDb",
                      "operationId": "whenADocumentIsReceived",
                      "serviceProviderId": "/serviceProviders/CosmosDb"
                   },
                   "splitOn": "@triggerOutputs()?['body']",
                   "type": "ServiceProvider"
                }
             }
          }
       },
       "kind": "Stateful"
    }
    

    接続定義 (connections.json ファイル内) には、次のサンプルのような serviceProviderConnections JSON オブジェクトが含まれています。

    {
       "serviceProviderConnections": {
          "cosmosDb": {
             "parameterValues": {
                "connectionString": "@appsetting('cosmosDb_connectionString')"
             },
             "serviceProvider": {
                "id": "/serviceProviders/CosmosDb"
             },
             "displayName": "myCosmosDbConnection"
          }
       },
       "managedApiConnections": {}
    }
    
  8. Visual Studio Code で、[実行] メニューの [デバッグの開始] を選択します。 (F5 キーを押す)

  9. ワークフローをトリガーするには、Azure portal で Azure Cosmos DB アカウントを開きます。 アカウント メニューの [Data Explorer] を選択します。 トリガーで指定したデータベースとコレクションを参照します。 コレクションに項目を追加します。

    指定したデータベースとコレクションに対して開かれている Azure portal、Azure Cosmos DB アカウント、Data Explorer を示すスクリーンショット。

次のステップ