Azure FunctionsでのKey Vault参照の利用

このエントリは2019/10/16現在の情報に基づいています。将来の機能追加・変更に伴い、記載内容との乖離が発生する可能性があります。

先日、Azure App ServiceとAzure FunctionsでのKey Vault参照が一般提供されたとの発表があった。これは、Key Vaultに格納したシークレットを環境変数としてApp ServiceやFunctions Appから取得できる、というもの。

Key Vault references in App Service and Azure Functions are now available
https://azure.microsoft.com/en-us/updates/general-availability-of-key-vault-references-in-app-service-and-azure-functions/

日本語ドキュメント上はまだプレビューとの表記があるが、今後のアップデートで表現が変わるはず。

App Service と Azure Functions の Key Vault 参照を使用する (プレビュー)
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-key-vault-references
Use Key Vault references for App Service and Azure Functions
https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references

現時点(2019/10/16現在)の注意点は以下の通り。

  • Linuxプランでは利用できない
  • システム割り当てのマネージド ID のみをサポート(ユーザー割り当て ID は使用できない)
  • ネットワーク制限があるキー コンテナーに格納されているシークレットを解決できない(つまり、仮想ネットワーク サービス エンドポイントが設定されていると利用できない)
  • 利用するシークレットバージョンの指定が必要

例によって、Javaから利用できるのかを確認する。

手順

Key Vaultインスタンスの作成

HSMを使っても使わなくてもよい。今回はHSMを使わないものを作成しておく。シークレットとして文字列を入れておく(今回はPassw0rd12345という文字列をシークレットとして格納)。

Azure Functions アプリの作成

以下を呼び出してできあがるHTTP-JavaTriggerを使う。なお、簡単のため、認可レベルはANONYMOUSに、メソッドはGETのみ、Query Parameterはなくしておく。

mvn archetype:generate \
-DarchetypeGroupId=com.microsoft.azure \
-DarchetypeArtifactId=azure-functions-archetype \
-DappName={resourceGroup} \
-DappRegion={region} \
-DresourceGroup={resourceGroup} \
-DgroupId=com.{functionAppName}.group \
-DartifactId={functionAppName}-functions \
-Dpackage=com.{functionAppName} \
-DinteractiveMode=false

また、アプリケーション設定で、新しいアプリケーション設定を追加し、Key Vaultのシークレットにアクセスするための環境変数を構成する。設定にあたっての構文は以下のドキュメントに従う。

参照構文
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-key-vault-references#reference-syntax
Reference syntax
https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#reference-syntax

今回はKEYVAULT_SECRET1とKEYVAULT_SECRET2を作成し、上記ドキュメントの2通りの参照方法で設定した。問題なければ、両変数で同じ文字列が返ってくるはず。

マネージドIDの作成

システム割り当て ID のみをサポートしているので、以下のドキュメントの記載に従う。

システム割り当て ID の追加
https://docs.microsoft.com/ja-jp/azure/app-service/overview-managed-identity#adding-a-system-assigned-identity
Adding a system-assigned identity
https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity#adding-a-system-assigned-identity

Azure Portalでシステム割り当てマネージドIDを有効化した場合(IDが識別になっているのはご愛嬌・・・)

Key Vaultでアクセスポリシーを作成

Functions AppのマネージドIDを作成すると、Azure ADでService Principalが作成されるので、Functions Appに対してシークレットのGET(取得)操作のみを有効にしたアクセスポリシーを作成する。

Javaアプリケーションの作成

環境変数にアクセスするので、System#getenv()を使う。具体的には以下のような感じで取得した環境変数を両者並べて、それをFunctions Appの戻り値として返している。Key VaultのSDKは一切使っていない。

return request.createResponseBuilder(HttpStatus.OK)
        .body("SECRET1=" + System.getenv("KEYVAULT_SECRET1") + " / SECRET2=" + System.getenv("KEYVAULT_SECRET2")).build();

試してみる

Azure Functions AppはHTTP Bindingを使っているので、REST Clientを使ってアクセスしてみると、環境変数を参照するどちらの方式でも正しく取得できていることがわかる。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中