web-dev-qa-db-ja.com

Azure Functionsデータベース接続文字列

Azure関数でapp.configファイルを追加またはアクセスして、データベース接続文字列を追加するにはどうすればよいですか?

app.configを追加する予定がなく、外部データベースにアクセスして機能を実行するより良い方法がある場合は、ベストプラクティスをお知らせください。ありがとう!

50
Lereveme

Jan_V almostそれを釘付けにしたので、local.settings.jsonでこれを試してみました

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}

これにより、私たちが慣れているConfigurationManager.ConnectionStrings[]を使用できます。

var sqlConnection = ConfigurationManager
                   .ConnectionStrings["MyConnectionString"].ConnectionString;
37
Todd DeLand

これを行う最良の方法は、Azureポータルから接続文字列を追加することです。

  • Function App UIから、Function App Settingsをクリックします
  • 設定/アプリケーション設定
  • 接続文字列を追加する

これらは、web.configにあるかのように、同じロジックを使用して利用可能になります。

var conn = System.Configuration.ConfigurationManager
                 .ConnectionStrings["MyConn"].ConnectionString;

または、.NET以外の言語を使用している場合は、代わりにアプリ設定を使用できます。これは、実行時に関数がアクセスできる単純な環境変数になります。

33
David Ebbo

機能ランタイムv2では、Configuration Managerは新しいAsp.Net Core Configuration Systemに置き換えられます。

したがって、.Net Coreを使用している場合は、John Gallantsブログの記事に従う必要があります。 https://blog.jongallant.com/2018/01/Azure-function-config/

  • Local.settings.jsonとAzure Functionの設定で動作します
  • アプリの設定と接続文字列で動作します
16
Johannes

ここでいくつかの同様の質問と回答を行いました。それらの多くは、誤解を招くか、全員が同じレベルにあり、Azureの機能がどのように機能しているかを理解していると想定しています。私のような初心者には答えがありません。ここで私のソリューションをステップごとにまとめたいと思います。

  1. 最も重要なことは、local.settings.jsonファイルを理解することです。AzureではISではありません。名前が明確に言っているように、ローカルでアプリを実行することです。したがって、解決策はこのファイルとは関係ありません。

  2. App.ConfigまたはWeb.Configは、Azureの関数接続文字列に対して機能しません。データベースレイヤーライブラリがある場合、Asp.Netアプリケーションで行うように、これらのいずれかを使用して接続文字列を上書きすることはできません。

  3. 使用するには、Azure関数のApplication Settingsの下にあるAzureポータルで接続文字列を定義する必要があります。接続文字列があります。そこでDBContextの接続文字列をコピーする必要があります。 edmxの場合、次のようになります。接続タイプがあり、SQlAzureを使用しますが、Customでテストしました(誰かがカスタムでのみ動作すると主張しました)両方で動作します。

metadata = res:// /Models.myDB.csdl|res:///Models.myDB.ssdl | res://*/Models.myDB.msl; provider = System.Data.SqlClient ; provider connection string = 'data source = [yourdbURL]; initial catalog = myDB; persist security info = True; user id = xxxx; password = xxx; MultipleActiveResultSets = True; App = EntityFramework

  1. これを設定したら、アプリケーションでURLを読み取り、DBContextを提供する必要があります。 DbContextは、接続文字列パラメーターを使用してコンストラクターを実装します。デフォルトでは、コンストラクターにはパラメーターがありませんが、これを拡張できます。 POCOクラスを使用している場合は、DbContextクラスを簡単に修正できます。データベースの生成されたEdmxクラスを使用する場合、自動生成されたedmxクラスを変更するのではなく、同じ名前空間で部分クラスを作成し、このクラスを以下のように拡張します。

これは自動生成されたDbContextです

namespace myApp.Data.Models
{   

    public partial class myDBEntities : DbContext
    {
        public myDBEntities()
           : base("name=myDBEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

}

これは新しい部分クラスです。作成します

namespace myApp.Data.Models
{
    [DbConfigurationType(typeof(myDBContextConfig))]
    partial class myDBEntities
    {

        public myDBEntities(string connectionString) : base(connectionString)
        {
        }
    }

      public  class myDBContextConfig : DbConfiguration
        {
            public myDBContextConfig()
            {
                SetProviderServices("System.Data.EntityClient", 
                SqlProviderServices.Instance);
                SetDefaultConnectionFactory(new SqlConnectionFactory());
            }
        }
    }
  1. 結局のところ、Azure設定から接続文字列を取得するには、Azure Functionプロジェクトで以下のコードを使用し、DbContextにmyDBEntitiesを提供します。これは、接続文字列のAzureポータルで指定した名前です。
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString;


 using (var dbContext = new myDBEntities(connString))
{
        //TODO:
}
13
batmaci

トッドデランドの回答は、地域環境でのみ有効です。ただし、この doc ごとに、公開されたAzure Functionでは、接続文字列をアプリ設定として保存し、GetEnvironmentVariableによって取得する必要があります。

System.Configurationアセンブリ参照の追加は、不要です

string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);

以下は、環境文字列をbothローカル環境と公開環境で取得可能にする手順です。

  1. ローカル環境をサポートするには、local.settings.jsonで、Valuesノード内に接続文字列を指定します

local.settings.json picture

  1. 公開された環境をサポートするには、portal.Azure.com > your Azure Function > function node > Application Settingsにアクセスしてください

Application Settings

Add MyConnectionString

  1. 最後に、Azure FunctionからGetEnvironmentVariableを呼び出します(このコードを正しく表示するには、stackoverflowを取得する必要があります)

enter image description here

それでおしまい。

9
Jeson Martajaya

一般的なプラクティスは、Azure関数に環境変数を使用することであると考えています。その後、Azure関数で環境変数を設定できます。

(機能アプリ設定->アプリ設定の構成->アプリ設定セクション)

使用している言語をお知らせいただければ、さらに役立つと思いますか?

2
William Yeung

この方法を試してください。

public static string GetConnectionString(string name)
{
    string conStr = System.Environment.GetEnvironmentVariable($"ConnectionStrings:{name}", 
                    EnvironmentVariableTarget.Process);

    // Azure Functions App Service naming 
    if (string.IsNullOrEmpty(conStr))convention
        conStr = System.Environment.GetEnvironmentVariable($"SQLAZURECONNSTR_{name}", 
                 EnvironmentVariableTarget.Process);

    return conStr;
}
1
AhsanRazaUK

上記の提案のいくつかは機能します。ただし、接続文字列を設定するより簡単な方法があります。これは、公開設定を押した後に表示される「公開」画面を使用することによります。 こちらのドキュメントの図を参照

0
Vijay Koganti

以下は、コスモスdbを照会するhttpトリガー関数について、ローカルとAzureの両方で機能しました

追加 Microsoft.Azure.WebJobs.Extensions.CosmosDB プロジェクトへのnugetパッケージ参照

接続文字列の設定:

local.settings.json

{
  "ConnectionStrings": {
    "CosmosDBConnection": "AccountEndpoint=foobar;"
  }
}

inAzure portal>function apps>プラットフォーム機能>構成>アプリケーション設定>新しいアプリケーション設定> Name: CosmosDBConnectionValue: AccountEndpoint=foobar;update>save

サンプルC#Azure関数

public static async Task<IActionResult> Run(
           [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
           [CosmosDB(databaseName:"dbName",
                     collectionName:"collectionName",
                     ConnectionStringSetting = "CosmosDBConnection")] DocumentClient documentClient, 
           ILogger log){
             .....
           }
0
ManiVI

私はローカルデータベースで以下のコードスニペットを試してみましたが、簡単そうです。みてみましょう。

Nuget Extention:

Nuget Package ManagerプロジェクトからDependenciesパートから次のリファレンスをダウンロードします

using System.Data.SqlClient;

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "sqldb_connection": "Data Source=.;Initial Catalog=DatabaseName;Connection Timeout=30;Integrated Security=True;"
  }
}

関数本体の読み取り接続:

//データベース接続の読み取り

        var sqlConnection = Environment.GetEnvironmentVariable("sqldb_connection");

接続文字列を使用した関数読み取り書き込み操作:

// Convert all request perameter into Json object

                var content = req.Content;
                string jsonContent = content.ReadAsStringAsync().Result;
                dynamic requestPram = JsonConvert.DeserializeObject<AzureSqlTableClass>(jsonContent);

                // Validate required param

                if (string.IsNullOrEmpty(requestPram.FirstName))
                {
                    return req.CreateResponse(HttpStatusCode.OK, "Please enter First Name!");
                }
                if (string.IsNullOrEmpty(requestPram.LastName))
                {
                    return req.CreateResponse(HttpStatusCode.OK, "Please enter Last Name!");
                }



                //Read database Connection

                var sqlConnection = Environment.GetEnvironmentVariable("sqldb_connection");
                var responseResults = 0;

                //Read Write Uisng Connection String

                using (SqlConnection conn = new SqlConnection(sqlConnection))
                {
                    conn.Open();
                    var text = "INSERT INTO AzureSqlTable VALUES ('" + requestPram.FirstName + "', '" + requestPram.LastName + "', '" + requestPram.Email + "') ";

                    using (SqlCommand cmd = new SqlCommand(text, conn))
                    {
                        responseResults = await cmd.ExecuteNonQueryAsync();
                    }
                    conn.Close();
                }

                return req.CreateResponse(HttpStatusCode.OK, responseResults);

注:Azure portalで関数を公開しているときに、local.settings.jsonファイルの接続文字列を置き換えるだけです。それに応じて動作します。以下のスクリーンショットをご覧ください。

enter image description here