Azure Logic Apps のワークフローを使用して JavaScript コードをインラインで追加して実行する
適用対象: Azure Logic Apps (従量課金プラン + Standard)
Azure Logic Apps でワークフローとインラインでカスタム統合タスクを実行するには、Azure portal でワークフローから簡単な JavaScript コード スニペットを直接追加して実行できます。 このタスクでは、JavaScript コードの実行という名前のインライン コード アクションを使用します。 このアクションはコード スニペットから結果を返すので、その出力をワークフローの後続のアクションで使用できます。 また、このアクションは、従量課金または Standard のどちらのワークフローを使用しているかによって制限が異なるため、次の属性を持つコード スニペットに最適です。
アクション | 言語 | 言語バージョン | 実行継続時間 | データ サイズ | 他の注意事項 |
---|---|---|---|---|---|
JavaScript コードの実行 | JavaScript | Standard: Node.js 16.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 のどちらのロジック アプリ ワークフローを使用しているかに基づいて、次の要件を確認します。
従量課金ワークフロー
ロジック アプリ リソース (空であってもそうでなくても) から統合アカウントへのリンク。
重要
ユース ケースまたはシナリオに適した統合アカウントを使用していることを確認します。
たとえば、Free レベルの統合アカウントは、運用環境のシナリオではなく探索的なシナリオとワークロードのみを対象としており、用途とスループットが制限されており、サービス レベル アグリーメント (SLA) ではサポートされていません。
他の統合アカウント レベルではコストが発生しますが、SLA のサポートが含まれ、スループットが向上し、上限も高くなります。 統合アカウントのレベル、制限、価格の詳細を確認してください。
Standard ワークフロー
統合アカウントは不要。
[JavaScript コードの実行] アクションを追加する
Azure portal で、従量課金ロジック アプリのワークフローをデザイナーで開きます。
デザイナーで、次の一般的な手順に従って、[JavaScript コードの実行] という名前のインライン コード アクションをワークフローに追加します。
この例では、Office 365 Outlook トリガーの下にアクションが追加されます。 既定では、アクションには
return
ステートメントなどのいくつかのサンプル コードが含まれています。[コード] ボックス内でサンプル コードを削除し、自分のコードを入力します。 メソッド内に配置するコードを作成します。ただし、メソッド シグネチャは含めません。
ヒント
カーソルを [コード] ボックスに置くと、動的コンテンツ リストが表示されます。 このリストは後で使用しますが、ここではリストを無視し、開いたままにしておいて構いません。 [非表示] を選択しないでください。
認識済みのキーワードの入力を開始すると、オートコンプリートのリストが表示され、用意されているキーワードから選択できるようになります。例を次に示します。
以下のサンプルのコード スニペットでは、入力テキストで一致パターンを指定する "正規表現" を格納する、myResult という名前の変数が最初に作成されます。 次に、このコードでは、email という名前の変数が作成され、トリガー出力からの電子メール メッセージの本文の内容が格納されます。
[コード] ボックスにカーソルを置いたままの状態で、開いている動的コンテンツ リストから [新しいメールが届いたとき] というセクションを見つけて、電子メール メッセージの本文を参照する [本文] プロパティを選択します。
動的コンテンツ リストには、トリガーからの出力と、それらの出力が現在フォーカス中の編集ボックスの入力形式と一致する以前のアクションがすべて表示されます。 このリストにより、これらの出力が使用しやすくなり、ワークフローから参照しやすくなります。 この例では、電子メール メッセージの [本文] プロパティなど、Outlook トリガーからの出力がリストに表示されます。
[本文] プロパティを選択すると、[JavaScript コードの実行] アクションによってトークンが読み取り専用の
workflowContext
JSON オブジェクトに解決され、スニペットでこれを入力として使用できます。 このworkflowContext
オブジェクトには、トリガーのbody
プロパティ (電子メール メッセージの [本文] プロパティとは異なります) など、ワークフロー内のトリガーと以前のアクションからの出力へのアクセス権をコードに付与するプロパティが含まれています。workflowContext
オブジェクトの詳細についは、この記事で後述する「workflowContext オブジェクトを使用してトリガーとアクションの出力を参照する」を参照してください。重要
コード スニペットがドット (.) 演算子を含むアクション名を参照する場合、それらの参照で、これらのアクション名を角かっこ ([]) と引用符 ("") で囲む必要があります。次に例を示します。
// Correct
workflowContext.actions["my.action.name"].body
// Incorrect
workflowContext.actions.my.action.name.body
また、[JavaScript コードの実行] アクションでは、[アクション] パラメータを追加して、これらのアクション名をそのパラメータに追加する必要があります。 詳細については、この記事で後述する「[JavaScript コードの実行] アクションに依存関係をパラメータとして追加する」を参照してください。
選択した電子メール メッセージの [本文] プロパティをトリガーの
body
プロパティから区別するには、2 番目のbody
プロパティの名前を代わりにBody
に変更します。 終了セミコロン (;) を末尾に追加して、コード ステートメントを終了します。[JavaScript コードの実行] アクションでは、
return
ステートメントは構文的に必要ありません。 ただし、return
ステートメントを含めることにより、後のアクションで [結果] トークンを使用して、ワークフローの後半でアクションの結果をより簡単に参照できます。この例では、コード スニペットは、指定された正規表現に対する電子メール メッセージ本文内の一致を検索する
match()
関数を呼び出して結果を返します。 続いて、[HTML テーブルの作成] アクションは [結果] トークンを使用して、[JavaScript コードの実行] アクションの結果を参照し、1 つの結果を作成します。完了したら、ワークフローを保存します。
workflowContext オブジェクトを使用してトリガーとアクションの出力を参照する
デザイナーのコード スニペット内から、動的コンテンツ リストを使用して、トリガーまたは以前のアクションからの出力を参照するトークンを選択できます。 このトークンを選択すると、[JavaScript コードの実行] アクションによって、そのトークンが読み取り専用の 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()
}
}
}
次の表は、これらのプロパティの詳細情報を示しています。
プロパティ | タイプ | 説明 |
---|---|---|
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"
}
}
}
}
[JavaScript コードの実行] アクションに依存関係をパラメータとして追加する
一部のシナリオでは、コードが依存関係として参照するトリガーやアクションの出力を、[JavaScript コードの実行] アクションに含めることを明示的に要求することが必要になる場合があります。 たとえば、ワークフローの実行時に使用できない出力をコードが参照する場合は、この追加のステップを実行する必要があります。 ワークフローの作成時に、Azure Logic Apps エンジンはコード スニペットを分析して、コードがトリガーまたはアクションの出力を参照しているかどうかを判断します。 これらの参照が存在する場合、エンジンにはそれらの出力が自動的に含まれます。 ワークフローの実行時に、参照されているトリガーまたはアクションの出力が workflowContext
オブジェクトに見つからない場合、エンジンはエラーを生成します。 このエラーを解決するには、そのトリガーまたはアクションを [JavaScript コードの実行] アクションの明示的な依存関係として追加する必要があります。 このステップを実行する必要があるもう 1 つのシナリオとして、workflowContext
オブジェクトがドット演算子 (.) を使用するトリガーまたはアクションの名前を参照する場合があります。
トリガーまたはアクションを依存関係として追加するには、[トリガー] または [アクション] パラメータを [JavaScript コードの実行] アクションに適宜追加します。 次に、トリガーまたはアクションの名前を、ワークフローの基盤となる JSON 定義に表示されるとおりに追加します。
注意
変数の操作、For each や Until などのループ、反復インデックスを明示的な依存関係として追加することはできません。
コードを再利用する予定の場合は、必ずコード スニペットの編集ボックスを使用して、トリガーとアクションの出力を参照してください。 そうすることで、トリガーまたはアクションの出力を明示的な依存関係として単に追加するのではなく、解決されたトークン参照がコードに含まれるようになります。
たとえば、Office 365 Outlook コネクタの [承認の電子メールを送信します] アクションが、サンプル ワークフローのコード スニペットの前にあるとします。 次のコード スニペット例には、このアクションからの SelectedOption 出力への参照が含まれています。
この例では、[アクション] パラメーターのみ追加し、続いて、アクションの JSON 名 Send_approval_email
をそのパラメーターに追加する必要があります。 そうすることで、[JavaScript コードの実行] アクションに [承認の電子メールを送信します] アクションからの出力が明示的に含まれるように指定します。
トリガーまたはアクションの JSON 名を検索する
開始する前に、基盤となるワークフロー定義のトリガーまたはアクションの JSON 名が必要になります。
ワークフロー定義の名前では、スペースではなく、アンダー スコア (_) が使用されます。
アクション名でドット演算子 (.) を使用する場合は、その演算子を含めます。次に例を示します。
My.Action.Name
ワークフロー デザイナーのツール バーで、[コード ビュー] を選択します。
actions
オブジェクトで、アクションの名前を見つけます。たとえば、
Send_approval_email
は、Send_approval_email
アクションの JSON 名です。デザイナー ビューに戻るには、コード ビューのツールバー上で [デザイナー] を選択します。
次に、JSON 名を [JavaScript コードの実行] アクションに追加します。
トリガーまたはアクション名を [JavaScript コードの実行] アクションに追加する
[JavaScript コードの実行] アクションで、[新しいパラメーターの追加] リストを開きます。
パラメーターのリストから、シナリオに必要な次のパラメーターを選択します。
パラメーター 説明 アクション 以前のアクションからの出力を依存関係として含めます。 このパラメーターを選択した場合は、追加するアクションの入力を求められます。 トリガー トリガーからの出力を依存関係として含めます。 このパラメーターを選択した場合は、トリガーの結果を含めるかどうかを尋ねられます。 その場合は、[トリガー] リストで [はい] を選択します。 この例では、[アクション] パラメーターを選択します。
[Actions Item - 1] (アクション項目 - 1) ボックスにアクションの JSON 名を入力します。
別のアクション名を追加するには、[新しい項目の追加] を選択します。
完了したら、ワークフローを保存します。
アクション リファレンス
ワークフロー定義言語を使用した基盤となるワークフロー定義での [JavaScript コードの実行] アクションの構造と構文の詳細については、このアクションのリファレンス セクションを参照してください。