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

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

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

<img width="491" alt="Function02.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/e8361745-1cd3-8f36-9fbd-0b663a7963b7.png">


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

 * [Connection string name "Storage" didn't work ](https://github.com/Azure/azure-functions-vs-build-sdk/issues/95)

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

```csharp
      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 のものと同一だったから。その同僚が、こんなコードを発見してくれた。

```csharp
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` という名前は付けてはいけない。

以上です！

## リソース

 * [Connection string name "Storage" didn't work ](https://github.com/Azure/azure-functions-vs-build-sdk/issues/95)
 * [azure-webjobs-sdk/src/Microsoft.Azure.WebJobs.Host/AmbientConnectionStringProvider.cs ](https://github.com/Azure/azure-webjobs-sdk/blob/dev/src/Microsoft.Azure.WebJobs.Host/AmbientConnectionStringProvider.cs#L34)
 * [azure-webjobs-sdk/src/Microsoft.Azure.WebJobs.Host/ConnectionStringNames.cs ](https://github.com/Azure/azure-webjobs-sdk/blob/663a508e8a851629c26a51e7de3af36629dfd120/src/Microsoft.Azure.WebJobs.Host/ConnectionStringNames.cs)