Azureコンテナーから読み取られる接続文字列からキュートリガーまたはBLOBトリガーを初期化できるかどうか疑問に思っていました。
現在、ブレードのプロパティを介して環境設定を介してこれらのデータ接続を設定する必要があります。ただし、サービスプリンシパルを使用してAzureキーコンテナーのトークンを取得し、これらすべての接続文字列を取得したいと思っていました。
私はこれをJavaで動作させる方法を理解しようとしています。
ありがとう、デレク
この機能は追跡され、ここで進行中です:
EDIT 28/11/2018:現在プレビュー中です
以前の回答2018年7月10日このソリューションは、消費プランを使用するトリガーに対しては機能しません。
その間、私はあなたの問題についていくつかの調査を行いました、そして、Azure Function v2を使用している場合、キーコンテナーから構成を読み取ることが可能です。
Visual StudioからAzure Functions v2(.NET Standard)を作成しました。
それは使用しています:
Azure Functions v2はASP.NETコアを使用しているため、このリンクを参照して、Azure Key Vaultを使用するように機能アプリを構成できました。
ASP.NET CoreのAzure Key Vault構成プロバイダー
このnugetパッケージを追加しました:
このnugetパッケージを使用するようにアプリを構成しました。
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
[Assembly: WebJobsStartup(typeof(FunctionApp1.WebJobsExtensionStartup), "A Web Jobs Extension Sample")]
namespace FunctionApp1
{
public class WebJobsExtensionStartup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
// Gets the default configuration
var serviceConfig = builder.Services.FirstOrDefault(s => s.ServiceType.Equals(typeof(IConfiguration)));
var rootConfig = (IConfiguration)serviceConfig.ImplementationInstance;
// Creates a new config based on the default one and adds the keyvault configuration builder
var keyvaultName = rootConfig["keyVaultName"];
var config = new ConfigurationBuilder()
.AddConfiguration(rootConfig).AddAzureKeyVault($"https://{keyvaultName}.vault.Azure.net/").Build();
// Replace the existing config
builder.Services.AddSingleton<IConfiguration>(config);
}
}
}
My Azure関数はMSIを使用します。
Key Vaultの関数アプリにシークレットの読み取り/一覧のアクセス許可を付与しました。
小さなキュートリガー機能があります:
public static class Function2
{
[FunctionName("Function2")]
public static void Run([QueueTrigger("%queueName%", Connection = "queueConnectionString")]string myQueueItem, ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}
}
queueName
はlocal.settings.json
ファイルで定義されています(展開されたアプリ設定ブレード):
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"keyVaultName": "thomastestkv",
"queueName": "myqueue"
}
}
queueConnectionString
はkeyvaultで設定されています:
これは数日前にpreviewとしてリリースされたばかりです。
この機能には、アプリにシステムが割り当てた管理対象IDが必要です。この投稿の後半では、ユーザーが割り当てたIDについて説明しますが、ここではこれらのプレビューを個別に保持します。
次に、アプリケーションにシークレットのGET権限を付与するKey Vaultのアクセスポリシーを構成する必要があります。アクセスポリシーを構成する方法について説明します。
最後に、アプリケーション設定の値を次の形式の参照に設定します。
@ Microsoft.KeyVault(SecretUri = secret_uri_with_version)
ここで、secret_uri_with_versionはKey Vaultのシークレットの完全なURIです。たとえば、次のようになります。 https://myvault.vault.Azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
上記ですでに私の回答を示しましたが、この回答は@Matt Sandersのコメントに対するものです。Azure環境でMSIがどのように機能するかを説明したいだけです。
"2人のユーザーにIDが割り当てられていますが、1人はKeyVaultへのアクセス許可があり、もう1人はそうではありません。シークレットの取得に使用するIDが割り当てられている正しいユーザーを指定するにはどうすればよいですか?回答にリストされていても、ユーザー割り当てIDはサポートされていません。– Matt Sanders "
azure Manage Identity Serviceを使用する場合、アプリケーションはAzure ADに登録する必要があります。たとえば、Webアプリケーションにアクセスしている複数のユーザーが、Webアプリケーション内でvVaultのシークレットにアクセスしようとしているとします。 、ボールトはアプリケーションを使用するユーザーを気にしません。アプリケーションを気にします。
下の画像を参照してください、
画像を表示しているように、Azure FunctionのみがIDとしてボールトに追加され、他のアプリケーションはそうではありません。
したがって、Azure関数を使用するユーザーは誰でもボールトのシークレットにアクセスできます。この例では、シークレットにアクセスできるのはAとBだけです。
私はそれをJava以下の2つの参照に従って実装しました。
https://docs.Microsoft.com/en-us/Azure/app-service/app-service-key-vault-references
https://medium.com/statuscode/getting-key-vault-secrets-in-Azure-functions-37620fd20a0b
Java use System.getenv( "SECRET_KEY")を使用して、アプリの設定から値を読み取ります。
さらにサポートが必要な場合はサポートさせていただきます。