CosmosDB の挿入または更新操作によってトリガーされる Azure Functions は、 [
アプリケーションをデプロイ ] でターゲットに
Azure Functions を使用し、
[ Trigger Type ] プロパティに CosmosDB を設定することでデプロイできます。
このトリガーは、
変更フィードのストリームを使用して、Azure Cosmos DB コンテナの変更を監視します。コンテナに何らかの変更 (挿入/更新) が行われると、変更フィードのストリームがトリガーに送信され、そのトリガーによって Azure Functions が呼び出されます。
- トリガーは、ドキュメントが更新されたか挿入されたかを示すのではなく、ドキュメント自体を提供するだけです。
- トリガーには、パーティションにリースを格納するために使用する 2番目のコンテナが必要です。トリガーを機能させるには、監視対象のコンテナとリースを含むコンテナの両方が使用可能である必要があります。
- 同じコンテナに対して Azure Cosmos DB のトリガーを使用するように複数の関数が設定されている場合は、各関数で専用のリースコンテナを使用するか、関数ごとに異なる LeaseContainerPrefix を指定する必要があります。
詳細については、
Azure のドキュメントを参照してください。
まず始めに、「
Azure Functions または AWS Lambda Function としてデプロイする GeneXus プロシージャーの作成方法」を確認してください。
関数をデプロイするには、 [
アプリケーションをデプロイ ] またはデプロイエンジンが提供する MSBuild タスクを使用します。デプロイのガイドについては、「
Azure Functions としてデプロイ」を参照してください。
関数のデプロイを設定するには、次のような事前定義されたインフラストラクチャが必要です:
-
Function App (「
HowTo: Create an Azure function app」を参照)
-
CosmosDB アカウント
- CosmosDB データベースおよび監視対象のコンテナ
- CosmosDB データベースおよびリース用のコンテナ
デプロイのダイアログで、次を選択する必要があります:
監視対象のデータベースコンテナおよびリースコンテナに接続するためのすべての設定は、
アプリケーションの設定としてクラウドに作成されることに注意してください。
アプリケーションの設定の名前を入力するだけでよく、値の入力は必須ではありません。
そのため、いずれかが変更されても、再度デプロイする必要はありません。値はインフラストラクチャのコードまたは Azure ポータルで設定できるため、必須ではありません。
CI/CD パイプラインでは、デプロイ用の MSBuild スクリプトを実行できます。
この場合、基本的なデプロイの MSBuild スクリプト (
CreateDeploy および
CreatePackage) を実行した後、クラウドにアップロードできる状態のパッケージを作成する必要があります。
MSBuild.exe /ToolsVersion:4.0 "C:\<GX>\CreateCloudPackage.msbuild"
/p:TargetId="AZURE_FUNCTIONS"
/p:CreatePackageScript="createpackage.msbuild"
/p:CreatePackageTarget="CreatePackage"
/p:DeployFullPath=<path>
/p:WebSourcePath="C:\Models\TestDeployAzureFunc\NetCoreModel\web"
/p:ProjectName=<ProjectName>
/p:DeploymentUnit=<DeploymentUnit>
/p:GX_PROGRAM_DIR="C:\<GX>"
/p:AZURE_FUNCTIONS_FUNCTION_APP="cosmosdblinuxnet6"
/p:AZURE_FUNCTIONS_RESOURCE_GROUP="cosmoslinuxnet6"
/p:AZURE_FUNCTIONS_SP_APP_ID="000000000000000000000000000"
/p:AZURE_FUNCTIONS_SP_TENANT_ID="00000000000000000000000000"
/p:AZURE_FUNCTIONS_SP_CREDENTIALS="000000000000000000000"
/p:AZURE_FUNCTIONS_TRIGGER_TYPE="cosmosdb"
/p:AZURE_FUNCTIONS_FUNCTION_NAME="TestCosmosDBTrigger"
/p:AZURE_FUNCTIONS_COSMOSDB_CONNECTION="ConnectionString" /p:AZURE_FUNCTIONS_COSMOSDB_CONNECTION_APPSETTINGVALUE="AccountEndpoint=https://gxcosmosdb.documents.azure.com:443/;AccountKey=000000000000000000"
/p:AZURE_FUNCTIONS_COSMOSDB_DATABASE="DBName"
/p:AZURE_FUNCTIONS_COSMOSDB_DATABASE_APPSETTINGVALUE="Test"
/p:AZURE_FUNCTIONS_COSMOSDB_CONTAINER="ContainerName"
/p:AZURE_FUNCTIONS_COSMOSDB_CONTAINER_APPSETTINGVALUE="Writers"
/p:AZURE_FUNCTIONS_COSMOSDB_LEASE_CONTAINER_PREFIX="FullGX"
/p:AZURE_FUNCTIONS_COSMOSDB_LEASE_CONNECTION="LeaseNameConnectionString" /p:AZURE_FUNCTIONS_COSMOSDB_LEASE_CONNECTION_APPSETTINGVALUE="AccountEndpoint=https://gxcosmosdb.documents.azure.com:443/;AccountKey=00000000000000000000" /p:AZURE_FUNCTIONS_COSMOSDB_LEASE_DATABASE="LeaseDataBase"
/p:AZURE_FUNCTIONS_COSMOSDB_LEASE_DATABASE_APPSETTINGVALUE="TestLease"
/p:AZURE_FUNCTIONS_COSMOSDB_LEASE_CONTAINER="LeaseContainer"
/p:AZURE_FUNCTIONS_COSMOSDB_LEASE_CONTAINER_APPSETTINGVALUE="LeaseContainerTest"
/p:DeploySource="C:\Models\TestDeployAzureFunc\NetCoreModel\Deploy\AZURE_FUNCTIONS\<deploy>.zip"
/t:CreatePackage
これについては、拡張可能なソリューションであるため、GitHub の
deployment-targets リポジトリを参照してください。
こちらで説明されているように、Azure から返された情報 (CosmosDB テーブルで更新されたレコード) を受け取る関数に関連付けられた GeneXus プロシージャーには、次のいずれかのシグネチャがあります:
1. parm(in:&EventMessages,out:&EventMessageResponse)
2. parm(in:&RawData,out:&EventMessageResponse); // RawData は Char パラメーター
次の特定の関数には、別のシグネチャがあります:
parm(in:&EventMessagesList,out:&EventMessageResponse);
Azure CosmosDB はスキーマレスのデータベースであり、JSON を格納するため、データは任意の構造を持つことができます (ネストされた JSON オブジェクトまたは配列を持つことができます)。
どのように処理されるかは、データの受け取りに使用されるパラメーターによって異なります。
(EventMessage のメンバーである) EventMessageProperty SDT にロードされたデータには、次のものが格納されます:
- PropertyId: JSON オブジェクトの各キーと値のペアのキー。
- PropertyValue: 値が文字列、数値、浮動小数点、またはブール値である場合、文字列に変換される値 (日付は文字列として表示される)。値が配列やオブジェクトの場合は、PropertyValue にはフラット化された情報の文字列が含まれます。
&Rawdata パラメーターを使用すると、更新されたすべての JSON レコードの連結を文字列で取得できます。
複数の JSON レコードが関係する場合に便利です。
リストを繰り返して各 JSON の項目を処理できます。
FromJson メソッドを使用すると、その情報から SDT をロードすることができます。
SDT は、JSON インポートのツール ( [ ツール ] メニュー > [ アプリケーションの統合 ] > [ JSON インポート ] の順に選択) を使用して取得できます。
for &EventMessagesListItem in &EventMessagesList.items //&EventMessagesListItem は LongVarchar データタイプ
&SDTData.fromJson(EventMessagesListItem)
//情報を処理
endfor
この機能は、
GeneXus 18 Upgrade 4 以降で利用できます。