Azure Logic Apps で Azure Resource Manager テンプレートスペックの ARM テンプレートをデプロイする

## はじめに
ローコードでワークフローを構築することができる Azure Logic Apps のフローを使って ARM テンプレートを格納しておくことができる ARM テンプレートスペックに格納された ARM テンプレートをデプロイしてみます。

Logic Apps からさらに PowerShell コマンドを実行する Azure Functions を呼び出してデプロイする例はいくつか見られますが、今回は Logic Apps だけでフローを構築してみます。

## やってみる
### 前提
すでに何らかのテンプレートが格納されて ARM テンプレートスペックが存在するところから始めます。まだ ARM テンプレートスペックがない場合は[この記事](https://qiita.com/07JP27/items/d76711102858501ce157)に方法が記載してあります。今回はこのようなテンプレートを用意しました。

``` main.bicep
@minLength(3)
@maxLength(24)
@description('Provide a name for the storage account. Use only lower case letters and numbers. The name must be unique across Azure.')
param storageName string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
  name: 'examplevnet'
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'Subnet-1'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: 'Subnet-2'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

resource exampleStorage 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: storageName
  location: 'eastus'
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

```

### Logic Apps の作成
Logic Apps を作成して「編集」からワークフローエディターを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/355b0980-af89-6b93-f1ad-6ff898e13e77.png)

### トリガーとアクションの追加
1. トリガーを選択します。ここではHTTP triggerを選択していますが、特に指定はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/8afab287-c24e-59b6-e939-5ce36bca564c.png)

1. +ボタンでアクションを追加して「Azure Resource Manager」→「リソースを読み取る」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/39b33a64-c129-bdc2-d658-b36a4912db04.png)


1. 同じ手順でさらにアクションを追加して「Azure Resource Manager」→「テンプレート展開を作成または更新」を追加します。
1. フローの全体は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/1449c79b-2fd8-ed71-01a5-07b539612a2a.png)


### フローの設定
1. 「リソースを読み取る」アクションを選択して設定パネルを開き、以下のような設定をします。APIバージョンの選択肢は[このドキュメント](https://docs.microsoft.com/ja-jp/azure/templates/microsoft.resources/allversions)に記載されています。
ここで「短いリソースID」にはデプロイ対象のARMテンプレートスペックのIDを `templateSpecs/{スペック名}/versions/{対象バージョン}` の形式で記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/5caaa323-6ac4-5fa2-8f38-c06a7c8df834.png)

1.  「テンプレート展開を作成または更新」アクションを選択して設定パネルを開き、以下のような設定をします。展開名は識別できるように現在時刻をフォーマットして入れています。設定の表示直後に「テンプレートの内容」が表示されていない場合は「Add new parameter」から追加して「リソースを読み取る」アクションの結果の「プロパティ」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/ccc753f0-b53e-5bd5-c152-b7b4939f75bd.png)

1. デザイナーのメニューバーにある「コードビュー」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/39befabe-8891-cd93-75b2-90bc1698aa50.png)

1. 「テンプレート展開を作成または更新」の定義を見つます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/9551f0ad-c3ea-38e0-a227-3cf35b573e06.png)

1. 「テンプレート展開を作成または更新」の「template」の部分に`['mainTemplate']`を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/db6137bc-a85b-23bc-10eb-3153d2d95670.png)

1. テンプレートを保存します。



## 実行してみる
メニューバー上部の「トリガーの実行」→「実行」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/a55206b4-82b4-5115-3c3e-0277651ea526.png)

正常に完了するとすべてのトリガーとアクションにチェックマークがつきます。
ハマりどころとしてはパラメータとして渡すstorageNameが世界で一意である必要があるのでそれがかぶってエラーになることがあるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/ab6f317c-08c0-106b-97bc-20a44bc90e17.png)

リソースも正常に作成できていることが確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149212/370e28d4-33dc-3b9e-0aa6-da5433b17451.png)

## 最後に
今回はほとんどの設定をべた書きでやってみましたが、Logic Appsはトリガーから与えられたペイロードを使用することもできるので対象のサブスクリプションやテンプレートを外から与えてあげるということも可能です。


## 参考

https://docs.microsoft.com/ja-jp/connectors/arm