我开发了一个cron触发天蓝色功能,需要在数据库中搜索soe数据。
我可以在本地连接sql服务器,因此我将loca.settings.json中的连接字符串更改为在Azure SQL中连接并发布了该功能,但是该功能无法与数据库连接。
除了配置local.settings.json以外,我还需要做其他事情吗?
答案 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 和应用程序放在同一个虚拟网络中,这可能会更容易。 (但我知道什么?)
相反,如果您没有多余的现金,您可以尝试我所做的,并设置一个私有端点,并为您的数据库使用代理连接设置:
创建一个 virtual network
转到 "Private link center" 并创建一个私有端点。
转至 Sql Databases 更新您的防火墙,选择您的数据库,然后从概览选项卡中单击“设置服务器防火墙”。
az functionapp show --resource-group <group_name> --name <app_name> --query possibleOutboundIpAddresses
从专用链接中心 > 专用端点 > DNS 配置中查找您的 FQDN。它可能类似于 yourdb.privatelink.database.windows.net
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?)。我想不通,所以我想出了这个。