概要
前回に続いて、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を開きます。
ブレードから「アプリの登録」を選びます。
以下のような画面が表示されるので、名前を入力し、「登録」をクリックします。
以下のような画面が表示されます。
続いて、APIのアクセス許可を追加します。
ブレードから「APIのアクセス許可」を選択し、「アクセス許可の追加」をクリックします。
APIの一覧が表示されるので、Azure Key Vaultを選択します。
アクセス許可の「user_impersonation」にチェックを入れ、「アクセス許可の追加」をクリックします。
最後にクライアントシークレットを追加します。
ブレードから「証明書とシークレット」を選択し、「新しいクライアントシークレット」をクリックし、クライアントシークレットを追加します。
追加したシークレットは、後で使用するのでコピーしておいてください。
Azure Key Vaultの設定変更
前回作成したKey Vaultのアクセス許可を追加します。
Key Vaultを開き、ブレードから「アクセスポリシー」を選択し、「アクセスポリシーの追加」をクリックします。
以下のような画面が表示されます。
テンプレートからの構成で、「シークレットの管理」を選択します。
⇒シークレットのアクセス許可項目(取得や一覧、セット等)が7つ追加されます。
プリンシパルの選択では、先ほど作成したAzure ADのアプリ名を入力します。
選択後、「追加」をクリックしてください。
ポリシーの追加を行った後、忘れずに「保存」ボタンをクリックしてください。
⇒ここ、忘れがち(笑)。
Logic Appの設定
HTTPコネクタを使って、Key VaultのAPIを呼び出します。
Key Vaultのシークレット設定用APIの仕様は、以下のページに記載があります。
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プロパティとして設定します。
次にOAuth認証の設定を行います。
「Add new parameter」をクリックし、「認証」にチェックを入れます。
認証の種類を選択できるようになるので、「Active Directory OAuth」を選択します。
認証情報を設定します。
・テナント :Azure ADに追加したアプリの概要ページに記載のディレクトリ (テナント) ID
・対象ユーザー :https://vault.azure.net
※BaseUrlで設定したURLではありません!
・クライアントID:Azure ADに追加したアプリの概要ページに記載のアプリケーション (クライアント) ID
・資格情報の種類:シークレット
・シークレット :Azure ADに追加したアプリで生成したクライアントシークレット
これで設定は以上になります。
Logic Appを実行してみると、こんな感じです。
応答が状態コード200で処理が成功しました。
ポリシーの設定がうまくいっていないと、状態コード403が返ってきます。