Azure Logic Apps でインライン コード操作を使用してワークフロー内でコード スニペットを実行する
適用対象: Azure Logic Apps (従量課金 + Standard)
多くのセットアップを行わずにロジック アプリ ワークフロー内でコード スニペットを作成して実行するには、インライン コードの組み込みコネクタを使用できます。 このコネクタは、コード スニペットから結果を返すアクションを備えており、ユーザーはワークフローの後続のアクションでその出力を使用できます。
現在、コネクタには、以下の属性を持つコード スニペットに対して最も効果的に動作する 1 つのアクションしかありませんが、さらに多くのアクションが開発中です。 また、インライン コード コネクタには、ロジック アプリワークフローが従量課金または Standard のいずれであるかに基づいて、異なる制限事項があります。
操作 | 言語 | 言語バージョン | 実行継続時間 | データ サイズ | 他の注意事項 |
---|---|---|---|---|---|
JavaScript コードの実行 | JavaScript | 標準: Node.js 12.x.x または 14.x.x 消費: Node.js 8.11.1 詳細については、「標準組み込みオブジェクト」を参照してください。 |
5 秒以内に完了。 | 最大 50 MB のデータを処理。 | - 変数アクション (アクションではサポート対象外) の操作は必要ありません。 - JavaScript を実行するための require() 関数はサポートされていません。 |
これらの属性に適合しないコードを実行するには、代わりに、Azure Functions を使用して関数を作成して呼び出すことができます。
この記事では、Office 365 Outlook トリガーで開始されるワークフローの例におけるアクションの動作方法について説明します。 このワークフローは、関連付けられている Outlook 電子メール アカウントに新しい電子メールが到着したときに実行されます。 サンプル コード スニペットでは、電子メール本文に存在するすべての電子メール アドレスを抽出し、それらのアドレスを、後続のアクションで使用できる出力として返します。
以下の図は、ワークフローの例の主要部分を示しています。
前提条件
Azure アカウントとサブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
コード スニペットを追加するロジック アプリ ワークフロー。 このワークフローは、トリガーで既に開始されている必要があります。
この記事の例では、Office 365 Outlook の [新しいメールが届いたとき] というトリガーを使用します。
ワークフローがない場合は、次のドキュメントを参照してください。
Standard: Standard ロジック アプリ ワークフローの例を作成する
ロジック アプリが従量課金か Standard かに基づいて、次の要件を確認します。
従量課金: Node.js バージョン 8.11.10、およびロジック アプリ リソースからの統合アカウント (空またはそれ以外) へのリンク が必要です。
重要
ユース ケースまたはシナリオに適した統合アカウントを使用していることを確認します。
たとえば、Free レベルの統合アカウントは、運用環境のシナリオではなく探索的なシナリオとワークロードのみを対象としており、用途とスループットが制限されており、サービス レベル アグリーメント (SLA) ではサポートされていません。
他の統合アカウント レベルではコストが発生しますが、SLA のサポートが含まれ、スループットが向上し、上限も高くなります。 統合アカウントのレベル、制限、価格の詳細を確認してください。
Standard: Node.js バージョン 12.x.x または 14.x.x が必要ですが、統合アカウントは必要ありません。
インライン コード アクションを追加する
Azure portal で、ロジック アプリ ワークフローをデザイナーで開きます。
デザイナーで、インライン コード アクションをワークフローに追加します。 アクションは、ワークフローの最後またはステップ間の新しいステップとして追加できます。 この例では、Office 365 Outlook トリガーの下にアクションが追加されます。
ワークフローの最後にアクションを追加するには、 [新しいステップ] を選択します。
ステップ間にアクションを追加するには、それらのステップを接続している矢印の上にマウス ポインターを移動します。 表示されるプラス記号 ( + ) を選択し、 + を選択します。
[操作の選択] 検索ボックスに「インライン コード」と入力します。 アクションのリストで、 [JavaScript コードの実行] という名前のアクションを選択します。
このアクションがデザイナーに表示されます。アクションには、既定で
return
ステートメントを含むいくつかのサンプル コードが入っています。[コード] ボックス内でサンプル コードを削除し、自分のコードを入力します。 メソッド内に配置するコードを作成します。ただし、メソッド シグネチャは含めません。
ヒント
カーソルを [コード] ボックスに置くと、動的コンテンツ リストが表示されます。 このリストは後で使用しますが、ここではリストを無視し、開いたままにしておいて構いません。 [非表示] を選択しないでください。
認識済みのキーワードの入力を開始すると、オートコンプリートのリストが表示され、用意されているキーワードから選択できるようになります。例を次に示します。
以下のサンプルのコード スニペットでは、入力テキストで一致パターンを指定する "正規表現" を格納する、myResult という名前の変数が最初に作成されます。 次に、このコードでは、email という名前の変数が作成され、トリガー出力からの電子メール メッセージの本文の内容が格納されます。
[コード] ボックスにカーソルを置いたままの状態で、開いている動的コンテンツ リストから [新しいメールが届いたとき] というセクションを見つけて、電子メール メッセージの本文を参照する [本文] プロパティを選択します。
動的コンテンツ リストには、トリガーからの出力と、それらの出力が現在フォーカス中の編集ボックスの入力形式と一致する以前のアクションがすべて表示されます。 このリストにより、これらの出力が使用しやすくなり、ワークフローから参照しやすくなります。 この例では、電子メール メッセージの [本文] プロパティなど、Outlook トリガーからの出力がリストに表示されます。
[本文] プロパティを選択すると、インライン コード アクションによってトークンが読み取り専用の
workflowContext
JSON オブジェクトに解決され、スニペットでこれを入力として使用できます。 このworkflowContext
オブジェクトには、トリガーのbody
プロパティ (電子メール メッセージの [本文] プロパティとは異なります) など、ワークフロー内のトリガーと以前のアクションからの出力へのアクセス権をコードに付与するプロパティが含まれています。workflowContext
オブジェクトの詳細についは、この記事で後述する「workflowContext オブジェクトを使用してトリガーとアクションの出力を参照する」を参照してください。重要
コード スニペットがドット (.) 演算子を含むアクション名を参照する場合、それらの参照で、これらのアクション名を角かっこ ([]) と引用符 ("") で囲む必要があります。次に例を示します。
// Correct
workflowContext.actions["my.action.name"].body
// Incorrect
workflowContext.actions.my.action.name.body
また、インライン コード アクションでは、[アクション] パラメーター を追加して、これらのアクション名をそのパラメーターに追加する必要があります。 詳細については、この記事で後述する「インライン コード アクションに依存関係をパラメーターとして追加する」を参照してください。
選択した電子メール メッセージの [本文] プロパティをトリガーの
body
プロパティから区別するには、2 番目のbody
プロパティの名前を代わりにBody
に変更します。 終了セミコロン (;) を末尾に追加して、コード ステートメントを終了します。インライン コード アクションでは、
return
ステートメントは構文的に必要ありません。 ただし、return
ステートメントを含めることにより、後のアクションで [結果] トークンを使用して、ワークフローの後半でアクションの結果をより簡単に参照できます。この例では、コード スニペットは、指定された正規表現に対する電子メール メッセージ本文内の一致を検索する
match()
関数を呼び出して結果を返します。 続いて、[HTML テーブルの作成] アクションは [結果] トークンを使用して、インライン コード アクションの結果を参照し、1 つの結果を作成します。完了したら、ワークフローを保存します。
workflowContext オブジェクトを使用してトリガーとアクションの出力を参照する
デザイナーのコード スニペット内から、動的コンテンツ リストを使用して、トリガーまたは以前のアクションからの出力を参照するトークンを選択できます。 このトークンを選択すると、インライン コード アクションによって、そのトークンが読み取り専用の workflowContext
JSON オブジェクトに解決されます。 このオブジェクトは、トリガー、以前のアクション、およびワークフローからの出力へのアクセス権をコードに付与します。 このオブジェクトは、以下の構造を使用し、actions
、trigger
、および workflow
プロパティ (これらはオブジェクトでもあります) を含みます。
{
"workflowContext": {
"actions": {
"<action-name-1>": @actions('<action-name-1>'),
"<action-name-2>": @actions('<action-name-2>')
},
"trigger": {
@trigger()
},
"workflow": {
@workflow()
}
}
}
次の表は、これらのプロパティの詳細情報を示しています。
プロパティ | Type | 説明 |
---|---|---|
actions |
オブジェクト コレクション | コード スニペットを実行する前に実行した以前のアクションの結果オブジェクトです。 各オブジェクトには、"キーと値" のペアが含まれています。ここで、キーはアクション名、値は @actions('<action-name>') 式を含む actions() 関数の呼び出しの結果と同等です。 アクションの名前で使用されるアクション名は、基盤となるワークフロー定義に表示されるもの (アクション名内のスペース (" ") がアンダー スコア (_) で置き換えられています) と同じです。 このオブジェクト コレクションにより、現在実行されているワークフロー インスタンスからアクションのプロパティ値にアクセスできます。 |
trigger |
Object | トリガーからの結果オブジェクト。結果は trigger() 関数の呼び出しと同等です。 このオブジェクトにより、現在実行されているワークフロー インスタンスからトリガーのプロパティ値にアクセスできます。 |
workflow |
Object | workflow() 関数の呼び出しと同等のワークフロー オブジェクト。 このオブジェクトにより、現在実行されているワークフロー インスタンスからプロパティの値 (ワークフロー名や実行 ID など) にアクセスできます。 |
この記事の例では、workflowContext
JSON オブジェクトに、Outlook トリガーからの次のサンプル プロパティと値が含まれる場合があります。
{
"workflowContext": {
"trigger": {
"name": "When_a_new_email_arrives",
"inputs": {
"host": {
"connection": {
"name": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Web/connections/office365"
}
},
"method": "get",
"path": "/Mail/OnNewEmail",
"queries": {
"includeAttachments": "False"
}
},
"outputs": {
"headers": {
"Pragma": "no-cache",
"Content-Type": "application/json; charset=utf-8",
"Expires": "-1",
"Content-Length": "962095"
},
"body": {
"Id": "AAMkADY0NGZhNjdhLTRmZTQtNGFhOC1iYjFlLTk0MjZlZjczMWRhNgBGAAAAAABmZwxUQtCGTqSPpjjMQeD",
"DateTimeReceived": "2019-03-28T19:42:16+00:00",
"HasAttachment": false,
"Subject": "Hello World",
"BodyPreview": "Hello World",
"Importance": 1,
"ConversationId": "AAQkADY0NGZhNjdhLTRmZTQtNGFhOC1iYjFlLTk0MjZlZjczMWRhNgAQ",
"IsRead": false,
"IsHtml": true,
"Body": "Hello World",
"From": "<sender>@<domain>.com",
"To": "<recipient-2>@<domain>.com;<recipient-2>@<domain>.com",
"Cc": null,
"Bcc": null,
"Attachments": []
}
},
"startTime": "2019-05-03T14:30:45.971564Z",
"endTime": "2019-05-03T14:30:50.1746874Z",
"scheduledTime": "2019-05-03T14:30:45.8778117Z",
"trackingId": "1cd5ffbd-f989-4df5-a96a-6e9ce31d03c5",
"clientTrackingId": "08586447130394969981639729333CU06",
"originHistoryName": "08586447130394969981639729333CU06",
"code": "OK",
"status": "Succeeded"
},
"workflow": {
"id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Logic/workflows/<logic-app-workflow-name>",
"name": "<logic-app-workflow-name>",
"type": "Microsoft.Logic/workflows",
"location": "<Azure-region>",
"run": {
"id": "/subscriptions/<Azure-subscription-ID>/resourceGroups/<Azure-resource-group-name>/providers/Microsoft.Logic/workflows/<logic-app-workflow-name>/runs/08586453954668694173655267965CU00",
"name": "08586453954668694173655267965CU00",
"type": "Microsoft.Logic/workflows/runs"
}
}
}
}
インライン コード アクションに依存関係をパラメーターとして追加する
一部のシナリオでは、コードが依存関係として参照するトリガーやアクションの出力を、インライン コード アクションに含めることを明示的に要求することが必要になる場合があります。 たとえば、ワークフローの実行時に使用できない出力をコードが参照する場合は、この追加のステップを実行する必要があります。 ワークフローの作成時に、Azure Logic Apps エンジンはコード スニペットを分析して、コードがトリガーまたはアクションの出力を参照しているかどうかを判断します。 これらの参照が存在する場合、エンジンにはそれらの出力が自動的に含まれます。 ワークフローの実行時に、参照されているトリガーまたはアクションの出力が workflowContext
オブジェクトに見つからない場合、エンジンはエラーを生成します。 このエラーを解決するには、そのトリガーまたはアクションをインライン コード アクションの明示的な依存関係として追加する必要があります。 このステップを実行する必要があるもう 1 つのシナリオとして、workflowContext
オブジェクトがドット演算子 (.) を使用するトリガーまたはアクションの名前を参照する場合があります。
トリガーまたはアクションを依存関係として追加するには、[トリガー] または [アクション] パラメーターをインライン コード アクションに適宜追加します。 次に、トリガーまたはアクションの名前を、ワークフローの基盤となる JSON 定義に表示されるとおりに追加します。
注意
変数の操作、For each や Until などのループ、反復インデックスを明示的な依存関係として追加することはできません。
コードを再利用する予定の場合は、必ずコード スニペットの編集ボックスを使用して、トリガーとアクションの出力を参照してください。 そうすることで、トリガーまたはアクションの出力を明示的な依存関係として単に追加するのではなく、解決されたトークン参照がコードに含まれるようになります。
たとえば、Office 365 Outlook コネクタの [承認の電子メールを送信します] アクションが、サンプル ワークフローのコード スニペットの前にあるとします。 次のコード スニペット例には、このアクションからの SelectedOption 出力への参照が含まれています。
この例では、[アクション] パラメーターのみ追加し、続いて、アクションの JSON 名 Send_approval_email
をそのパラメーターに追加する必要があります。 そうすることで、インライン コード アクションに [承認の電子メールを送信します] アクションからの出力が明示的に含まれるように指定します。
トリガーまたはアクションの JSON 名を検索する
開始する前に、基盤となるワークフロー定義のトリガーまたはアクションの JSON 名が必要になります。
ワークフロー定義の名前では、スペースではなく、アンダー スコア (_) が使用されます。
アクション名でドット演算子 (.) を使用する場合は、その演算子を含めます。次に例を示します。
My.Action.Name
ワークフロー デザイナーのツール バーで、[コード ビュー] を選択します。
actions
オブジェクトで、アクションの名前を見つけます。たとえば、
Send_approval_email
は、Send_approval_email
アクションの JSON 名です。デザイナー ビューに戻るには、コード ビューのツールバー上で [デザイナー] を選択します。
次に、JSON 名をインライン コード アクションに追加します。
トリガーまたはアクション名をインライン コード アクションに追加する
インライン コード アクションで、[新しいパラメーターの追加] リストを開きます。
パラメーターのリストから、シナリオに必要な次のパラメーターを選択します。
パラメーター 説明 アクション 以前のアクションからの出力を依存関係として含めます。 このパラメーターを選択した場合は、追加するアクションの入力を求められます。 トリガー トリガーからの出力を依存関係として含めます。 このパラメーターを選択した場合は、トリガーの結果を含めるかどうかを尋ねられます。 その場合は、[トリガー] リストで [はい] を選択します。 この例では、[アクション] パラメーターを選択します。
[Actions Item - 1] (アクション項目 - 1) ボックスにアクションの JSON 名を入力します。
別のアクション名を追加するには、[新しい項目の追加] を選択します。
完了したら、ワークフローを保存します。
アクション リファレンス
ワークフロー定義言語を使用した基盤となるワークフロー定義での [JavaScript コードの実行] アクションの構造と構文の詳細については、このアクションのリファレンス セクションを参照してください。