2018年5月8日火曜日

API 接続を含んだ Logic Apps をテンプレート化する

とある事情があって、API 接続を含んだ Logic Apps をテンプレート化して配布しようと色々やっていたのですが、配布の際に気を付ける点や Template の書き換えに結構手間取ったので備忘録としてまとめてみます。

なおこのエントリは Sacha Bruttin さんの素晴らしいエントリを参考に行いました。
Deploy Logic Apps & API Connection with ARM
https://www.bruttin.com/2017/06/13/deploy-logic-app-with-arm.html

まずは何かしらの LogicFlow をテンプレートとして出力します。

image

テンプレート出力自体は、Logic Apps を開いた際のメニューより、Automation スクリプトを選択することで実施可能です。しかしその際に出力される内容は、サブスクリプション ID や API 接続情報などもそのまま出力されてしまい、別環境や別サブスクリプションに配布したいと考えた場合には利用できません。

このような場合には ARM Template で用意されているパラメータを利用します。

image

パラメータの定義は、Template の parameters セクションに記述を行います。最低限必須なのは type 要素で、stringsecureStringintboolobjectsecureObjectarray の中から指定します。secureString はパスワードなどで利用する入力形式で、マスクされて表示されるものです。他にも選択肢の定義など色々指定が可能ですので、公式ドキュメントを参考にしてください。

image

今回は CognitiveService な API を利用したかったので、上記のように「APIキー」や「サイトURL」をパラメータで指定できるようにしました。ここで用意したパラメータは、Azure にデプロイした際に入力を求められます。

image

今回はここで入力した情報をもとに、新しく API 接続を作成するようなテンプレートとしたいのですが、そもそもこの APIキーとサイトURLが必要、というのはどこで調べたかというと LogicApps のコネクタ側から取得できる情報がもとになります。

以前のエントリで Logic Apps のサービス情報を取得して~、というのをやっていますが、これは利用可能な Logic Apps のコネクタ情報を取得しているものです。その際に取得できる情報として、利用するために必要な項目についても含まれています。

image

上記は ComputeVision API コネクタの情報です。connectionParameters 要素に必要となる情報についての情報が記載されています。今回はここにあるように、apiKey と siteUrl が必要だというのがここで判ります。これをパラメータとして入力させようとしているのです。

次に定義したパラメータを用いて、API 接続を設定する箇所です。

image

こちらが Automation スクリプトで出力したテンプレートでの API 接続部分です。リソース ID が出力されているのと、既に作成している API 接続情報を使うための記載になっていて、ここから新規に作成することはできない形になっています。そのためここでパラメータを使い、新しく登録も行える形に書き換える必要があります。

image

実際に書き換えた結果はこのようになります。

name 要素は API 接続設定における名称です。ここはパラメータを利用したいので "name": "[parameters('connections_name')]" と記載します。[ ] で囲んであるのは、結果を文字列として利用するための指定です。

location 要素は API を利用するためのリージョンです。今回は Logic Apps と API のリージョンを同一とするように "location": "[resourceGroup().location]" と記載します。resourcGroup と書いているのは ARM テンプレートで利用可能な関数で、デプロイ時に選択したリージョンが取得できます。

propeties 要素で、固有の情報を指定します。今回で言えば、API キーやサイト URL 情報は、ここに記載します。上記の例で言えば、properties 要素の中にある parameterValues 要素、その中に必要となる情報を記載しています。ここでは キー名:値、という形式での記述が必要ですが、キー名はコネクタ情報に含まれていた名称と一致させる必要があります。パラメータ名などは自由に名称を定義しても大丈夫です。

もう一つ重要な個所は api 要素の ID 値です。ここではテンプレート内部で利用する値を定義しているのですが、サブスクリプションIDやロケーションがそのままでは固定で記述されています。そのため resourceGroup 関数などを用いて、可変的になるように書き換えます。

"id": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Web/locations/', resourceGroup().location, '/managedApis/', parameters('connections_name'))]"

実際にはこのような形で、サブスクリプション ID とロケーションを可変的にします。

ここで指定した値がどこに関連してくるかですが、LogicFlow を定義している内部にある接続情報のあたりになります。

image

非常にこのあたりの関連性がわかりにくく、今でもよくわかっていないのですが、どうやら次のようなルールに則っているのではないかと考えられます。

  • $connection は LogicFlow から接続を参照する際に検索する情報を記載
  • ここでの connectionName や value 直下での要素名はどうやら固定?
  • connectionID は接続情報自体("type": "Microsoft.Web/connections" で定義されている情報)を検索するための設定
  • ID は接続情報で記載した ID とは別のもので、Logic Apps でアクセスする URL でなければデプロイ時にエラー

ここにパラメータを適用させようとするのが一番手間取りました・・・今でもよく理解できていません。ただ、こうすることでサブスクリプション ID やロケーション、API 接続情報なども可変的に利用できるテンプレートとなり、より一層配布が楽になりました。

image

API を利用している箇所では上記のように接続名を指定しており、ここでの接続名で、$connection を検索、今回の場合だとそこには新しい API 接続を参照するように記載されていたので、そちらの情報を見に行く・・・という流れだとは思っていますが、ここをちょっと書き換えると大体デプロイエラーになってしまったので、調べきれていないのが実情です。

まぁパラメータ化してデプロイ時に入力させるやり方としてはなんとなくわかったので、今後はもうちょっと楽に利用できるよう配布ができそうです。

0 件のコメント:

コメントを投稿