Azure Logic Apps の Standard プランを概観する

# はじめに
2021 年 5 月開催の Microsoft Build 2021 に合わせて Azure Logic Apps の新しいリソースの種類である Standard が一般提供開始になりました。

Logic App Standard は、Azure App Service 上で Azure Functions の拡張的な機能として実行されます。そのため、App Service で利用可能な機能、例えば自動スケールやリージョン VNet 統合、仮想ネットワーク サービス エンドポイントなどの機能を利用できます。

本記事では、Logic App Standard の概観と主にネットワーク周りの設定についてざっくり見ていきます。なお、発表内容の詳細、そして機能の詳細については、以下のブログと公式ドキュメントをご覧ください。

https://techcommunity.microsoft.com/t5/azure-developer-community-blog/azure-logic-apps-announcement-ga-of-single-tenant-standard-sku/ba-p/2382460

https://docs.microsoft.com/ja-jp/azure/logic-apps/create-single-tenant-workflows-azure-portal#firewall-setup

# Logic App Standard のデプロイ画面
まずは、デプロイの画面がどうなっているかを見ていきます。

Azure ポータルで Logic App の追加をクリックすると、「Standard」という項目があり、ここからデプロイを開始できます。以前の種類の Logic App は「従量課金プラン」からデプロイを開始できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/77b47c9e-8793-f52b-da8b-20b2200cbac0.png)

作成画面の項目は Functions と非常に近しいものになっています。Logic App 名は URL エンドポイントの一部として使われるため、グローバルで一意になっている必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/e467bfbc-781a-f1d2-6470-60d863ab515b.png)

次のページではストレージ アカウント、プラン、SKU (スペック) を入力しますが、これも Function App とほぼ同様です。

なお、[プランの種類] の選択肢に「ワークフロー Standard」の他に「App Service プラン」がありますが、後者は現時点ではまだ利用できないようで、グレーアウトされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/b57e8e20-ec62-827a-1fc7-eaed4c30e69c.png)

Function App と同様、Application Insights との連携もサポートされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f45d46a6-1087-1c11-1f6e-517696319e68.png)

## スペック
スペックは 2021 年 5 月 31 日現在、WS1 / WS2 / WS3 の 3 つの価格レベルから選択できます。各価格レベルの違いは Azure Compute ユニットとメモリのサイズで、含まれる機能については違いがありません。スペックはデプロイ後に変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/428a78d7-e5df-6a4a-4284-fca5d2d2eec0.png)

各スペックの価格は英語版の docs.microsoft.com の以下ページに記載がありました。[日本語版の Docs](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-pricing#hosting-plans-and-pricing-tiers) 及び[製品の価格ページ](https://azure.microsoft.com/ja-jp/pricing/details/logic-apps/) への反映にはタイムラグがあるようです。

https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-pricing#hosting-plans-pricing-tiers-and-billing-rates

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/dfba7d8e-a047-1137-9aa7-769fbc7c2b19.png)

# Logic App Standard のデプロイ結果
デプロイの結果、以下のようなリソース群が作成されます。Function App とほぼ同じ構成ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/a56046de-4e89-83bc-60ce-0b251eb36705.png)

Logic App の概要画面は以下のような感じです。[ワークフロー] などを除いて、左側メニューも Function App とほぼ同じ構成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3ee332ea-6886-cdb4-6e7c-fee7a5ea42e0.png)

# ワークフロー
[ワークフロー] の画面では、Logic App に紐づくワークフローの一覧を確認できます。ワークフローは、Function App の関数に相当し、1 つの Logic App に複数のワークフローを紐づけることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/e95e3a33-2a6d-95a1-cf7f-043013c42e43.png)

ワークフローを追加する際に、ステートフルかステートレスかを選択します。ステートフルは名前が示す通り、各アクションとその状態の入出力を外部ストレージに保存するのに対し、ステートレスは各アクションとその状態の入出力をメモリ内にのみ保存します。

ステートレスの方が処理時間が短縮され、応答が速くなり、スループットが向上し、実行にかかるコストも少なくなる一方で、ワークフローの実行履歴は見られません。
ワークフローのデバッグ モードを有効にしている間は実行履歴を見ることができるので、動作確認時はデバッグ モードを有効にしておき、完了したらデバッグ モードを無効にする、といった運用を取ることもできます。

ステートフルとステートレスのどちらを選ぶべきかは以下のガイドに詳細がまとまっています。

https://docs.microsoft.com/ja-jp/azure/logic-apps/single-tenant-overview-compare#stateful-stateless

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/8c9762b3-615c-3af5-fdf6-fc8a6e9fb6da.png)

何も設定していないワークフローの [概要] 画面です。今までの Logic App と似た作りになっています。Azure ポータルの左メニューの [コード] や [デザイナー] から処理を定義できます。また、VS Code を使用してローカルで開発することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3c2a6d31-a125-6590-7311-e7fb2e0e52a7.png)

[デザイナー] と [コード] の画面の作りは、従量課金プランと大きく変わりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/d4693c03-0266-3af5-2fd4-54b20f4a5637.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/541414ff-6778-311b-c10f-fa2e86a1cf24.png)

ワークフローにトリガーとアクションを定義して保存し [概要] 画面に行くと、ワークフロー URL が発行されます。このワークフロー URL にアクセスすることで、ワークフローが起動されます。

なお、ステートレスの場合は起動しても実行履歴が記録されないため、実行履歴を記録したい場合は [デバッグ モードを有効にする] を選択します。デバッグ モードは有効、無効を切り替えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7aaaddf7-abaf-b6bd-539d-63596c147943.png)

実行履歴をクリックすると、ワークフローのアクション レベルの情報を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/d169c369-381e-6ed1-1e4b-4aa89d14461b.png)

## ステートフル、ステートレスのトリガーについて
ワークフローでは最初にトリガーを定義する必要がありますが、ステートフルでは Azure 及びビルトインのコネクターを選択でき、ステートレスではビルトインのコネクターのみを選択できます。
種類が Azure になっているものは、従量課金プランの Logic App でも利用可能な 400 以上のマネージド コネクターを指します。

https://docs.microsoft.com/ja-jp/connectors/connector-reference/connector-reference-logicapps-connectors

ビルトイン コネクターのトリガーとアクションは Logic App Standard のランタイムでネイティブに実行されます。
Azure Service Bus や Azure Event Hubs、SQL Server、MQ などがサポートされており、今後も拡充されていく予定ですが、Azure のコネクターに比べると利用可能な数は少ないです。

https://docs.microsoft.com/ja-jp/azure/logic-apps/single-tenant-overview-compare#other-single-tenant-model-capabilities

(画像クリックで拡大)

ステートフル (Azure) | ステートフル (ビルトイン) | ステートレス (ビルトイン)
--- | --- | ---
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/176be515-9565-91c8-bb2b-2369cfe6f907.png"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/255d16fc-8841-d69b-c475-7e45199317b1.png"> | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/63f2fd35-957b-e59c-1b0a-cce1610b2ef8.png">

# ネットワーク関連オプション
Logic App の左側メニューの [ネットワーク] からネットワーク関連のオプションが確認できます。Azure Functions の Premium プランなどと同様のオプションを利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/7c506cac-8677-d1ad-d810-eff87fad2372.png)

## Logic App Standard から VNet 内のリソースへのプライベート アクセス
Logic App Standard の VNet 関連のユースケースは色々あるかと思いますが、代表的なものとして、**Logic App Standard から VNet 内のリソースにプライベート アクセスしたい** というユースケースが考えられます。

例えば、VNet 内にある SQL Server on Azure VM や Azure SQL Managed Instance のプライベート エンドポイントにアクセスしたい、といったものです。このユースケースは、リージョン VNet 統合とビルトイン コネクターにより実現できます。

### リージョン VNet 統合
App Service / Function App と同じ要領で、[ネットワーク] の [VNet 統合] から Logic App Standard を関連付ける VNet のサブネットを選択すれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/d75567be-7b96-1696-0b44-fcd5207e570c.png)

### ビルトイン コネクター
Logic App Standard の一機能である リージョン VNet 統合を利用して VNet 内のリソースにアクセスするためには、ビルトイン コネクターを利用する必要があります。前述の通り、ビルトイン コネクターは Logic App Standard のランタイムでネイティブに実行されます。

種類 が Azure になっているコネクターは、従量課金プランの Logic App と同じように動作するため、プライベート通信をサポートしません。

#### (例) Azure SQL Managed Instance へのプライベート アクセス
例として、VNet 内にデプロイした Azure SQL Managed Instance (SQL MI) のプライベート エンドポイントにリージョン VNet 統合を経由してアクセスする場合、ビルトインの SQL Server コネクターを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/d5f8f734-57fe-12fe-2c4e-4b8f94f42eff.png)

ビルトインの SQL Server コネクターは、現時点で Execute Query (クエリの実行) のみをアクションとしてサポートしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/56b1cf33-d06b-a854-f3e1-896ad7d53d47.png)

接続名は任意の名前、接続文字列は以下の形式で入力します。

```
Server=tcp:<my-sqlmi.123456789012.database.windows.net>,1433;Initial Catalog=<test-db>;Persist Security Info=False;User ID=<user_name>;Password=<password>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3975501e-b473-e2f7-447b-e79ef86dad7a.png)

任意のクエリを入力し、保存します。これでワークフロー URL を呼び出して成功すれば、設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/68daf75e-1456-932d-d704-b541eb1984a8.png)

なお、接続情報は左メニューの [接続] の [サービス プロバイダー接続] から確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2bdac355-22ce-f91e-383f-e184347cc80f.png)

接続文字列は [構成] の [アプリケーション設定] に保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/a3a488f7-0091-acfd-192d-a440932d1c3d.png)

## VNet 内のリソースから Logic App Standad へのプライベート アクセス
上記は通信の起点が Logic App Standard でしたが、それとは逆に、Logic App Standard へのアクセスをプライベート アクセスに限定したいというニーズもあると思います。

このニーズに応えるためには、プライベート エンドポイント、または仮想ネットワーク サービス エンドポイントを利用できます。

### (例) Azure VM からのプライベート アクセス
例として、VNet 内にデプロイした Azure VM から Logic App Standard に仮想ネットワーク サービス エンドポイントを用いてアクセスしたいと思います。

[ネットワーク] で [アクセス制限の構成] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/06937dba-60da-31da-8625-1554a5d7a3c8.png)

[アクセス制限の編集] で接続を許可する VNet のサブネットを指定して保存します。
これにより、優先順位の最後に Deny all の規則が自動的に追加され、アクセスを許可した VNet のサブネット以外からのアクセスはできなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/1d38f4fa-f186-facc-53c3-597ba239a486.png)

試しに、クライアントの PC からワークフロー URL を呼び出すと、次のような 403 の画面が表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/34a42928-5f1f-8020-a5b8-44cd9da63f5a.png)

接続を許可した VNet のサブネット内の VM からワークフロー URL を呼び出すと 200 の結果が返ってくれば、サービス エンドポイントが正しく設定できています。

```
nakazax@vm-nakazax-logic-standard:~$ curl -I "https://logic-nakazax-standard-ejp.azurewebsites.net:443/api/http-req-res-stateless/triggers/manual/invoke?api-version=2020-05-01-preview&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=xxx"
HTTP/1.1 200 OK
Content-Length: 0
Request-Context: appId=cid-v1:364980c3-3d98-40b5-b9b0-06d42174d8fb
x-ms-request-id: :fe8a9218-a185-4e34-88f1-2bb531139b0e
Date: Mon, 31 May 2021 15:29:34 GMT
```

以上です。