具有非匿名 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 函数的主要内容,如果未能解决你的问题,请参考以下文章