APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Azure Logic Apps】ARM テンプレートを使ったリソースデプロイの仕組み

はじめに

Power Platform 推進チームの小野です。

本稿では、Azure Logic Apps と前回作成した ARM テンプレートを利用して、リソースの一部パラメータを変更してデプロイする 方法 について解説します。

techblog.ap-com.co.jp

やりたいこと

リソースを作成するための ARM テンプレートを使って、一部パラメータを変更してデプロイできるようにする。

変更できるようにするパラメータ

  • リソースを作成するリソースグループ
  • 各リソースの名称
  • 仮想マシンの admin ユーザー名
  • 仮想マシンの admin パスワード

アプリ全体像

全体像

手順解説

流れ

★目次から作る

ロジック アプリ

ロジックアプリを新規作成

まずは、ロジック アプリの画面から、新しいロジックアプリを作成します。リソースグループ>Market Place>Logic Apps でも作成できますが、Market Place での検索が必要なので、ロジック アプリの画面から行く方が楽かと思われます。

ロジックアプリの追加

リソースグループ・ロジックアプリ名の入力や、プランの選択をします。今回は検証用なので、「消費」プランで十分です。

ロジックアプリ作成画面

編集画面に入る

作成(デプロイ) されたロジックアプリを開くと、このような画面になります。この画面から、ロジックアプリを編集する画面に移動したり、実行の履歴を確認したりできます。画面上部の「編集」ボタンで編集画面に移動して、ロジックアプリの中身を作成していきましょう。

ロジックアプリを開いた状態

編集画面

トリガーを設定する

作成したばかりのロジックアプリを開くと、トリガーを追加する箱があるだけの状態になっています。まずはトリガーを追加しましょう。トリガーはロジックアプリの実行条件であり、その条件を満たしたとき、後続のアクションが実行されることになります。

ロジックアプリの初期状態

「トリガーの追加」をクリックすると、利用できるトリガーが一覧で表示されます。

トリガー追加

ちなみに、Power Automate のような無料(標準コネクタ) と有料(プレミアムコネクタ) のような区分は、Azure Logic Apps にはなく、すべてのコネクタが利用できます。他システムとの接続を色々と試しやすい環境だと言えますね。ただし、基本的には従量課金なので、「すべてのコネクタが無料で使える」といった表現は適切ではありません。

さて、今回のロジックアプリはひとまず手動で実行することにして、トリガーとして アプリ内>Schedule>Recurrence を利用します。頻度を指定して定期的に実行させるためのトリガーですが、これを12か月周期として設定することで、手動実行のように使います。

※もちろん、検証が終わったらロジックアプリを無効化しておけば、自動実行されることはなくなります。

年1回実行

1つのロジックアプリに対して設定できるトリガーは 1つだけで、残りは「アクション」として設定していくことになります。

パラメータを格納するオブジェクト変数を作成する

続いて、可変となるパラメータを格納するための変数を作成します。今回は 4つのパラメータが必要で、1つずつ作成すると編集画面でフロー全体が縦に伸びる形になり、見づらくなってしまいます。

変数をたくさん作ると見づらくなる

そういう時は、複数のパラメータを 1つのオブジェクト変数に盛り込む方法が有効です。変数を初期化するアクション(Initialize variable) でオブジェクト型(Type: object) の変数を作成し、JSON 形式で複数のパラメータを記述していきます。uniqueName の値についてはのちほど作成・説明します。

オブジェクト変数を作成

{
  "uniqueName": "(あとで作る)",
  "resourceGroup": "r_ono_arm",
  "adminUsername": "r_ono",
  "adminPassword": "r_ono_test2024"
}

作成したオブジェクト変数を JSON 形式として解釈させることで、キーを指定して値を取得することができるようになります。アプリ内>Data operations>Parse JSON のアクションを挿入し、先ほど作成したオブジェクト変数を Content に入力したら、最下部の「サンプルのペイロードを使用してスキーマを生成する」をクリックします。

Perse JSON

サンプルとして、先ほどオブジェクト変数に入力した JSON 形式の文字列を貼り付けて、「完了」ボタンを押します。

サンプルの JSON を貼り付け

すると、サンプルをもとにしたスキーマが作成されます。今回はすべて文字列(string) で、properties の下に各項目がぶら下がっていることがわかります。

サンプルから作成されたスキーマ

Parse JSON をしたことで、動的なコンテンツとしてオブジェクト内の各値を取得することができるようになりました。4つの文字列変数の定義が、Initialize variable と Parse JSON の 2つのアクションで実現できたことになります。

キーをもとに値を取得できる

この小ワザは Power Automate でも使えます。私にとっては、Power Automate で使っていた小ワザが Azure Logic Apps でも使えた、という感じです。Power Platform 経験がやっと活用できました。

qiita.com

リソース名に利用するためのユニークな値を生成する

ちょっと脱線しましたが、 (あとで作る) としていたユニーク値を生成する手順の説明に戻ります。現在日時を利用して、毎回ユニークな文字列を生成するようにします。

現在時刻(UTC) の取得は utcNow関数、UTC から日本時間への変換は convertFromUtc関数で行います。

learn.microsoft.com

convertFromUtc関数の第3引数は、「カスタム日時形式文字列」のルールに則って作成します。このロジックアプリを 1秒間に複数実行する可能性がある場合は、「小文字の秒 "f" 書式指定子」も使うと安心です。

learn.microsoft.com

これらを組み合わせて、下記のような関数を作成しました。

convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyyMMdd-HHmmss')

例えば、日本時間が 2024年6月7日 15時14分09秒 のとき、この関数では「20240607-151409」の文字列が生成されます。

オブジェクト変数の uniqueName の値を、この関数に置き換えます。

作成した関数を入力

Azure Resource Manager アクション

ARMテンプレートを取得する

変数の仕込みができたので、いよいよ ARMテンプレートを取得します。Azure Resource Manager>リソースを読み取る のアクションを選択します。

Azure Resource Manager>リソースを読み取る

なお、初回選択時は ARMテンプレートのコネクタに対する認証を求められます。今回の検証では、サービスプリンシパルを使って認証を通しています。

認証をパスできたら、サブスクリプションなどの各種情報を入力していきます。リソースグループ名は、カスタム値の入力を選んで、動的なコンテンツから Parse JSON の resourceGroup を取得しましょう。その下の 3つは、今回の手順では下記のとおり入力しています。

  • リソースプロバイダー:Microsoft.Resources
  • 短いリソース ID:templateSpecs/[ARMテンプレート名]/versions/[バージョン番号]
  • クライアント API バージョン:2022-02-01

「リソースを読み取る」の指定

テンプレートを検証する

続いて、Azure Resource Manager>テンプレート展開を検証 のアクションを追加します。このアクションは ARMテンプレートによるデプロイを、リソースを作成せず検証することができます。テストのたびにリソースが作成されてしまうと面倒なので、Logic Apps から ARMテンプレートを利用する場合は、この検証アクションを有効活用しましょう。リソースグループ名は先ほどと同様に Perse JSON から取得、展開名も Perse JSON から uniqueName を取得してきます。

テンプレート検証のための情報

その下の詳細パラメーターで、テンプレートの内容・パラメーター を表示してください。テンプレートの内容 には ARMテンプレートの内容を、パラメーターにはオブジェクト変数の値を使った内容を入れることになります。

詳細パラメーター

テンプレートの内容として、先ほど「リソースを読み取る」で取得したデータを利用します。動的なコンテンツの「リソースを読み取る」の「表示数を増やす」をクリックし、プロパティを選択します。

動的なコンテンツ>リソースを読み取る>プロパティ

プロパティはそのままでは使えないので修正する

これでよさそうに見えますが、パラメータを入れて実行してみるとエラーが発生します。mainTemplate が見つからない、みたいなエラーです。

mainTemplate なしだとエラーになる

以下の記事によると、template に ['mainTemplate']を追加する必要があるとのこと。

qiita.com

動的なコンテンツの上部のテキストボックスで、末尾に ['mainTemplate'] を追記します。入力欄の幅の都合で改行されているように見えますが、改行は不要です。

['mainTemplate']を追加

パラメーターを入力する

続いて、可変値となるパラメーターをJSON 形式で記載します。フォーマットは下記のような形です。今回は string 型だけなのでシンプルですが、array 型がある場合は value のところが複数行になったりするはず。

{
  "[パラメーターの名称1]": {
    "value": [Parse JSONから取得した値A]}
  },
~略~
  "パラメーターの名称99": {
    "value": [Parse JSONから取得した値Z]}
  }
}

ARMテンプレートの中身を確認し、リソース名として使われるパラメーター、リソースグループ名、仮想マシンのユーザー名・パスワードを拾っていきます。これらのパラメーターに対して、Parse JSON の値で上書きするイメージです。最終的には、下記のような JSON をパラメーター欄に記入します。@{body('Parse_JSON')~ となっているところは、動的なコンテンツから選択すれば勝手に入ります。

{
  "networkInterfaceName": {
    "value": @{body('Parse_JSON')?['uniqueName']}
  },
  "networkSecurityGroupName": {
    "value": @{body('Parse_JSON')?['uniqueName']}
  },
  "virtualNetworkName": {
    "value": @{body('Parse_JSON')?['uniqueName']}
  },
  "publicIpAddressName": {
    "value": @{body('Parse_JSON')?['uniqueName']}
  },
  "virtualMachineName": {
    "value": @{body('Parse_JSON')?['uniqueName']}
  },
  "virtualMachineComputerName": {
    "value": @{body('Parse_JSON')?['uniqueName']}
  },
  "virtualMachineRG": {
    "value": @{body('Parse_JSON')?['resourceGroup']}
  },
  "adminUsername": {
    "value": @{body('Parse_JSON')?['adminUsername']}
  },
  "adminPassword": {
    "value": @{body('Parse_JSON')?['adminPassword']}
  }
}

検証がうまくいくかテストする

これでテンプレートを検証するための情報は揃いました。さっそくロジックアプリを保存して、実行してみましょう。実行結果は編集画面には表示されないので、ひとつ前の画面に戻って、画面下部の「実行の履歴」から確認します。状態が Succeed であればひとまず OK です。

ロジックアプリの実行結果

ちなみに、まだ検証アクションしか実行していないので、リソースグループ内に新しいリソースが作成されていないことも確認できます。

実際にリソースを作成するアクションを追加する

検証が問題なく成功したら、実際にリソースを作成する「テンプレート展開を作成または更新」アクションを追加します。パラメーターなどは、検証のときと同じ値を入力してください。

テンプレート展開を作成または更新

※検証で使った値を動的なコンテンツとして参照してみましたが、うまくいかず。いったん同じ値を書く形で…

再度テストして、リソースが作られていることを確認する

「テンプレート展開を作成または更新」アクションを追加後、再度テストしておきます。想定どおりにいけば、指定したリソースグループに複数のリソースが作成されます。

リソースが 6つ作成された

さらにもう一度ロジックアプリを実行すると、先ほどとは違う名称でリソースが作成されることも確認できるはずです。リソースセットが必要なときに、リソース名の重複を気にせず、すぐに作成できます。

2回目の実行後

つまずいた点/注意点

拡張性・保守性を下げて妥協して公開しているところが多々あります。「テンプレート展開を作成または更新」で「テンプレートの検証」のパラメータを参照させる、などは、やりたかったけどできなかったことですね。

template に ['mainTemplate'] をつけなければいけない点も、なぜそうなのかを理解しきれていません。解決方法は調べて見つけられたものの、仕組みの理解を後回しにしてしまったので、今後の学習でカバーできればと思います。

おわりに

Power Automate で学んだオブジェクト変数の使い方が、Azure Logic Apps でも活用できました。これらは編集画面だけでなく仕組みの部分も共通しているので、それぞれの得意・不得意に合わせて使い分けられるとよさそうです。

また、ARM テンプレートの作成から Azure Logic Apps での変数の定義まで、JSON 形式に触れる機会を得ることができました。JSON 形式に多少の苦手意識がありましたが、試行錯誤しながらファイルやパラメータを作ったことで、理解を深められたと思います。資格試験の体験記にも書いているとおり、実際に手を動かしてアウトプットすることが学びの近道ですね。