Azure 函数 - 触发包含 Azure CLI 命令的 Python 脚本

Posted

技术标签:

【中文标题】Azure 函数 - 触发包含 Azure CLI 命令的 Python 脚本【英文标题】:Azure Function - trigger Python script containing Azure CLI commands 【发布时间】:2019-12-15 17:45:17 【问题描述】:

我有一个用于在 Azure - IaC 中配置基础架构的 Python 脚本。此脚本主要使用 Python SDK,但也运行多个 Azure CLI 命令 - 当我在 Python SDK 中找不到等效命令时,有时需要它。

我的目标是使用 Azure Functions 按需触发此脚本。在本地测试 Azure Function 时,一切正常,因为我的机器上安装了 Azure CLI,但是,当我将其发布到 Azure Functions 时,我会遇到一个错误:/bin/sh: 1: az: not found

下面是我在 Azure 函数中触发的示例 python 函数(请注意,脚本的其余部分工作正常,所以我可以创建 RG、SQL 服务器等,问题只是 az 命令)。我想知道,是否以及如何在 Azure Function 上安装 Azure CLI 以便能够运行 CLI 命令?

这是导致错误的python函数:

    # Loging to AZ
    call("az login --service-principal -u '%s' -p '%s' --tenant '%s'" % (client_id, client_secret, tenant_id), shell=True)
    b2c_id = check_output("az resource show -g '<rg_name>' -n '<b2c_name>' --resource-type 'Microsoft.AzureActiveDirectory/b2cDirectories' --query id --output tsv", shell=True)
    print("The B2C ID is: %s" % b2c_id)```

【问题讨论】:

您是否尝试将azure-cli 添加到您的requirements.txt 中? pypi.org/project/azure-cli 虽然我不确定这是否会有所帮助,因为它可能仍需要安装实际的操作系统包 【参考方案1】:

我尝试使用 HttpTrigger 创建一个简单的 Azure Function 以通过不同方式调用 Azure CLI 工具,但发布后无法在云上运行。

似乎唯一的解决方案是在将所需的包azure-cli 添加到requirements.txt 文件中后,使用命令func azure functionapp publish &lt;your function app name&gt;--build-native-deps 选项将函数发布为docker 映像,如下图错误所示,

恢复依赖项时出错。错误:无法安装 antlr4-python3-runtime-4.7.2 依赖项:不支持没有***的二进制依赖项。 使用 --build-native-deps 选项使用 Docker 容器自动构建和配置依赖项。更多信息请访问https://aka.ms/func-python-publish

由于我本地没有docker工具,我没有成功运行func azure functionapp publish &lt;your function app name&gt; --build-native-deps

同时,运行 Azure CLI 命令并不是使用 Azure CLI 功能的唯一方式。 az 命令只是一个可运行的脚本文件,而不是二进制执行文件。看了azazure-cli包的部分源码后,我想你可以直接通过from azure.cli.core import get_default_cli导入包,并用它来做类似下面代码的操作。

from azure.cli.core import get_default_cli

az_cli = get_default_cli()
exit_code = az_cli.invoke(args)
sys.exit(exit_code)

代码是参考azure-cli包的azure/cli/__main__.py源代码编写的,你可以从你的虚拟环境的lib/python3.x/site-packages路径看到。

希望对你有帮助。

【讨论】:

【参考方案2】:

谢谢,彼得,我最后使用了类似的东西并让它工作了。我有这个函数,它将运行 AZ CLI 命令并在需要时返回结果(例如,如果我需要运行 cli 命令但还存储输出,例如,如果我想知道服务的对象 ID主要是,我可以得到像这个例子中的结果:

def az_cli (args):
    cli = get_default_cli()
    cli.invoke(args)
    if cli.result.result:
        return cli.result.result
    elif cli.result.error:
        raise cli.result.error
    return True

现在,我可以这样调用(client_id 是 ServicePrincipal ID):

ob_id = az_cli(['ad', 'sp', 'show', '--id', client_id])
print(ob_id["objectId"])

【讨论】:

嗨,你能告诉你如何验证到 azure 吗?你是如何通过脚本运行 az login 的?你是如何获取 client_id 的?

以上是关于Azure 函数 - 触发包含 Azure CLI 命令的 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Http 触发器启用 Azure 函数超时

Azure HTTP 触发函数调用返回 417 错误代码

Azure Functions:我可以对 BlobTriggered 函数进行不同的配置吗?

如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应

使用多个 Azure 队列触发单个 Azure 函数

连接属性在 Azure ServiceBus 订阅触发的函数中不起作用