【Azure】FunctionsからKeyValutに登録した値を参照する

JavaScript,環境構築

こんにちは、しきゆらです。
Azure関連のメモシリーズになります。
今回は、タイトルの通りKeyVaultに登録したクレデンシャル情報をAzure Functions/関数アプリから参照する方法をメモしておきます。

参考になりそうなドキュメントは以下になります。

ひと目でわかるAzure 基本から学ぶサーバー&ネットワーク構築 第4版

ひと目でわかるAzure 基本から学ぶサーバー&ネットワーク構築 第4版

横山 哲也
3,300円(04/19 10:05時点)
Amazonの情報を掲載しています

設定項目

KeyVault側、Functions側両方に設定が必要になります。
それぞれ記載します。

Functions側の設定

Functionsを開き、設定>IDから「システム割り当て」タブ内に設定項目があります。
デフォルトではオフとなっていると思うので、オンにします。
これにより、指定したFunctionsに識別子(プリンシパルID)が発行され、このIDに対して権限付与をする形になります。

オンにすると、このFunctionsの固有IDが表示されるので、覚えておきましょう。

オンにした後の画面からもロールの割り当ても可能ですが
KeyVaultという別アプリに対する権限なので、KeyVault側から設定していきます。

KeyVault側の設定

KeyVaultを開き、サイドバーの「アクセス制御(IAM)」をクリック。
上部にある「追加」ボタンをクリックします。

「ロールの割り当ての追加」画面にて、付与可能なロール一覧が表示されます。
この中から適切な権限を割り振ります。
今回は「キー コンテナー管理者」を選択します。
下図のように割り振るロールをクリックするとグレーに選択されるので、この状態になったら画面上部のメニューの「メンバー」をクリック。

メンバー画面にて、前画面で選択したロールを割り振る先を指定します。
「選択されたロール」のところで、前画面で選択したロールが表記されていることを確認しましょう。
そして「アクセスの割当先」にある「マネージドID」を選択し、下にある「メンバーを選択する」をクリック。
「マネージドID」のプルダウンで「関数アプリ」を選択し、その下の「選択」にて先ほど有効にしたFunctionsのマネージドIDを選択し、画面右下にある「選択」をクリック。

ロールの割り当ての追加画面にて、設定・指定に問題なければ「レビューと割り当て」をクリック。
再度、レビューと割り当ての画面にて設定値・項目が正しいことを確認したのち、問題なければ割り当てします。

なお、同様の手順でWebの管理画面から操作できるように、ログインしているユーザにもロールを付与しておくと便利かと思います。

設定はこれにて完了です。

では、実際にKeyVaultにクレデンシャル情報を格納していきましょう。

KeyVaultにデータを格納する

Webの管理画面からの追加、Functionsのコードからの追加、PowerShellのコマンドからの追加、と複数の操作ができるようです。
ここでは、目で見てわかりやすいWebの管理画面から追加する方法をメモしておきます。

なお、KeyVaultでは格納するデータをシークレットと表現しているので、ここでも同様に表現しています。

KeyVaultを開き、「オブジェクト」>「シークレット」を開きます。
画面上部にある「生成/インポート」をクリック。

シークレットの生成画面にて、情報を入力していきます。
「名前」は格納するデータに対する名前を、「シークレット値」には実際に格納するデータをそれぞれ記入します。
そのほか、有効期限やアクティブする日を指定する必要があれば指定したのち「作成」ボタンをクリックします。

設定はこれで完了です。

FunctionsにKeyVaultの参照を追加する

コード上からKeyVaultを参照し、データを食わせることもできるようですが手間なので
Functionsの環境変数としてKeyVaultの参照ができるように設定します。

Functionsを開き、サイドバーの「設定」>「環境変数」をクリックします。
「追加」をクリックして環境変数を追加します。

「アプリケーション設定の追加/編集」画面にて、環境変数の名前と値を指定します。
名前は参照する環境変数名を、専用記法で先ほど追加したKeyVaultのシークレット名を指定します。
なお、ここではKeyVaultに指定した名前と同じ環境変数名を指定していますが、任意に指定可能です。

KeyVaultを参照させる記法は以下の通り。
2パターンありますが、ぱっと見で分かりやすいのは下の方かなと思います。

# シークレット識別子を指定する場合 @Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret) 

# Vault名、シークレット名を指定する場合 @Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret)

追加後、リストの中に指定した名前が追加されているか、ソース欄に「キーコンテナー」が表示されチェックマークがついていることを確認し「適用」をクリックします。

なお、環境変数の値の記載を間違えている場合は、赤い×マークが表示されます。
こうなっている場合は、値の記述を確認しましょう。

コードからKeyVaultに格納したデータを参照する

環境変数を参照するコードを追記する

ここではNodeを使っているので、Nodeから環境変数を参照する形で記述する。
以下で問題ありません。

process.env.<環境変数名>

ローカル実行から参照したとき

正常に環境変数を設定できると、VSCodeのFunctionsの設定にも表示が追加されるはずです。
ここでも確認できるので、設定できていることを確認したうえで次手順へ。

環境変数を確認出来たら「Application Settings」を右クリックして「Download Remote Settings」をクリックして設定値をローカルに取り込みます。

local.settings.jsonに環境変数名が追加されたことを確認し、コードを実行してみます。
なお、ローカル実行については過去記事もあるのでそちらも参照ください。

以下のようなコードを追記して実行してみます。

context.log(`CredentialTest: ${process.env.CredentialTest}`);

結果はこちら。

問題なく参照できていますね。

デプロイしたFunctionsから参照した時

環境変数を参照するコードを追記したら、コードをデプロイします。
デプロイについては過去記事を参照ください。

結果は以下の通り。
ローカルと同様、参照できていることがわかります。

これにて、KeyVaultのデータを参照する方法が確立できました。

まとめ

今回は、KeyVaultに格納したクレデンシャル情報をAzure Functionsから参照する方法をまとめました。
GASでいうところのPropertiesServiceのようなことがFunctionsでも可能になりました。

外部サービスのAPIトークンを格納する、など様々な使い道があると思うので絶対に必要となる部分かと思います。
私もToken格納のために情報を集めたので、できないはずがないと思いつつわかりやすく整理した記事があまりなかったので自分でまとめてみました。
同じようなことで困っている方がいれば、その助けの一助になれればなと。

ひと目でわかるAzure 基本から学ぶサーバー&ネットワーク構築 第4版

ひと目でわかるAzure 基本から学ぶサーバー&ネットワーク構築 第4版

横山 哲也
3,300円(04/19 10:05時点)
Amazonの情報を掲載しています

今回は、ここまで。
おわり

Posted by しきゆら