Logic Apps Tips - Azure Key Vaultを使う②

#概要
[前回](https://qiita.com/yossihard/items/04b18f7598da90c7a48a)に続いて、Logic AppでAzure Key Vaultを使います。
今回は、シークレットをLogic Appから更新する手順です。

#経緯
当社で使用している電子ロック「Akerun」のAPIは、
認証に使用するトークンには有効期限があります。
⇒いや、たいていそういうAPIには有効期限があるんですが。

トークンと一緒にリフレッシュトークンが発行されて、
トークンが失効したら、リフレッシュトークンを使用して再発行するんですが・・・
それらもLogic Appで自動化しようと思ったんですね。

トークンもリフレッシュトークンもKey Vaultのシークレットで管理していたので、
シークレットの更新をする必要が出てきて・・・。

ということで、いろいろ調べて、何とか更新できた・・・という話。


#大まかな仕掛け
Logic AppsにあるKey Vaultコネクタに、シークレットの更新アクションは・・・
ありませんでした。
なので、（HTTPコネクタで）Key VaultのAPIを呼び出して、シークレットを更新しようと思います。

Key VaultのAPIを呼び出すには、Azure ADのOAuth認証が必要で、
HTTPコネクタでOAuth認証を行います。

Key Vault側では、Logic Appsからの接続を許可するように
アクセスポリシーを設定する必要があります。

#手順
##Azure ADの設定
AzureポータルでAzure ADを開きます。
ブレードから「アプリの登録」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d67ca383-002a-fd1c-f3c3-dc8d27416796.png)

次に「新規登録」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/cca3b1d4-baa6-9848-16cd-13cdbf52125e.png)

以下のような画面が表示されるので、名前を入力し、「登録」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a81c0e04-4126-a7ff-5c78-fc9b02b7a44a.png)

以下のような画面が表示されます。
続いて、APIのアクセス許可を追加します。
ブレードから「APIのアクセス許可」を選択し、「アクセス許可の追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d8f0fa98-e0bd-1bc3-7d13-5c6c12fd0691.png)

APIの一覧が表示されるので、Azure Key Vaultを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8976d59e-a4fa-3c4e-0ff5-f1a3f8bb4582.png)

アクセス許可の「user_impersonation」にチェックを入れ、「アクセス許可の追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a3c17b69-df1c-6f1c-4915-452409b66e4d.png)

最後にクライアントシークレットを追加します。
ブレードから「証明書とシークレット」を選択し、「新しいクライアントシークレット」をクリックし、クライアントシークレットを追加します。
追加したシークレットは、後で使用するのでコピーしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/a8f29a6a-e6b9-4ef5-7396-3c49b26f3286.png)



##Azure Key Vaultの設定変更
前回作成したKey Vaultのアクセス許可を追加します。
Key Vaultを開き、ブレードから「アクセスポリシー」を選択し、「アクセスポリシーの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/eaeb9608-0e40-ad8a-cbc6-54eca1557102.png)

以下のような画面が表示されます。
テンプレートからの構成で、「シークレットの管理」を選択します。
⇒シークレットのアクセス許可項目（取得や一覧、セット等）が７つ追加されます。
プリンシパルの選択では、先ほど作成したAzure ADのアプリ名を入力します。
選択後、「追加」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d7ee3a73-1080-e51d-af9f-dfeb1da7b08a.png)


ポリシーの追加を行った後、忘れずに「保存」ボタンをクリックしてください。
⇒ここ、忘れがち（笑）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8ed0fc6f-ff4f-5e96-b367-599174d4123d.png)


##Logic Appの設定
HTTPコネクタを使って、Key VaultのAPIを呼び出します。
Key Vaultのシークレット設定用APIの仕様は、以下のページに記載があります。
[https://docs.microsoft.com/ja-jp/rest/api/keyvault/setsecret/setsecret](https://docs.microsoft.com/ja-jp/rest/api/keyvault/setsecret/setsecret)

HTTPコネクタの設定は以下のような感じになります。
URLには
https://（BaseUrl）/secrets/（secret-name）?api-version=7.1
を設定します。
BaseUrlには、対象のKey Vaultの概要に記載されているDNS名を入れてください。
本文にはJSON形式で、更新値をValueプロパティとして設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/b755d809-4022-0899-916a-d3b8612a2718.png)

次にOAuth認証の設定を行います。
「Add new parameter」をクリックし、「認証」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/b27ffe2a-2a68-b956-1909-33e364b9c001.png)

認証の種類を選択できるようになるので、「Active Directory OAuth」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ed83bd47-d066-dfa0-eb65-dd7da920c338.png)

認証情報を設定します。
・テナント　　　：Azure ADに追加したアプリの概要ページに記載のディレクトリ (テナント) ID
・対象ユーザー　：https://vault.azure.net
　　　　　　　　　※BaseUrlで設定したURLではありません！
・クライアントID：Azure ADに追加したアプリの概要ページに記載のアプリケーション (クライアント) ID
・資格情報の種類：シークレット
・シークレット　：Azure ADに追加したアプリで生成したクライアントシークレット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/2bb4bac9-ce6d-5784-2ea1-0af77a9ecda2.png)

これで設定は以上になります。
Logic Appを実行してみると、こんな感じです。
応答が状態コード200で処理が成功しました。
ポリシーの設定がうまくいっていないと、状態コード403が返ってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f6b537a0-fcd0-89bc-2725-faa5c11440ee.png)