我怎样才能将Azure函数与Azure SQL连接

时间:2019-05-09 15:32:41

标签: azure azure-functions

我开发了一个cron触发天蓝色功能,需要在数据库中搜索soe数据。

我可以在本地连接sql服务器,因此我将loca.settings.json中的连接字符串更改为在Azure SQL中连接并发布了该功能,但是该功能无法与数据库连接。

除了配置local.settings.json以外,我还需要做其他事情吗?

3 个答案:

答案 0 :(得分:1)

local.settings.json仅用于本地测试。它甚至没有导出到天蓝色。

您需要在应用程序设置中创建一个连接字符串。

在Azure Functions中-单击“平台功能”,然后单击“配置”。

设置连接字符串

功能应用程序托管您在Azure中执行功能。作为最佳安全实践,请将连接字符串和其他机密存储在功能应用程序设置中。使用应用程序设置可以防止您的代码意外泄露连接字符串。您可以直接从Visual Studio访问功能应用程序的应用程序设置。

您必须先前已将应用程序发布到Azure。如果尚未这样做,请将功能应用程序发布到Azure。

在解决方案资源管理器中,右键单击功能应用程序项目,然后选择“发布”>“管理应用程序设置...”。选择“添加设置”,在“新应用程序设置名称”中,键入sqldb_connection,然后选择“确定”。

功能应用程序的应用程序设置。

在新的sqldb_connection设置中,将您在上一节中复制的连接字符串粘贴到“本地”字段中,并将{your_username}和{your_password}占位符替换为实际值。选择“从本地插入值”以将更新的值复制到“远程”字段,然后选择“确定”。

添加SQL连接字符串设置。

连接字符串以加密方式存储在Azure(远程)中。为了防止泄露机密,应该从源代码管理中排除local.settings.json项目文件(Local),例如使用.gitignore文件。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-scenario-database-table-cleanup

答案 1 :(得分:0)

如果您使用实体框架核心进行连接,则与SQL的其他连接方式是使用.netcore库中的依赖项注入。

您可以将连接字符串保留在Azure Key-vault或配置文件中,您可以使用Azure函数启动类从中读取该字符串。需要在功能应用中设置以下代码。

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof( TEST.Startup))]
namespace TEST
{
    internal class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            Contract.Requires(builder != null);
            builder.Services.AddHttpClient();

            var configBuilder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
               .AddAzureKeyVault($"https://XYZkv.vault.azure.net/"); 

            var configuration = configBuilder.Build();
            var conn = configuration["connectionString"];   

           builder.Services.AddDbContext<yourDBContext>(
            options => options.UseSqlServer(configuration["connectionString"]));     
       }
    }
}

在此之后,无论您在何处注入此dbcontext,都可以使用上下文对象通过遵循Microsoft的实体框架核心库文档进行所有CRUD操作。

答案 2 :(得分:0)

刚刚处理了这个野兽(使用 Linux 的自定义处理程序),我相信简单的方法是将您的应用升级到高级计划,允许您从“应用服务计划”访问“网络”页面。这应该允许您将 sql-server 和应用程序放在同一个虚拟网络中,这可能会更容易。 (但我知道什么?)

相反,如果您没有多余的现金,您可以尝试我所做的,并设置一个私有端点,并为您的数据库使用代理连接设置:

  1. 创建一个 virtual network

    • 我使用了地址空间:10.1.0.0/16(我认为是默认值)
    • 添加任意名称的子网 10.1.0.0/24(需要添加子网)
  2. 转到 "Private link center" 并创建一个私有端点。

    • 您喜欢的任何名称、资源组
    • 使用资源类型“Microsoft.Sql/Server”,您应该能够选择您的 sql-server(我假设您已经创建了它)并将目标子资源设置为“sqlServer”(唯一的选项)< /li>
    • 下一步应该自动选择您的虚拟网络和子掩码
    • 将私有 DNS 集成设置为“是”(或稍后会受到影响)。
  3. 转至 Sql Databases 更新您的防火墙,选择您的数据库,然后从概览选项卡中单击“设置服务器防火墙”。

    • 将连接策略设置为代理。 (您要么这样做,要么升级到高级版!)
    • 添加现有的虚拟网络(任何名称的规则)
    • 白名单 IP
  4. 从专用链接中心 > 专用端点 > DNS 配置中查找您的 FQDN。它可能类似于 yourdb.privatelink.database.windows.net

    • 更新您的应用以使用此网址。您只需更新您的 sql server 连接字符串并替换域,例如作为 ADO 字符串:Server=tcp:yourdb.privatelink.database.windows.net,1433;Initial Catalog=somedbname;Persist Security Info=False;User ID=someuser;Password=abc123;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;

另请注意,我在所有这些过程中的某个时候切换到 TrustServerCertificate=True,现在我无法弄清楚它是否有区别。所以我把它作为练习留给读者去发现。

那么我们在这里做了什么......?

我们已通过连接到私有端点来强制您的函数应用脱离“azure-sphere”。我认为,如果您直接在 azure-services 之间跳转,那么您将需要某种身份验证(例如使用 AD 登录到您的数据库),在我的情况下,为我的应用程序使用自定义处理程序和 linux 基础,我认为这意味着您需要进行一些信任协商(也许是 kerberos?)。我想不通,所以我想出了这个。