Edited at

Azure Function で App Settings / Connection String で使ってはいけない名前

More than 1 year has passed since last update.

今日は同僚とどっぷりハマった内容を。

Azure Functions の、 Queue Trigger を使った時に、私の同僚の環境だとちゃんとデキューするのに、私の環境だと動かなかった。同僚といろいろ試してみると、私の環境だと、App Setting で指定する、Queue Trigger の名前が "Storage" だったらダメだけど、他の名前だったら動くという全く意味不明な振る舞いが判明した。

Function02.png

原因はわからないので、Issue をあげてみた

彼がここで、App Settings とっているといったコードを見て分かった事。

      internal static readonly string Prefix = "AzureWebJobs";

/// <summary>

/// Attempts to first read a connection string from the connectionStrings configuration section.

/// If not found there, it will attempt to read from environment variables.

/// </summary>

/// <param name="connectionStringName">The name of the connection string to look up.</param>

/// <returns>The connection string, or <see langword="null"/> if no connection string was found.</returns>

public string GetConnectionString(string connectionStringName)

{

// first try prefixing

string prefixedConnectionStringName = GetPrefixedConnectionStringName(connectionStringName);

string connectionString = ConfigurationUtility.GetConnectionFromConfigOrEnvironment(prefixedConnectionStringName);

if (string.IsNullOrEmpty(connectionString))

{

// next try a direct unprefixed lookup

connectionString = ConfigurationUtility.GetConnectionFromConfigOrEnvironment(connectionStringName);

}

return connectionString;

}

これやと、Storage と記述して、もし、AzureWebJobsStorage というのがセットされていたら、こっちが勝つがな。そして、AzureWebJobsStorage というのは先に登録されているので、そっちのほうが読み込まれる。

同僚の環境で動いたのは、同僚の環境だと、AzureWebJobsStorage の StorageAccount が Queue のものと同一だったから。その同僚が、こんなコードを発見してくれた。

namespace Microsoft.Azure.WebJobs

{

/// <summary>Defines connection string names used by <see cref="IConnectionStringProvider"/>.</summary>

public static class ConnectionStringNames

{

/// <summary>Gets the dashboard connection string name.</summary>

public static readonly string Dashboard = "Dashboard";

/// <summary>Gets the Azure Storage connection string name.</summary>

public static readonly string Storage = "Storage";

/// <summary>Gets the Azure ServiceBus connection string name.</summary>

public static readonly string ServiceBus = "ServiceBus";

}

}


結論

Azure Functions の AppSettings/Connection String には、Storage, Dashboard, ServiceBus という名前は付けてはいけない。

以上です!


リソース