【问题标题】:How can I connect my azure function with my azure sql如何将我的 azure 函数与我的 azure sql 连接
【发布时间】:2019-05-09 15:32:41
【问题描述】:

我开发了一个 cron trigger azure 函数,它需要在我的数据库中搜索 soe 数据。

Localy我可以连接whit sql server,所以我将loca.settings.json中的连接字符串更改为连接azure sql并发布了函数,但该函数无法连接数据库。

我需要做的不仅仅是配置 local.settings.json 吗?

【问题讨论】:

  • 你在用 C# 编码吗?
  • 我在下面回答。如果您仍然遇到问题,请分享您连接到数据库的 C# 代码。

标签: azure azure-functions


【解决方案1】:

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

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

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

设置连接字符串

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

您之前必须已将应用发布到 Azure。如果您尚未这样做,请将您的函数应用发布到 Azure。

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

函数应用的应用设置。

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

添加 SQL 连接字符串设置。

连接字符串在 Azure(远程)中加密存储。为防止泄露机密,应将 local.settings.json 项目文件(本地)排除在源代码管理之外,例如使用 .gitignore 文件。

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

【讨论】:

  • Carlos, estou usando o Entity Framework para a conexão em outra camada。 Eu fiz da maneira que informou e continuou a dar problemas de conexão, o log diz que não pode encontrar a connection string
  • 我在我的项目中找不到“发布 > 管理应用程序设置”,该项目已发布为 Azure 功能。使用 Visual Studio 2019 for Mac。
  • @VipinJohney 发布 > 管理应用程序设置位于 Azure 门户 microsoft.github.io/AzureTipsAndTricks/blog/tip130.html
  • MS Windows 版本的 Visual Studio 有这个选项,而 Mac 版本没有。与拥有它的朋友核实。
【解决方案2】:

如果您使用实体框架核心进行连接,则连接到 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 操作。

【讨论】:

    【解决方案3】:

    刚刚处理了这个野兽(使用 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”(唯一选项)
      • 在下一步中,应自动选择您的虚拟网络和子掩码
      • 将私有 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-services 之间跳转,那么您将需要某种身份验证(例如使用 AD 登录到您的数据库),在我的情况下,为我的应用程序使用自定义处理程序和 linux 基础,我 认为这意味着您需要一些信任协商(也许是kerberos?)。我想不通,所以我想出了这个。

    【讨论】:

    • 第3步很危险,有相同IP的其他函数应用可能会访问数据库。
    • @AkashKava - 关于如何允许其他 Azure 资源访问数据库服务器,您还有其他建议吗?
    • @nealsu 除非 Azure 为消费层启用静态 IP,否则使用高级层是唯一的解决方案。让数据库对 IP 范围开放是一个问题,不满意的员工可以将应用程序部署到 azure 函数以连接到数据库。
    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2019-08-28
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多