#AzureLogicApps で #AzureAutomation の REST API を実行する（Azure Directory OAuth編）

Azure Logic Apps から実行した Azure Automation のジョブを REST API を使って停止させるシナリオを解説します。
本投稿を読み終わったとき、Azure Logic Apps で以下の設定ができるようになります。（多分）

- Azure Automation コネクタにサービスプリンシパルで接続する
- Azure Automation コネクタでジョブを作成する
- HTTP コネクタの「Azure Directory OAuth」認証で Automation REST API を実行する

# 事前準備

## リソース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/fd6f5a38-2e08-983b-5b71-f1ebb74c6299.png)

- Azure Logic Apps
- Azure Automation アカウント
- Azure Automation の Runbook に登録する PowerShell
- Azure Automation の実行アカウント（別途 AzureAD にアプリ登録でもOK）

## PowerShell

実行したジョブを停止させたいので、スリープ処理を入れてジョブが完了するまで時間稼ぎをします。
この PowerShell を Automation アカウントの Runboook に登録しておきます。

```powershell:automation/StartSleep
Write-Output "Start"
Start-Sleep -Seconds 15
Write-Output "....."
Start-Sleep -Seconds 15
Write-Output "End"
```

# Azure Logic Apps フロー概要

冒頭で述べたシナリオです。Azure Automation コネクタ「ジョブの作成」でジョブを作成して、ジョブが実行中となるのを待ってから、Automation REST API でジョブを停止させます。全体のフローはこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/3971878b-f078-5c0c-aedf-3f2eaff91ad5.png)

# Azure Automation コネクタ

## Azure Automation への接続方法

Azure Automation コネクタを配置すると、以下のような画面が表示されて「ユーザーとしてサインイン」するか、「サービス プリンシパルを使用して接続」するかを選択できます。

Azure Logic Apps を業務で利用する場合は「サービスプリンシパルで接続」を選択します。なぜなら「ユーザーとしてサインイン」を業務で利用した場合、サインインしたユーザーが退職などで削除されると、この Azure Logic Apps が動かなくなるからです。
個人で利用する場合は「ユーザーとしてサインイン」でも良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/2be122d3-1dd9-a977-7e92-71597a8fabab.png)

## サービスプリンシパルで接続する（為の前準備）

「サービスプリンシパルで接続する」をクリックして、事前に用意した Azure Automation の実行アカウント、または、別途登録した AzureAD アプリの情報を入力します。Azure Automation の実行アカウントを利用する場合、別途シークレットキーの発行が必要です。

### アプリの登録

AzureAD アプリの登録方法は下記の記事を参照してください。
[Microsoft Teamsの特定チャネルのいいねをした人ランキングを作成しよう！その１～Azure ADにアプリを登録する～](https://blog.intracker.net/archives/2068)

### ロールの割り当て

Azure Automation コネクタで利用したい Automation アカウントを選択するために必要な設定です。

別途アプリを登録した場合は、Automation アカウントに対して「Automation オペレーター」ロールを割り当ててください。Azure Automation の実行アカウントを利用する場合、サブスクリプションレベルで「共同作成者」ロールが自動的に付与されているので、「Automation オペレーター」ロールの設定は不要です。


### アクセス許可

HTTP コネクタで Automation REST API を呼び出すために必要な設定です。

アプリに対して「Azure Service Management」の「user_impersonation」のアクセス許可を割り当ててください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/af5354b6-9196-7035-9822-c6e11f6ac3a2.png)


## ジョブを作成する

用意した Runbook を指定します。ジョブをあとで停止させるため、ジョブの待機は「いいえ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/a1a3f060-202b-0bef-eaa6-35b9cdd4865e.png)

## HTTP コネクタを設定する

実行したい Automation REST API を入力し、認証の種類を「Active Directory OAuth」に設定します。
「テナント」という入力欄はテナントID（GUID）を入力します。クライアントID、シークレットキーは適宜入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/b997438e-0cba-e174-123d-37b560d176e0.png)


# 実行結果

無事にすべてのフローが成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/3aa2b10a-062d-680a-3640-1358af4a62c1.png)

そして、ジョブが停止されているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/62a51926-7f20-7a9e-54f3-d95cc3053a17.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89309/d7011dcb-739e-5b5c-90af-a779160e7e1b.png)

# まとめ

Azure Logic Apps で Azure Automation コネクタ、及び、Automation REST API を実行するために必要な情報は下記の通りです。

- Azure Automation コネクタ
    - サービス プリンシパルで接続する場合、以下が必要
        - テナントID
        - クライアントID
        - シークレットキー
        - Automation アカウントに対するロール
- HTTP コネクタ
    - 認証の種類「Azure Directory OAuth」を使う場合、以下が必要
        - テナントID
        - クライアントID
        - シークレットキー
        - アプリに対する「Azure Service Management」のアクセス許可

この方法のデメリットは、HTTP コネクタに「テナントID」「クライアントID」「シークレットキー」を設定する必要があるため、管理が面倒になることです。

# 次回予告

次回の記事では、HTTP コネクタで「テナントID」「クライアントID」「シークレットキー」が必要としない方法として、認証の種類「マネージドID」を使うケースについて書いていこうと思います。

# 参考
[Azure Automation におけるロールベースのアクセス制御 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/automation/automation-role-based-access-control#automation-operator)
[Job - Stop (Azure Automation) | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/automation/job/stop)