Azure Logic Apps でスコープを使用してグループの状態に基づいてアクションを実行する
適用対象: Azure Logic Apps (従量課金)
別のアクションのグループが成功または失敗した後にのみアクションを実行するには、そのアクションを "スコープ" の中にグループ化します。 この構造は、アクションを論理グループとして整理し、そのグループの状態を評価して、そのスコープの状態に基づいてアクションを実行するときに便利です。 そのスコープ内のすべてのアクションの実行が完了すると、スコープも独自の状態を取得します。 たとえば、例外とエラー処理を実装するときにスコープを使用できます。
スコープの状態を調べるには、ロジック アプリの実行状態を判定するのと同じ基準 ( [成功] 、 [失敗] 、 [取り消し済み] など) を使用できます。 既定では、スコープのすべてのアクションが成功すると、そのスコープの状態は [成功] とマークされます。 ただし、スコープ内のいずれかのアクションが失敗するかキャンセルされると、そのスコープの状態は [失敗] とマークされます。 スコープの制限については、制限と構成に関するページをご覧ください。
一例として、特定のアクションを実行するスコープと、そのスコープの状態をチェックする条件を使用する、基本のロジック アプリを紹介します。 スコープ内のいずれかのアクションが失敗または予期せず終了した場合、そのスコープはそれぞれ [失敗] または [中止] とマークされ、ロジック アプリによって [Scope failed](スコープが失敗した場合) というメッセージが送信されます。 スコープ内のすべてのアクションが成功した場合、ロジック アプリは [Scope succeeded](スコープが成功した場合) のメッセージを送信します。
前提条件
この記事の例に従って進めるには、次の項目が必要です。
Azure サブスクリプション。 サブスクリプションをお持ちでない場合には、無料の Azure アカウントにサインアップしてください。
Logic Apps でサポートされる任意の電子メール プロバイダーの電子メール アカウント。 この例では、Outlook.com を使用します。 別のプロバイダーを使用する場合、フロー全般は変わりませんが、UI の表示が異なります。
Bing 地図のキー。 このキーを取得するには、Bing 地図のキーの取得に関する記事をご覧ください。
ロジック アプリに関する基本的な知識
サンプルのロジック アプリを作成する
まず、このサンプルのロジック アプリを作成し、後でスコープを追加します。
- Bing 地図のサービスを指定した間隔でチェックする [スケジュール - 繰り返し] トリガー
- 2 つの場所の間の移動時間をチェックする [Bing Maps - Get route](Bing 地図 - ルートを取得する) アクション
- 移動時間が指定した移動時間を超えるかどうかをチェックする条件アクション
- 現在の移動時間が指定した時間を超えたことで電子メールを送信するアクション
ロジック アプリはいつでも保存できるため、頻繁に保存してください。
まだサインインしていない場合は、Azure Portal にサインインします。 空のロジック アプリを作成します。
[スケジュール - 繰り返し] トリガーを追加します。 [間隔] は "1"、 [頻度] は [分] に、それぞれ設定します
ヒント
ビューを視覚的に簡略化し、デザイナーで各アクションの詳細を非表示にするには、これらのステップを進むにつれ各アクションのシェイプを折りたたみます。
[Bing Maps - Get route](Bing 地図 - ルートを取得する) アクションを追加します。
Bing 地図の接続が存在しない場合、接続を作成するように求められます。
設定 値 説明 Connection Name BingMapsConnection 接続の名前を指定します。 API キー <your-Bing-Maps-key> あらかじめ取得しておいた Bing 地図のキーを入力します。 この画像の下の表に示すように、 [Get route](ルートを取得する) アクションを設定します。
これらのパラメーターの詳細については、「Calculate a route (ルートの計算)」を参照してください。
設定 値 説明 通過地点 1 <start> ルートの出発地を入力します。 通過地点 2 <end> ルートの目的地を入力します。 回避 なし ルート上で回避する要素 (高速道路、通行料金など) を入力します。 使用できる値については、「Calculate a route」 (ルートを計算する) をご覧ください。 最適化 timeWithTraffic ルートを最適化するためのパラメーター (距離、最新の交通情報を加味した移動時間など) を選択します。 この例では、値 "timeWithTraffic" を使用します。 距離単位 <your-preference> ルートを計算する距離の単位を入力します。 この例では、次の値を使用します:"マイル" Travel mode (移動手段) Driving (車) ルートの移動手段を入力します。 この例では、値 "Driving (車)" を使用します。 Transit Date-Time (交通機関の日時) なし 乗り換えモードの場合のみ適用されます。 Transit Date-Type Type (交通機関の日時の種類) なし 乗り換えモードの場合のみ適用されます。
現在の交通量を加味した移動時間が指定の時間を超えるかどうかをチェックする条件を追加します。 この例に対して、次の手順に従います。
条件の名前を次の説明に変更します: If traffic time is more than specified time (移動時間が指定した時間を超える場合)
左端の列で、[値の選択] ボックス内を選択すると、動的コンテンツ リストが表示されます。 その一覧から、 [Travel Duration Traffic](移動時間の交通量) フィールドを選択します (秒単位)。
真ん中のボックスで、 [次の値より大きい] 演算子を選択します。
右端の列にこの比較値を入力します。これは秒単位であり、10 分であれば次の値になります:600
完成した条件は次の例のようになります。
[True] ブランチに、お使いの電子メール プロバイダーの "電子メールを送信する" アクションを追加します。 この画像にある手順に従い、このアクションを設定します。
[宛先] フィールドに、テスト用に自分の電子メール アドレスを入力します。
[件名] フィールドに、次のテキストを入力します。
Time to leave: Traffic more than 10 minutes
- [本文] フィールドに、次のテキストを入力し、末尾にスペースを追加します。
Travel time:
[本文] フィールドにカーソルが表示されている間は、この時点で使用できる任意のパラメーターを選択できるように、動的コンテンツ リストが開いたままになります。
動的コンテンツ リストの [式] を選択します。
div() 関数を探して選択します。 関数の括弧内にカーソルを置きます。
カーソルが関数の括弧内にある状態で [動的コンテンツ] を選択すると、動的コンテンツ リストが表示されます。
[ルートを取得する] セクションから、 [Travel Duration Traffic](移動時間の交通量) フィールドを選択します。
フィールドが JSON 形式に解決された後、数字
60
に続けてカンマ (,
) を追加して、[Travel Duration Traffic]\(移動時間の交通量\) の値を秒から分に変換します。div(body('Get_route')?['travelDurationTraffic'],60)
これで式は次の例のようになります。
終了したら、 [OK] を選択します。
式が解決された後は、テキスト
minutes
と先頭にスペースを追加します。これで [本文] フィールドは次の例のようになります。
ロジック アプリを保存します。
次に、スコープを追加して特定のアクションをグループ化し、それらの状態を評価します。
スコープを追加する
ワークフロー デザイナーでロジック アプリをまだ開いていない場合は、開きます。
必要なワークフローの場所にスコープを追加します。 たとえば、ロジック アプリ ワークフローに既存の手順間のスコープを追加するには、次の手順を行います。
スコープを追加する場所の矢印の上にポインターを移動します。 プラス記号 (+) を選択し、>[アクションの追加] を選択します。
検索ボックスに、フィルターとして「scope」と入力します。 [スコープ] アクションを選択します。
スコープに手順を追加する
ここで、スコープ内で実行するステップを追加するか、既存のステップをドラッグします。 この例では、次のアクションをスコープにドラッグします。
- [Get route](ルートを取得する)
- If traffic time is more than specified time (移動時間が指定した時間を超える場合) 。true と false の両方のブランチが含まれます。
これでロジック アプリは次の例のようになります。
スコープの下に、スコープの状態をチェックする条件を追加します。 条件の名前を次の説明に変更します: スコープが失敗した場合
条件で、スコープの状態が "失敗" または "中止" に相当するかどうかを判断する次のような式を追加します。
別の行を追加するには、[追加] を選択します。
各行で左のボックス内を選択すると、動的コンテンツ リストが表示されます。 動的コンテンツ リストから、[式] を選択します。 編集ボックスにこの式を入力し、[OK] を選択します。
action('Scope')
両方の行で演算子に [次の値に等しい] を選択します。
比較値については、最初の行に
Failed
を入力します。 2 番目の行にAborted
を入力します。完成した条件は次の例のようになります。
次に、条件によってスコープの状態が確認され、後の手順で定義する照合アクションが実行されるように、条件の
runAfter
プロパティを設定します。[スコープが失敗した場合] 条件で省略記号 (...) ボタンを選択し、[実行条件の構成] を選択します。
状態が is successful (成功した)、has failed (失敗した)、is skipped (スキップされた)、has timed out (タイムアウトした) のスコープをすべて選択します。
完了したら、 [完了] をクリックします。 条件に "情報" アイコンが表示されます。
[True] ブランチと [False] ブランチに、各スコープの状態に基づいて実行するアクション (例: メールまたはメッセージを送信する) を追加します。
ロジック アプリを保存します。
完成したロジック アプリは次の例のようになります。
作業をテストする
デザイナーのツール バーで、[実行]>[実行] を選択します。 すべてのアクションが成功した場合、ロジック アプリは [Scope succeeded](スコープが成功した場合) のメッセージを送信します。 いずれかのアクションが失敗した場合は、[Scope failed](スコープが失敗した場合) のメッセージが送信されます。
JSON の定義
コード ビューで操作している場合、代わりにロジック アプリの JSON 定義でスコープ構造を定義できます。 たとえば、前のロジック アプリのトリガーとアクションの JSON 定義は、次のようになります。
"triggers": {
"Recurrence": {
"type": "Recurrence",
"recurrence": {
"frequency": "Minute",
"interval": 1
}
}
}
"actions": {
"If_scope_failed": {
"type": "If",
"actions": {
"Scope_failed": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Scope failed. Scope status: @{action('Scope')}",
"Subject": "Scope failed",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"else": {
"actions": {
"Scope_succeded": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Scope succeeded. Scope status: @{action('Scope')}",
"Subject": "Scope succeeded",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
}
},
"expression": {
"or": [
{
"equals": [
"@action('Scope')",
"Failed"
]
},
{
"equals": [
"@action('Scope')",
"Aborted"
]
}
]
},
"runAfter": {
"Scope": [
"Failed",
"Skipped",
"Succeeded",
"TimedOut"
]
}
},
"Scope": {
"type": "Scope",
"actions": {
"Get_route": {
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['bingmaps']['connectionId']"
}
},
"method": "get",
"path": "/REST/V1/Routes/Driving",
"queries": {
"distanceUnit": "Mile",
"optimize": "timeWithTraffic",
"travelMode": "Driving",
"wp.0": "<start>",
"wp.1": "<end>"
}
},
"runAfter": {}
},
"If_traffic_time_is_more_than_specified_time": {
"type": "If",
"actions": {
"Send_mail_when_traffic_exceeds_10_minutes": {
"type": "ApiConnection",
"inputs": {
"body": {
"Body": "Travel time:@{div(body('Get_route')?['travelDurationTraffic'],60)} minutes",
"Subject": "Time to leave: Traffic more than 10 minutes",
"To": "<your-email@domain.com>"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/Mail"
},
"runAfter": {}
}
},
"expression": {
"and" : [
{
"greater": [
"@body('Get_route')?['travelDurationTraffic']",
600
]
}
]
},
"runAfter": {
"Get_route": [
"Succeeded"
]
}
}
},
"runAfter": {}
}
},