ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

Logic Apps から Azure の REST API をマネージド ID を使って呼び出す

f:id:masatsuna:20210916005110p:plain

マネージド ID使っていますか? 徐々に使えるリソースが増えてきて、最近では多くのケースで使うことが増えているように思います。 非常に便利で強力な機能ですよね。

今回は Logic Apps から Azure の REST API をマネージド ID を使って呼び出す手順を解説します。 例によって初心者向けに、できる限り手順を省かず説明していきます。

なおマネージド ID については、過去に解説した記事がありますのでそちらを参照してください。

tsuna-can.hateblo.jp

リソースグループ、 Logic Apps の作成

まずは今回使用するリソースグループ [rg-resource-manager] を作成します。 作成したリソースグループに、 [logic-get-resources-by-rg] という名前の Logic Apps を追加しましょう。 今回は従量課金のプランで作成しています。

Logic Apps のリソースを Azure Portal から作成すると、いきなりデザイナー画面が立ち上がります。 まずは下回りの設定を行っていくので、一旦この画面は閉じてしまいましょう。

f:id:masatsuna:20210915233044p:plain
一旦 Logic Apps デザイナーを閉じる

システム割り当てマネージド ID の有効化

次に今回の主役であるマネージド ID を有効にしていきます。 マネージド ID にはシステム割り当てマネージド ID とユーザー割り当てマネージド ID があります。 今回は最も簡単に使用できるシステム割り当てマネージド ID を使っていきます。

Logic Apps のメニューから、 [設定] > [ID] を選択します。

f:id:masatsuna:20210915233324p:plain
[ID] を選択

[システム割り当て済み] のタブで、 [状態] のトグルを [オン] に設定して [保存] ボタンを押下します。

f:id:masatsuna:20210915233432p:plain
システム割り当てマネージド ID の有効化

これでシステム割り当てマネージド ID が作成されました。 正常に処理されていれば、 [オブジェクト (プリンシパル) ID] の GUID 値が表示されているはずです。 この値は後で設定確認のために参照するのでメモしておきましょう。

f:id:masatsuna:20210915234335p:plain
システム割り当てマネージド ID の有効化後

呼び出す対象リソースへのロール割り当て

今回は以下の REST API を呼び出すようにしたいと思います。

docs.microsoft.com

情報取得対象のリソースグループは、自分のサブスクリプション内にあるものならどれでも、クエリ文字列で指定できるようにします。 そのため、先ほど作成したマネージド ID が、サブスクリプションの読み取り権限を持つように設定していきます。 これによって、そのサブスクリプション配下にある全リソースの読み取り権限を割り当てることができます。

早速設定を行っていきましょう。 リソースの一覧から [サブスクリプション] を選択し、ご自身のサブスクリプションを選択してください。 ここで参照できる [サブスクリプション ID] は、後程使用するので控えておきましょう。 左側のメニューから [アクセス制御 (IAM)] を選択し、 [アクセスの確認] タブで [ロールの割り当ての追加] ボタンを押下します。

f:id:masatsuna:20210915234405p:plain
ロール割り当ての追加を選択

続いてマネージド ID に対して割り当てるロールを選択します。 今回は情報を取得するだけですので、 [閲覧者] のロールを選択します。 実行したい REST API の種類に応じて、割り当てるロールを選択するようにしてください。

ロールには、 Azure がある程度便利に使えるようまとめてくれた組み込みのロールと、自分で作りこむカスタムロールがあります。 ほとんどのケースで組み込みロールを使えば問題ありません。 細かな制御が必要になってからカスタムロールの作成を検討しましょう。

f:id:masatsuna:20210915234756p:plain
[閲覧者] ロールを選択

続いて選択したロールにマネージド ID を割り当てます。 [アクセスの割り当て先] から [マネージド ID] を選択して [メンバーを選択する] のリンクを押下します。

f:id:masatsuna:20210915235031p:plain

[マネージド ID の選択] 画面で [システム割り当て] のラジオボタンを選択し、先ほど作成した Logic Apps のシステム割り当てマネージド ID を探します。 作成した Logic Apps のリソース名 [logic-get-resources-by-rg] を見つけたら、それを選択しましょう。

f:id:masatsuna:20210915235330p:plain
Logic Apps のマネージド ID を選択

[選択したメンバー] に上述のマネージド ID が移動したら、 [選択] ボタンを押下します。

f:id:masatsuna:20210915235430p:plain
[選択] ボタンを押下

すると元の画面に選択したマネージド ID の情報が追加されます。 念のため [オブジェクト ID] の値を参照し、メモしておいたオブジェクト ID と等しいことを確認します。 問題なければ [レビューと割り当て] を押下します。

f:id:masatsuna:20210915235645p:plain
[レビューと割り当て] を押下

再度確認画面に移りますが、 [レビューと割り当て] をもう一度押下します。

f:id:masatsuna:20210915235739p:plain
[レビューと割り当て] ボタンを再度押下

これで Logic Apps のマネージド ID が、サブスクリプションの閲覧者として登録できました。

今回は非常に広い範囲に対するアクセス許可を与えますが、呼び出す REST API が特定のリソースにだけアクセスするのであれば、ロール割り当てするリソースを絞り込むようにしてください。 最小権限の原則をできる限り守りましょう。

Logic Apps の実装

ここからは Logic Apps に戻り、処理の本体を実装していきます。 今回は HTTP 要求を受けたら、クエリ文字列に設定されているリソースグループの情報を取得して、そのまま返すような Logic Apps を作ろうと思います。

HTTP 要求の受信時トリガーの設定

[logic-get-resources-by-rg] のリソースに移動して、[ロジック アプリ デザイナー] を開きます。 まずは HTTP 要求を受け取れるように、 [HTTP 要求の受信時] のトリガーを選択します。 今回は情報を取得するための処理なので、メソッドは [GET] に設定し、その他の項目はデフォルトのままにします。

f:id:masatsuna:20210916000317p:plain
HTTP 要求の受信時の設定

Azure REST API 呼び出しの設定

次に Azure REST API を呼び出す箇所を作っていきます。 REST API の呼び出しは HTTP リクエストを送ることに他ならないので、 [HTTP] のアクションを選択して追加します。

f:id:masatsuna:20210916000537p:plain
[HTTP] のアクションを追加

次に Azure REST API の設定を行います。 Azure REST API のリファレンスにある通り、 HTTP リクエストを組み立てます。 今回は以下の API を呼び出します。

Resources - List By Resource Group - REST API (Azure Resource Management) | Microsoft Docs

ですので、基本的な設定は下記の通りとなります。

f:id:masatsuna:20210916000909p:plain
REST API 呼び出しの設定

ここでポイントとなるのは、 [URI] の項目でトリガーをキックした URL のクエリ文字列から、検索対象のリソースグループ名を取得している個所です。 リソースグループ名を設定したい箇所にカーソルを合わせて [動的なコンテンツの追加] リンクを押下すると、図のようなウィンドウを表示できます。 [式] のタブを選択して、以下のコードを打ち込んでください。

triggerOutputs()['queries']['resourceGroup']

これで HTTP トリガーのクエリ文字列に設定されている resourceGroup という名前のキーの値を URI に組み込むことができます。 REST API を実行するので、 HTTP ヘッダーに application/json の Content-Type を設定しておきましょう。

ここまでの実装が終わったら、最下部の [Add new parameter] のドロップダウンを開きます。 そして [認証] にチェックを入れてドロップダウンを閉じましょう。

f:id:masatsuna:20210916001755p:plain
[認証] にチェックを入れてドロップダウンを閉じる

[認証の種類] を選択する画面になるので、 [マネージド ID] を選択します。

f:id:masatsuna:20210916001913p:plain
[マネージド ID] を選択

またマネージド ID の種類を [システム割り当てマネージド ID] に設定します。 今回はシステム割り当てマネージド ID を使用するので、 [対象ユーザー] の部分は未入力で OK です。

f:id:masatsuna:20210916002037p:plain
[システム割り当てマネージド ID] を選択

HTTP 応答の設定

次に HTTP の応答を返す処理を組み込みます。 今回はことを簡単にするため、前段で呼び出した REST API の結果をそのまま返却するようにします。 一応 [状態コード] と [本文] を返却するようにしておきます。

f:id:masatsuna:20210916002254p:plain
HTTP 応答の設定

これで処理の実装が終わりました。 最終的な処理の流れは以下のようになります。

f:id:masatsuna:20210916002333p:plain
最終的な処理の流れ

ここまで出来たら上部の [保存] ボタンを押下しておきましょう。

動作確認

これで実装が完了したので、動作確認を行ってみましょう。 画面上部の [トリガーの実行] ドロップダウンを開いて [ペイロードで実行] を選択します。

f:id:masatsuna:20210916002542p:plain
[ペイロードで実行] を選択

ペイロードで実行を選択すると、テスト実行する HTTP リクエストを Portal 上で組み立てて実行することができます。 以下のようなケースではこちらを選択しましょう。

  • GET 以外のメソッドを使用するとき
  • JSON をリクエスト本文に設定するとき(POST/PUT などのとき)
  • GET でもクエリ文字列や URL のパスを指定したいとき
  • HTTP ヘッダーに値をつめたいとき

今回はクエリ文字列にリソースグループの名称を設定したいので、以下のように設定します。 なお指定しているリソースグループ名は、今回作成している Logic Apps の配置されているリソースグループです。 このリソースグループには、今回作成している Logic Apps 以外何も置かれていません。

f:id:masatsuna:20210916002928p:plain

設定が終わって [実行] ボタンを押下すると、作成した Logic Apps が起動し、応答メッセージが表示されます。

f:id:masatsuna:20210916003115p:plain
応答メッセージ

配置してある Logic Apps のリソース情報を取得できていることが確認できました。

まとめ

今回は Logic Apps とシステム割り当てマネージド ID を使って、 Azure の REST API を呼び出す方法を解説しました。 マネージド ID を使用することで、認証周りの処理の作りこみを大きく削減できます。 また今回は特に触れていませんが、ロールの作りこみや対象リソースの絞り込みによって、細かな権限制御を行うこともできます。 ぜひ積極的に使っていきたいですね。