具有非匿名 authLevel 的 Docker 中的 Http 触发 Azure 函数

Posted

技术标签:

【中文标题】具有非匿名 authLevel 的 Docker 中的 Http 触发 Azure 函数【英文标题】:Http Trigger Azure Function in Docker with non anonymous authLevel 【发布时间】:2019-04-07 04:10:06 【问题描述】:

我正在使用 Docker 容器中的 Http 触发 Azure 函数。到目前为止,我找到的所有设置此设置的教程和指南都将 Azure 函数配置为 authLevel" 设置为 anonymous

仔细阅读this blog 之后,似乎也可以(虽然很棘手)配置其他身份验证级别。不幸的是,承诺的后续博客文章还没有(还)被写出来。

谁能帮我澄清一下我将如何进行和设置?

【问题讨论】:

他们似乎在 Github github.com/Azure/azure-functions-core-tools/issues/29有一个积压项目和一个未解决的问题。 感谢您的反馈,尽管情况并不完全相同。在 Docker 容器中运行时,授权部分起作用。当我将 Http 触发器配置为 authLevel 设置为 function 并调用该函数时,我收到 401 错误。这意味着我需要提供正确的密钥,但问题是如何访问密钥。 Admin API 也是如此。它在那里,但我无法访问它,因为我不知道如何获取 OAuth 令牌。 对不起,我错过了您问题的重点。所以你想设置/获取功能键吗? 秘密应该驻留在容器中函数旁边的文件系统中的 json 文件中。有一篇关于秘密轮换主题的帖子提到了细节。 fabriccontroller.net/… @SebastianAchatz,再次感谢您的回复。当发布到 Azure 时,我确实看到了提到的 json 文件。但是它们只包含一个时间戳(很可能是在创建它们时)。在我的 docker 容器中,这些 json 文件丢失了,如果我只知道要放入它们的确切内容,可能会添加一个(我猜只有时间戳不会削减它,即使密钥将是加密的时间戳的表示,我不知道使用了哪种加密技术)。所以这肯定给了我一些额外的见解,但还没有解决我的问题。 【参考方案1】:

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


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

然后将此文件输入到 Function 主机 (Dockerfile) 的指定机密文件夹中:

对于 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 和Key management API。

在 my blog 中,我描述了将 V1 和更高版本的 V2 Functions 运行时引入 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

【讨论】:

您能否将信息放在答案本身中,而不仅仅是引用您自己的博客? 感谢您的回答,给 +1。是否有任何与 host_secret.json 相关的 MS 文档? @OSP 我猜不是因为这个文件只是函数主机的内部文件 抱歉,您如何将其应用于 Linux 容器? @Panzercrisis 我附上了 2 个示例,我们现在如何在 Windows 和 Linux 上为 V3 执行此操作【参考方案2】:

我找到了适合我的解决方案,尽管这篇文章已经过时了。我的目标是使用 function authLevel 在 Docker 容器中运行 Http Trigger Azure Function。为此,我使用以下 Docker 映像:来自 Docker 中心的Azure Functions Python。

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

因此,容器内容对应一个Azure Function Image,容器本身的操作是通过Azure Function通过Azure实现的。这种方式可能并不总是很受欢迎,但提供了在那里托管容器的优势。可以通过 Deployment Center 从 Azure 容器注册表轻松选择容器。

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

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

azure-webjobs-secrets

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

我的功能名称

    现在可以将 host.json 存储在目录中。这包含 master 键。

“主密钥”: “名称”:“主人”, “价值”:“我的私钥”, "加密": false , "functionKeys": []

    现在必须配置 Azure Function 以访问存储帐户。必须将以下值添加到配置中。

AzureWebJobsStorage = 存储帐户连接字符串

WEBSITE_CONTENTAZUREFILECONNECTIONSTRING = 存储帐户连接字符串

WEBSITE_CONTENTSHARE = 我的功能名称

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

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

标题: x-functions-key = myprivatekey

【讨论】:

以上是关于具有非匿名 authLevel 的 Docker 中的 Http 触发 Azure 函数的主要内容,如果未能解决你的问题,请参考以下文章

Docker具名挂载和匿名挂载

使用非root用户时,Docker节点权限被拒绝

如何在 Ejabberd 中创建非匿名房间 [关闭]

docker容器数据卷 - 具名挂载和匿名挂载

docker容器数据卷 - 具名挂载和匿名挂载

静态非静态内部类匿名内部类局部内部类