Power Automate  for desktop から Azure Key Vault コネクタをつかう方法

## はじめに

あ…ありのまま 今　起こった事を話すぜ！
権限がぁない環境のデスクトップ フローがみえちまうんだ…
な…　何を言ってるのか　わからねーと思うがおれも何をされたのかわからなかった…　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/98994697-0840-c99d-13a4-e6730b01b731.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/64e2e03b-f526-7019-2d03-3a0d3b58995a.png)
というのは完全にネタです。

そんなことあるわけないと思われるかもしれませんが、強い権限でデータ ソース設定をしたことがある Power BI Desktop は、そのまま弱い権限ユーザーに切り替えても データ ソースのアクセス許可 が残っているため、このような失敗がおきました。

（テストなどで）ユーザーを切り替えるときはデータ ソース設定を適切に削除する必要があります。

前置きが長くなりましたが、APIキーやパスワードなどの認証情報を Power Automate for desktop のフローに直接書くのはよろしくありません。TDSをオフにしない限りアクセス許可のある環境の Dataverse は Power BI Desktop から覗けてしまいました。（わたしの設定が悪いのかTDS エンドポイントのユーザー レベルのアクセス制御がうまく動作しませんでした。）

https://learn.microsoft.com/ja-jp/power-platform/admin/control-tds-settings

なおデスクトップ フローはworkflowテーブルのcategory=6 definitionに格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/62019990-1dde-4c15-cbc0-4343b2378a39.png)
 Dataverse のテーブルで読むことも可能です。

これまで認証情報などセンシティブな情報は別途暗号化したりしていましたが、資産ライブラリにコネクタ タブが追加されたことから直接クラウド コネクタを呼び出せるようになりました。これにより Azure Key Vault をクラウド フローを介さず使えるようになりました。

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/assets-library#connectors-tab

パイプライン利用を想定したので意外と多くハマってしまいました。接続参照の埋め込み（プレビュー）周辺のメモです。

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/cloudconnectors#embed-connection-references-on-a-desktop-flow-preview

## お題

- 作成するデスクトップ フローはWebアプリにログインするだけの簡単なもの
- ユーザー（使う人）と開発（作る人）がわかれているのでパイプラインでデプロイする
- ユーザーは既定環境および実働環境のみにアクセスできる
- ユーザーにフローの編集を許可しない
- パスワードを Azure Key Vault で保護する（workflowテーブルを見ても変数が記述されるだけにする）
- Azure Key Vault をデスクトップ フローから利用する

## ライセンスなど

- 開発者
    - Microsoft 365 Business Premium
    - Power Automate premium
    - Power Automate for desktop 2.50.132.24326
- 利用者
    - Power Automate free を Premium試用
    - Power Automate for desktop 2.50.132.24326
    - Microsoft Fablic free
- Windows 11 Business
- Azure Key Vault

## 注意事項

- 有償利用を想定しています
- アカウントを切り替えて検証しているので前述のような設定残りなど予期せぬ挙動があるかもしれません
- 「デスクトップ フローに接続参照を埋め込む (プレビュー)」 は文字どおりプレビュー機能です
- Azure での作成権限が必要です
- 検証不足であったり、私見も含まれるので試される場合は自己責任でお願いいたします
- 2024年12月現在の情報です

## 環境とロールなど

開発者と実稼働の２つの環境を用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/81aecb69-b96d-a9ca-b77e-906f138acac5.png)

割り当てたロールは次の通りです。
開発者環境のユーザーとロールは次の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d028236f-51cb-3888-bb64-00c4f9739204.png)

実稼働環境のユーザーロールはEnvironment Makerです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b7f59448-6c03-fe0a-38a7-143861af3275.png)

ぼっちテナントなのでロール設定は雑です。もう少し厳しくしたいときは次のドキュメントを参考に。

https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/desktop-flows-security

この２つの環境間にパイプラインを作成してあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/dd4dbc2a-b623-19da-fcaf-5430bfe56276.png)

https://learn.microsoft.com/ja-jp/power-platform/alm/pipelines

## Azure Key Vault の設定とデスクトップ フローの作成

今回つくるのは自前Webアプリにログインするだけの簡単なデスクトップ フローです。Webアプリのパスワードを Azure Key Vault を通じて利用します。まずは Azure Key Vault にキー コンテナーを作成しシークレットを登録していきます。

![CleanShot 2024-12-09 at 22.40.01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a41bf86d-0fdf-f3bf-6c24-3d68860dfa6b.gif)

### Azure Key Vault の設定 （Azure）（開発者作業）

https://learn.microsoft.com/ja-jp/azure/key-vault/general/

#### キー コンテナーを作成

1. リソース グループを作成します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ef039588-aff0-b610-bb63-f99fc6d6de9c.png)
1. Key Vault を作成します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/92f627a1-6f93-ea5d-900b-2a6ceed72b19.png)

1. キー コンテナーの作成します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/1ccfb39a-5e88-e1d0-3f39-5e99083b573b.png)

1. デプロイが完了したらリソースに移動して設定します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b6fed0f2-0ad6-5084-e8d3-2a3a88c32946.png)

1. アクセス制御 (IAM)を設定します。初期の状態ではシークレットは設定できません。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/1bc54998-0707-502f-c6d9-7a58ed38210b.png)

1. キー コンテナー シークレット責任者を選択して次へ。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2345ffe6-d8ea-d75f-f949-eb7b5ef37334.png)
1. ロールを割り当てるメンバーを選択し、レビューと割り当てを行います。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/11d808c5-67d2-8b03-82bd-fd5bd69db4c5.png)
1. シークレットの作成を行います。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/66f5b879-f473-745a-ff0b-6849ea7e2385.png)
1. アクセス制御 (IAM)に戻ってTEST_USERにもアクセス権を割り当てます。ロールの割り当ての追加からキー コンテナー シークレット ユーザーを選択して次へ。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5590ffc1-9900-e990-8ee7-8fa6b58c8805.png)

1. メンバーを選択する でTEST_USERを追加します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b655bba8-c0ea-ecbb-8a09-f636c25a3504.png)

### デスクトップ フローの作成（開発者作業）

1. 開発環境(dev)で作成します。最初に Azure Key Vault コネクタを追加したいので「その他のアクションを選択する」で進みます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/71c20ed1-7952-18de-4661-7054d580747b.png)

2. コネクタ タブで検索してAzure Key Vaultを追加します。 
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/85b1df31-6993-b191-24d7-c496fc3b5b28.png)

3. Azure Key Vault シークレットの取得で接続参照を作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/27532e7d-4374-e2bb-e0f2-86150f548225.png)

2. 「新しい接続参照を追加する」から新規作成します。ログイン済みであればアカウント選択画面がでるので選びます。しかし、ここで失敗する場合は一度クラウドフローで接続参照を作成する必要があります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5a3fdb34-0c14-c971-778b-5ec8af6d4658.png)

2. クラウド フローを作成します。Connection nameは任意の名前。Key Vault 名はキー コンテナーの名前を入力しサインインします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7f8aaf75-30de-8d4c-1153-f320e9cb30be.png)

2. 接続参照ができるとシークレットの名前から選択できるようになります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/a59c5925-2fab-5fe3-1e84-4e01487b1139.png)

2. せっかくなのでセキュリティをオンにしてテストしましょう。実行ログの値に表示されなくなります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/389d1771-d4a9-2c9a-9401-7521c805a032.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/dc603a36-e40b-569d-eb91-70174699db7a.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/6fd9c5ee-ab19-7771-fb3e-623520b61eb3.png)


2. デスクトップ フローに戻って自分のフロー 一覧で最新の状態に更新を押した後、「シークレットの取得」＞接続参照＞新しい接続参照を追加する とすすみ「接続参照の表示名」から適切に選択します。このとき任意で付けた接続参照名 (Connection Name)にならないのが残念なところです。 
2. Azure Key Vault で作成したシークレットが選択できればOKです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f5532ab9-f1d2-3b9a-6151-54a9cba90a58.png)

2. 変数ウインドウで 機密情報としてマーク しないと実行ログに表示されてしまうので注意です。`%GetSecretResponse.value%`がシークレット値となります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/23475b72-85b9-6b07-1f40-b48e77bb409f.png)

2. あとはWebアプリに合わせてフロー作成します。細かい内容は割愛します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9f7ea2d6-881d-9d82-fd4f-49b7addd6d36.png)

## 実働環境へパイプラインで展開する

1. 開発環境でデスクトップ フローと接続参照を組み込んだソリューションを作成します。デスク トップフロー＞{フロー名}＞接続参照＞管理 (プレビュー)と進んで接続参照の表示名を控えておかないと探すときに苦労するかもしれません。（開発者作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f14c8732-2ab7-1c9a-30b8-1bfd200c986c.png)

1. パイプラインで実働環境に展開します。 （開発者作業）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/349543fb-0c7d-6a1c-8328-2f617a126075.png)


1. 展開が終了したら、実働環境に移動し、デスクトップ フローをTEST_USERにユーザーとして共有します。（開発者作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5f4b223c-c6bc-5487-3321-0a4c86e5535d.png)

1. 接続参照の埋め込みを行っていない段階では実行できません。（ユーザー作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/68fc4de7-b66e-a463-48f6-752dcd26eee5.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/96e52f89-8c79-6ff0-4b06-0767300a09f2.png)
1. 一旦、ソリューションに含めた接続参照の埋め込みを行います。デスクトップ フローのスイッチを「はい」に切り替えます。（開発者作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/30d3901a-0afe-e106-3014-6b5f3d00d52a.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/fa12863a-1f0a-55e7-69dd-ebca3733a25b.png)


    
1. 接続参照の埋め込みを行うと次の警告がでます。共同開発者として共有しないと埋め込んだ接続参照は使えません。ユーザーとして利用する場合はユーザー自身が接続参照で Azure Key Vault を利用できる権限が必要になります。このためAzure Key Vaultを設定するときにTEST_USERにはキー コンテナー シークレット ユーザーを割り当てています。（開発者作業）
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0934d3cd-e1b9-c703-dcaf-457d71735ada.png)

1. 埋め込まれた接続参照では当然ですがエラーになります。（ユーザー作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/59175953-9243-2489-ffdd-2029b0ae26f8.png)

1. 接続参照を新規で登録します。しかしこの時エラーが出ると思います。そこでクラウド フローから開発者で行ったときと同様に接続を作成します。（ユーザー作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/281a7448-8b2a-5f76-abc3-ea7a96950821.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/63093410-d42c-74aa-1cc1-d90ae9e0a3d8.png)


1. 再読み込みを行い、フローを実行します。新しい接続参照を選択すると共有されたデスクトップ フローをユーザー権限でも実行できるようになります。（ユーザー作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d0e53feb-0a1d-a252-08c0-813d1f15e751.png)

1. ついでにほかのシークレットも Azure Key Vault で作成し、開発環境からデスクトップ フローを修正し、パイプラインで再展開しました。（開発者作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/44eaa4b6-8f47-ede4-6669-7c3f4e9c6c0b.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7abfbc0e-6e2a-c127-092d-cba8ba7c7c5e.png)

1. Power BI Desktop で確認すると直接書かれた認証情報は当然ありません。めでたし、めでたし。（ユーザー作業）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/47a304f1-ec25-bb7a-39ee-b49555f438e8.png)

## まとめ

開発者とユーザーのロールをわけた環境を想定し、認証情報の安全な共有をPower Automate for desktop上に実装しました。APIキーなど安易にユーザーの目に触れさせたくない情報へ適用すると効果的です。
また、これまでクラウド フローを経由した Azure Key Vault の実装フローは実行に時間がかかりました。しかしデスクトップ フローにクラウド コネクタを直接埋め込むことで素早い実行が可能です。
わたしの環境ではデスクトップ フローから接続参照をうまく作れなかったところがハマりポイントでした。ユーザー環境においてもクラウド フローで接続参照をつくりなおさないと動作しなかったのが残念ポイントでした。またデータ ソース 設定が残っていて冒頭の茶番のように焦ったのは内緒です。

今回は有償の機能を前面に紹介しています。Power Automate for desktop 無償利用は既定環境の Dataverse 容量圧迫をよく言われますが、こうしたセキュリティ面でも有償利用と差があります。Azure Key Vault と組み合わせることで Microsoft Entra ID の多要素認証を活用できます。無償範囲では利用できない機能ですが良い機能なので有償利用を推したいところです。

長くなりましたがここまで読んでくれた方々、ありがとうございました。
また今日、ひとつ歳を重ねました。
関わっていただけた皆様に感謝です！