Azure Logic Apps でロジック アプリ ワークフロー定義の JSON を作成、編集、拡張する

適用対象: Azure Logic Apps (従量課金)

Azure Logic Apps で自動ワークフローを使用してエンタープライズ統合ソリューションを作成する場合、基になるワークフロー定義では、ワークフロー定義言語 (WDL) スキーマと共に単純な宣言型の JavaScript Object Notation (JSON) を記述と検証に使用します。 これらの形式を使用することで、コードに関する詳しい知識がなくても、ワークフロー定義を理解しやすくなります。 ロジック アプリ リソースの作成とデプロイを自動化するときには、Azure Resource Manager テンプレート内に Azure リソースとしてワークフロー定義を含めることができます。 ロジック アプリを作成、管理、デプロイするときは、Azure PowerShellAzure CLI、または Azure Logic Apps REST API を使用できます。

JSON でワークフロー定義を操作するには、Azure portal または Visual Studio で作業するときにコード ビュー エディターを開くか、任意のエディターに定義をコピーします。 Azure Logic Apps を初めて使用する場合は、「従量課金ロジック アプリ ワークフローの例を作成する」をご覧ください。

注意

ワークフロー定義のパラメーターや複数のトリガーの定義など、Azure Logic Apps の一部の機能は JSON でのみ使用でき、ワークフロー デザイナーでは使用できません。 したがって、これらのタスクについては、コード ビューまたは別のエディターで作業する必要があります。

JSON を編集する - Azure Portal

  1. Azure portal にサインインします。

  2. 左側のメニューの [すべてのサービス] を選択します。 検索ボックスで "logic apps" を検索し、検索結果からロジック アプリを選択します。

  3. ロジック アプリのメニューで、 [開発ツール][ロジック アプリ コード ビュー] を選択します。

    コード ビュー エディターが開き、JSON 形式でワークフロー定義が表示されます。

JSON を編集する - Visual Studio

Visual Studio でワークフロー定義を操作する前に、必要なツールがインストールされていることを確認します。 Visual Studio でロジック アプリを作成するときは、「クイック スタート:Azure Logic Apps を使用してタスクとプロセスを自動化する - Visual Studio」をご覧ください。

Visual Studio では、Azure Portal から直接デプロイされているか、Visual Studio から Azure Resource Manager プロジェクトとしてデプロイされている作成済みのロジック アプリを開くことができます。

  1. ロジック アプリを含む、Visual Studio ソリューションまたは Azureリソース グループ プロジェクトを開きます。

  2. ワークフロー定義を見つけて開きます。既定では、LogicApp.json という名前の Resource Manager テンプレートに表示されます。 このテンプレートを使用し、さまざまな環境へのデプロイ用にカスタマイズできます。

  3. ワークフロー定義とテンプレートのショートカット メニューを開きます。 [Open With Logic App Designer](ロジック アプリ デザイナーで開く) を選択します

    Visual Studio ソリューションのロジック アプリを開く

    ヒント

    このコマンドが Visual Studio 2019 にない場合は、Visual Studio の最新の更新プログラムが適用されていることを確認してください。

  4. ワークフロー デザイナーの下部で [コード ビュー] を選択します。

    コード ビュー エディターが開き、JSON 形式でワークフロー定義が表示されます。

  5. デザイナー ビューに戻るには、コード ビュー エディターの下部で [デザイン] を選択します。

パラメーター

通常、デプロイのライフサイクルには、開発、テスト、ステージング、運用の異なる環境があります。 ハードコーディングせずにロジック アプリ全体にわたって再利用したい値や、デプロイ ニーズによって異なる値がある場合は、ワークフロー定義のための Azure Resource Manager テンプレートを作成できます。それにより、ロジック アプリ デプロイも自動化できます。

これらの値をパラメーター化する次の一般的な手順に従うか、または代わりにこれらの値のパラメーターを定義して使用します。 その後、これらの値をテンプレートに渡す個別のパラメーター ファイルで値を指定できます。 それにより、ロジック アプリを更新して再デプロイしなくても、これらの値をより簡単に変更できます。 詳細については、概要: Automate deployment for logic apps with Azure Resource Manager templates」 (概要: Azure Resource Manager テンプレートを使用してロジック アプリのデプロイを自動化する) を参照してください。

  1. テンプレートで、それぞれ、デプロイ時と実行時に使用する値を受け入れるためのテンプレート パラメーターとワークフロー定義パラメーターを定義します。

    テンプレート パラメーターがワークフロー定義の外部にある parameters セクションで定義されるのに対して、ワークフロー定義パラメーターは、ワークフロー定義の内部にある parameters セクションで定義されます。

  2. ハードコードされた値を、これらのパラメーターを参照する式に置き換えます。 テンプレート式では、ワークフロー定義式とは異なる構文を使用します。

    実行時に評価されるワークフロー定義式の内部で、デプロイ時に評価されるテンプレート式を使用しないようにして、コードが複雑にならないようにします。 テンプレート式は、ワークフロー定義の外部でのみ使用します。 ワークフロー定義式は、ワークフロー定義の内部でのみ使用します。

    ワークフロー定義パラメーターの値を指定する場合は、ワークフロー定義の外部にあるが、引き続きロジック アプリのリソース定義の内部にある parameters セクションを使用してテンプレート パラメーターを参照できます。 それにより、テンプレート パラメーター値をワークフロー定義パラメーターに渡すことができます。

  3. パラメーターの値を個別のパラメーター ファイルに格納し、そのファイルをデプロイに含めます。

関数を使用して文字列を処理する

Azure Logic Apps には、文字列を操作するためのさまざまな関数があります。 たとえば、注文の会社名を別のシステムに渡すとします。 しかし、文字エンコードの適切な処理がわかりません。 この場合、この文字列の Base64 エンコードを実行できますが、URL のエスケープを回避するために、いくつかの文字を置き換えることができます。 また、最初の 5 文字は使用されないため、会社名の部分文字列のみが必要です。

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "order": {
      "defaultValue": {
        "quantity": 10,
        "id": "myorder1",
        "companyName": "NAME=Contoso"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "request": {
      "type": "Request",
      "kind": "Http"
    }
  },
  "actions": {
    "order": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://www.example.com/?id=@{replace(replace(base64(substring(parameters('order').companyName,5,sub(length(parameters('order').companyName), 5) )),'+','-') ,'/' ,'_' )}"
      }
    }
  },
  "outputs": {}
}

次の手順は、この例でこの文字列がどのように処理されるのかを示しています。内側から外側に向かって処理が行われます。

"uri": "https://www.example.com/?id=@{replace(replace(base64(substring(parameters('order').companyName,5,sub(length(parameters('order').companyName), 5) )),'+','-') ,'/' ,'_' )}"
  1. 会社名の length() を取得します。これにより、文字数の合計を取得します。

  2. 取得する文字列を短くするために、5 を減算します。

  3. substring() を取得します。 インデックス 5 から開始し、文字列の残りの部分に移動します。

  4. この部分文字列を base64() 文字列に変換します。

  5. 次に、replace() で、すべての + 文字を - 文字に置き換えます。

  6. 最後に、replace() で、すべての / 文字を _ 文字に置き換えます。

リスト項目をプロパティ値にマップし、マップをパラメーターとして使用する

プロパティの値に基づいて異なる結果を取得するには、各プロパティ値を結果に対応付けるマップを作成し、そのマップをパラメーターとして使用します。

たとえば、このワークフローでは、いくつかのカテゴリをパラメーターとして定義し、それらのカテゴリを特定の URL に対応付けるマップを定義します。 ワークフローでは、まず、記事のリストを取得します。 次に、マップを使用して、各記事のカテゴリに一致する URL を検索します。

  • intersection() 関数は、そのカテゴリが定義済みの既知のカテゴリと一致するかどうかを確認します。

  • 一致するカテゴリを取得したら、parameters[...] のように角かっこを使用して、マップから項目を取り出します。

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "specialCategories": {
      "defaultValue": [
        "science",
        "google",
        "microsoft",
        "robots",
        "NSA"
      ],
      "type": "Array"
    },
    "destinationMap": {
      "defaultValue": {
        "science": "https://www.nasa.gov",
        "microsoft": "https://www.microsoft.com/en-us/default.aspx",
        "google": "https://www.google.com",
        "robots": "https://en.wikipedia.org/wiki/Robot",
        "NSA": "https://www.nsa.gov/"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "Request": {
      "type": "Request",
      "kind": "http"
    }
  },
  "actions": {
    "getArticles": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=https://feeds.wired.com/wired/index"
      }
    },
    "forEachArticle": {
      "type": "foreach",
      "foreach": "@body('getArticles').responseData.feed.entries",
      "actions": {
        "ifGreater": {
          "type": "if",
          "expression": "@greater(length(intersection(item().categories, parameters('specialCategories'))), 0)",
          "actions": {
            "getSpecialPage": {
              "type": "Http",
              "inputs": {
                "method": "GET",
                "uri": "@parameters('destinationMap')[first(intersection(item().categories, parameters('specialCategories')))]"
              }
            }
          }
        }
      },
      "runAfter": {
        "getArticles": [
          "Succeeded"
        ]
      }
    }
  }
}

日付関数を使用してデータを取得する

"トリガー" をネイティブにサポートしていないデータ ソースからデータを取得するには、代わりに日付関数を使用して日付と時刻を処理します。 たとえば、次の式では、このワークフローのステップの所要時間を確認します。内側から外側に向かって処理が行われます。

"expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
  1. order アクションから startTime を抽出します。

  2. utcNow() を使用して現在の時刻を取得します。

  3. 1 秒減算します。

    addseconds(..., -1)

    このとき、minuteshours のような他の時間単位も使用できます。

  4. これで、この 2 つの値を比較できます。

    最初の値が 2 番目の値より小さい場合、最初に注文が実行されてから 2 秒以上経過しています。

日付を書式設定するには、文字列フォーマッタを使用します。 たとえば、RFC1123 を取得するには、utcnow('r') を使用します。 日付の書式設定の詳細については、こちらをご覧ください。

{
  "$schema": "https://schema.management.azure.com/schemas/2016-06-01/Microsoft.Logic.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "order": {
      "defaultValue": {
        "quantity": 10,
        "id": "myorder-id"
      },
      "type": "Object"
    }
  },
  "triggers": {
    "Request": {
      "type": "request",
      "kind": "http"
    }
  },
  "actions": {
    "order": {
      "type": "Http",
      "inputs": {
        "method": "GET",
        "uri": "https://www.example.com/?id=@{parameters('order').id}"
      }
    },
    "ifTimingWarning": {
      "type": "If",
      "expression": "@less(actions('order').startTime,addseconds(utcNow(),-1))",
      "actions": {
        "timingWarning": {
          "type": "Http",
          "inputs": {
            "method": "GET",
            "uri": "https://www.example.com/?recordLongOrderTime=@{parameters('order').id}&currentTime=@{utcNow('r')}"
          }
        }
      },
      "runAfter": {
        "order": [
          "Succeeded"
        ]
      }
    }
  },
  "outputs": {}
}

次のステップ