Azure DevOps Libraryをプライベートエンドポイント環境のKeyVaultとリンクさせる

[Azure DevOps Pipelinesを使ってAzure Container Registryにイメージをpushする(Linux VMSS編)
](https://qiita.com/shingo_kawahara/items/4ddd794510caa8fa9ec6#library%E4%BD%9C%E6%88%90) でLibraryに環境変数を設定する手順を書きました。
今回はよりセキュアな方法として、LibraryからKeyVaultを参照するやり方を残します。
KeyVaultへのアクセスは、インターネットからの接続をブロックして、プライベートエンドポイント経由のみ許可した状態です。

# 前提
* 既にパイプライン実行環境は作成済みであること
* KeyVault作成済みであること

# KeyVaultシークレット作成
* KeyVaultの左メニューより[シークレット]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8dfa4218-fd26-47aa-392e-f7e8652ebc10.png)

* [生成/インポート]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1e9d7562-b849-51ac-cd3b-155c9dd7cf93.png)

* 名前とsecret値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/33e45129-c820-47b9-25c0-3ebb5f5765d3.png)

* 今回は以下のようにシークレットを設定しています。
    |Name |Value  |
    |---|---|
    |userVariable |user |
    |passwordVariable |pass |

# KeyVaultネットワーク設定
* KeyVaultの左メニューより[ネットワーク]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3b02f61d-90f5-7793-f240-450bda3be14b.png)

* [パブリックアクセスの無効化]を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3e51b4ee-56a5-a2ac-0acf-1f98a6f0ee95.png)

* プライベートエンドポイントを設定します（今回詳細な設定手順は割愛します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0ccecd67-ce84-0ad0-6e13-49a57f0c8f52.png)

# Service Principal Service Connection作成
* [こちら](https://qiita.com/shingo_kawahara/items/6c7ca38ca7ec32d16a79#service-principal-service-connection%E4%BD%9C%E6%88%90) を参考に作成します。既に作成済みの場合は不要です。

# Library作成
* PipelinesのLibraryを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7ec07690-a6e8-3fc2-56b6-be6dba43d442.png)

* [+ Variable group]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/652d2cb1-232e-2019-425a-044b555ac1ef.png)

* [Variable group name]を設定し、[Link secrets ~~]をオンにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/03f3c78e-3ec3-860c-5bac-a89ef69996d5.png)

* 事前に作成したService Connectionを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/847f6682-8278-e46f-41ef-d93fa0710536.png)

* Service Connectionで設定したService PrincipalにKeyVaultへのGet/List権限がない場合は、Authorizeを選択することで付与することができます。
* ただ、今回はKeyVaultのネットワーク設定でパブリックアクセスを無効にしているためこのエラーが出ています。

* 一時的にKeyVaultへのパブリックアクセスを許可します。これは最初の設定さえすれば元のパブリックアクセス無効に戻せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c0659442-6035-80c4-2116-a3b5b6591f79.png)

* この状態でLibaryから更新すると先ほどのエラーが解消されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1d48898d-7bed-c6eb-54cc-6115f4a964ad.png)

* 作成したシークレット2つをLibraryに追加します。Libraryからは値は見えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7bb72057-ff23-3937-526b-05662e61ba04.png)

* 最後にKeyVaultのネットワーク設定を[パブリックアクセスの無効化]に戻しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/84b5df8d-f22c-0b98-7237-2840a6351320.png)

* 以上でKeyVaultとLibraryのリンクは完了です。Libraryに設定した状態と同様に利用できます。

# LibraryとKeyVaultリンクの違いを確認
* この状態で以下のパイプラインを実行してみました。

```
trigger:
- main

variables:
  - group: Variable-Test

pool:
  name: vmss-lin

steps:
- script: |
    echo $(userVariable)
    echo $(passwordVariable)
  displayName: 'Test1'
```

* Library直書きの場合は実行結果ログにechoした値が表示されましたが、KeyVaultリンクの方はアスタリスクでマスキングされて表示されました。
* 他にはKeyVaultのセキュアな機能が使える（論理的削除、アクセスポリシーなど）というメリットがありそうです。

以上です。