当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 设计用于生产的 Azure Function App

作者:精品下载站 日期:2024-12-14 07:14:11 浏览:16 分类:玩电脑

设计用于生产的 Azure Function App


这篇文章是有关 Azure Functions 和 PowerShell 的系列文章的一部分。查看该系列中其他帖子的列表!

介绍

在 Azure 门户中创建 Azure Function 非常简单,只需点击“添加”,选择“函数应用程序”,点击“创建”并填写表单即可。这适用于演示,但它只为我们提供了一个简单的功能应用程序,没有任何自定义。当我想在生产(或类似生产)环境中运行函数应用程序时,我总是倾向于自定义一些内容。

让我们首先简要介绍一下 Function App、一些功能及其依赖项,以便更好地了解我们想要创建的架构。对于前两篇文章,我将专注于设计,而不是讨论如何编写任何脚本。如果您想使用 ARM 模板部署函数应用程序,将会有一篇相关文章,请查看我的本系列中的第一篇文章以获取更新的索引。

标准架构

最简单的形式是,Function App 依赖于应用服务和存储帐户。应用服务提供计算(本质上是CPU和RAM),存储帐户用于存储它应该运行的代码。使用 Azure 门户中的默认配置时,存储帐户还用于存储用于调用我的函数的 API 密钥。这是可行的,但现在当我们谈论生产使用时,我想要定制一些东西。这篇文章将涵盖我通常在任何函数应用程序上自定义的通用内容,无论我稍后打算使用什么语言。

[玩转系统] 设计用于生产的 Azure Function App

分配托管身份

Azure 中的许多服务都支持托管身份和功能,也不例外。托管标识将为您的代码提供 Azure Active Directory 中的标识,该标识可用于对 Key Vault 等其他 Azure 资源进行身份验证,或者为什么不提供数据库呢?另一个常见场景是使用托管标识向 Azure 资源管理器 API 进行身份验证,以自动管理 Azure 资源。

托管身份可以是用户分配的,也可以是系统分配的。我更喜欢尽可能使用系统分配的托管身份。系统分配的托管身份是使用我的函数应用程序创建的,并在删除我的应用程序时自动清理。它的简洁性吸引了我,它帮助我确保不会在多个应用程序之间重复使用或共享身份。

您可以在文档中阅读有关托管标识和函数的更多信息:如何使用应用服务和 Azure Functions 的托管标识

在 Key Vault 中存储机密

机密应尽可能存储在 Key Vault 中。 Azure 应用服务是 Azure Functions 的基础服务,它与 Azure Key Vault 具有良好的集成。通过创建密钥保管库并分配上述托管身份对机密的访问权限,集成可以无缝运行!

首先,我想将连接字符串存储到 KeyVault 中的存储帐户。创建包含连接字符串的机密并授予托管身份访问权限以从保管库获取 GET 机密后,我所需要做的就是在应用程序设置“AzureWebJobsStorage”中输入 Key Vault 引用而不是实际的连接字符串。参考可以是以下两个示例中的任何一个。我通常使用 SecretUri 变体。

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931)

@Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret;SecretVersion=ec96f02080254f109c51a1f14cdb1931)

如果您愿意,可以在文档上阅读有关如何使用 App Service 和 Azure Functions 的 Key Vault 引用的更多信息。

但我们还没有完成!您还记得我之前提到的 API 密钥吗?用于调用函数的那些。默认情况下,它们存储在名为“azure-webjobs-secrets”的 blob 容器中。任何对存储帐户具有读取权限的人都可以提取它们,但这是行不通的。

在 Key Vault 中存储功能密钥

你猜怎么了?我们当然可以将它们存储在 Key Vault 中!为此,托管身份不仅需要对保管库中的机密进行 GET 访问,还需要 LIST 和 SET 访问。完成此操作后,我需要设置三项应用程序设置,一项设置告诉 Function App 使用“keyvault”的 AzureWebJobSecretStorageType,一项设置将 AzureWebJobsSecretStorageKeyVaultName 设置为我的 Key Vault 的名称。还有第三个设置,称为 AzureWebJobsSecretStorageKeyVaultConnectionString ,当我们使用托管标识时不需要该设置。我将其设置为空字符串只是为了确保我拥有它。

例如:

"AzureWebJobSecretStorageType": "keyvault",
"AzureWebJobsSecretStorageKeyVaultName": "my-keyvault",
"AzureWebJobsSecretStorageKeyVaultConnectionString": ""

我还没有在某处找到此记录,但 Azure Functions 是开源的,并且可以在 GitHub 上找到实现此功能的代码

确保访问安全

默认情况下,设置 Function App 时,可以使用 FTP 部署代码,并且接受所有版本的 TLS。

为了确保这一点,我通常会禁用 FTP 访问,因为我不会使用它,而且我通常将我的应用程序配置为需要 TLS 1.2。

FTP 状态可以在配置 -> 常规设置下设置为禁用。

TLS/SSL 设置下可能需要 TLS 1.2。

监控和日志

登录 Applicatin Insights

对于生产,我还想将所有日志和指标发送到 Application Insights。在门户中创建 Function App 时,或者通过将 Application Insights 资源的检测密钥添加到名为 APPINSIGHTS_INSTRUMENTATIONKEY 的应用程序设置中时,可以启用此选项。据我所知,将此密钥存储在 Key Vault 中是行不通的。

审核 Key Vault 访问

除此之外,我还希望对我的 Key Vault 进行一些审核,以便我知道谁访问了我的密钥。在我的以下帖子中,我将通过将审核事件从 Key Vault 发送到我的 Azure 存储帐户以及选择性地使用 Key Vault 上的诊断设置将审核日志发送到现有 Log Analytics 工作区来解决这个问题。

登录到日志分析

还有一个选项(当前处于预览状态)可将诊断日志从 Function App 发送到 Log Analytics。与 Application Insights 相比,我没有发现它能给我带来任何额外的好处,所以我没有使用过它。请在评论中告诉我你是如何使用它的!

为 PowerShell 配置函数应用程序

选择 PowerShell 作为运行时

要将 PowerShell 设置为所选语言运行时,我们只需设置应用程序设置 FUNCTIONS_WORKER_RUNTIME="powershell"。就那么简单!

设置 PowerShell 版本

要运行 PowerShell 7,我们需要运行函数运行时的版本 3。只需设置两个应用程序设置 FUNCTIONS_EXTENSION_VERSION="~3"FUNCTIONS_WORKER_RUNTIME_VERSION="~7" 即可配置此功能。

配置并发

对于并发性,我们需要考虑两个设置。 PowerShell 运行时一次只能处理一个函数的一次调用。如果我想一次发送大量请求或者我希望我的函数相互调用,这是行不通的!

有两种方法可以提高运行 PowerShell 的函数应用程序的并发性。它可以运行 PowerShell 的多个实例,并且可以在每个 PowerShell 实例中运行多个运行空间。由于我的函数通常不是非常占用 CPU 资源,因此我总是将函数设置为在每个 Function App 实例中运行最多 10 个 PowerShell 实例。这是通过设置应用程序设置 FUNCTIONS_WORKER_PROCESS_COUNT=10 来完成的。

如果我的函数确实需要一次处理大量请求,我还可以通过将应用程序设置 PSWorkerInProcConcurrencyUpperBound 设置为大于 1 的值,在每个 PowerShell 进程中运行多个运行空间。这对于例如,当您需要多次调用 ARM api 来启动/停止虚拟机等资源或进行大规模扩展练习时。基本上任何时候我的代码大部分都是空闲的,等待来自 API 等的响应,并发性非常棒!然而! Function 运行时使用的运行空间之间存在一些共享状态,如果遇到奇怪的错误,请尝试将 PSWorkerInProcConcurrencyUpperBound 设置回 1 来进行故障排除

就是这样!我们有一个可以运行 PowerShell 的函数应用程序!

化妆品

为了获得额外清晰的外观和感觉,我还想添加名为 AzureWebJobsDisableHomepage 的应用程序设置,该设置将禁用状态页面,告诉用户“您的 Functions 3.0 应用程序已启动并正在运行”

"AzureWebJobsDisableHomepage": true

为了防止任何人从门户编辑我的 Function App 的代码,我还添加了应用程序设置 FUNCTIONS_APP_EDIT_MODE。根据文档,此设置指示是否启用 Azure 门户中的编辑。有效值为“读写”和“只读”。

"FUNCTIONS_APP_EDIT_MODE": "readonly"

概括

现在我们的 Function App 具有托管身份,所有机密都存储在 Key Vault 中,并且日志正在发送到 Application Insights,事情开始看起来非常好!

我最不想添加到功能应用程序中的事情是身份验证和授权。例如,我可以要求调用我的 Function App 的任何用户都拥有来自 Azure AD 的有效访问令牌。由于这是一个相当大的主题,我将在有关 Azure Functions 和 Azure AD 身份验证的单独帖子中讨论该主题。

[玩转系统] 设计用于生产的 Azure Function App

请继续关注下一部分,我将介绍在 PowerShell 中编写函数时要自定义的内容!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯