Http 在 Docker 中使用非匿名 authLevel 触发 Azure 函数

Http Trigger Azure Function in Docker with non anonymous authLevel

我正在 Docker 容器中使用 Http Triggered Azure Functions。到目前为止,我找到的有关设置的所有教程和指南都将 Azure Function 配置为 authLevel" 设置为 anonymous

仔细阅读 this blog 后,似乎还可以配置其他身份验证级别(尽管很棘手)。不幸的是,承诺的后续博文尚未(尚未)撰写。

任何人都可以帮助我阐明我将如何着手进行设置吗?

要控制函数主机在启动时使用的主密钥 - 而不是生成随机密钥 - 准备我们自己的 host_secrets.json 文件,如

{
    "masterKey": {
        "name": "master",
        "value": "asGmO6TCW/t42krL9CljNod3uG9aji4mJsQ7==",
        "encrypted": false
    },
    "functionKeys": [{
        "name": "default",
        "value": "asGmO6TCW/t42krL9CljNod3uG9aji4mJsQ7==",
        "encrypted": false
    }]
}

然后将此文件放入Function宿主(Dockerfile)指定的secrets文件夹中:

对于 V1 函数(假设您的运行时根是 C:\WebHost):

...
ADD host_secrets.json C:\WebHost\SiteExtensions\Functions\App_Data\Secrets\host.json
...

对于 V2 函数(假设您的运行时根目录是 C:\runtime):

...
ADD host_secret.json C:\runtime\Secrets\host.json

USER ContainerAdministrator
RUN icacls "c:\runtime\secrets" /t /grant Users:M
USER ContainerUser

ENV AzureWebJobsSecretStorageType=files
...

功能键可用于调用受保护的功能,如.../api/myfunction?code=asGmO6TCW/t42krL9CljNod3uG9aji4mJsQ7==

主密钥可用于调用函数Admin API and Key management API

my blog 中,我描述了将 V1 和后来的 V2 函数运行时引入 Docker 容器并将它们托管在 Service Fabric 中的整个过程。

用于 Windows 上的 V3 函数:

ENV FUNCTIONS_SECRETS_PATH=C:\Secrets
ENV AzureWebJobsSecretStorageType=Files
ADD host_secrets.json C:\Secrets\host.json

用于 Linux 上的 V3 函数:

RUN mkdir /etc/secrets/
ENV FUNCTIONS_SECRETS_PATH=/etc/secrets
ENV AzureWebJobsSecretStorageType=Files
ADD host_secrets.json /etc/secrets/host.json

我找到了适合我的解决方案,尽管这个 post 已经过时了。我的目标是 运行 在 Docker 容器中使用 function authLevel 的 Http Trigger Azure Function。为此,我使用以下 Docker 图片:Azure Functions Python 来自 Docker hub.

在存储库准备就绪后,我将创建的容器推送到 Azure 容器注册表。我想通过 Azure Function 运行 我的容器无服务器。所以我按照 following post 并在我的 Azure 门户中创建了一个新的 Azure Functions。

因此,容器内容对应一个Azure Function Image,容器本身的运行是通过一个Azure Function通过Azure实现的。这种方式可能并不总是流行,但提供了在那里托管容器的优势。可以通过 Deployment Center.

从 Azure 容器注册表中轻松选择容器

要通过 function authLevel 访问容器映像,Azure Function ~3 无法创建主机密钥,因为这是在容器内管理的。所以我进行了如下操作:

  1. 自定义我的 function.json
  "authLevel": "function",
  "type": "httpTrigger",
  1. 提供一个存储帐户,以便 Azure 函数可以在那里获取配置。在那里创建一个新容器。

azure-webjobs-secrets

  1. 使用您的 Azure 函数的名称在容器内创建一个目录。

my-function-name

  1. A host.json 现在可以存储在目录中。这包含 master 密钥。

{"masterKey": { "name": "master", "value": "myprivatekey", "encrypted": false }, "functionKeys": [ ] }

  1. 现在必须配置 Azure Functions 才能访问存储帐户。必须将以下值添加到配置中。

AzureWebJobsStorage = Storage Account Connection String

WEBSITE_CONTENTAZUREFILECONNECTIONSTRING = Storage Account Connection String

WEBSITE_CONTENTSHARE = my-function-name

从现在开始,存储的 Azure Functions 主密钥可用。因此,容器 API 通过 authLevel function 配置,并且只能使用相应的密钥访问。

URL: https://my-function-name.azurewebsites.net/api/helloworld

HEADER: x-functions-key = myprivatekey