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

时间:2019-08-08 04:53:12

标签: python azure azure-functions azure-cli

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

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

以下是我在Azure函数中触发的示例python函数(请注意,脚本的其余部分工作正常,因此我可以创建RG,SQL Server等,问题仅是az命令)。我想知道,是否以及如何在Azure功能上安装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)```

2 个答案:

答案 0 :(得分:1)

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

似乎唯一的解决方案是在将所需的软件包--build-native-deps添加到func azure functionapp publish <your function app name>文件中之后,使用命令azure-cli的{​​{1}}选项将该功能发布为docker image。如下图所示,

enter image description here

  

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

由于我的本地没有docker工具,所以我没有成功运行requirements.txt

同时,运行Azure CLI命令不是使用Azure CLI功能的唯一方法。 func azure functionapp publish <your function app name> --build-native-deps命令只是一个可运行的脚本文件,而不是二进制执行文件。在我回顾了azaz软件包的一些源代码之后,我认为您可以直接通过azure-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/__main__.py的源代码编写的,您可以从虚拟环境的azure-cli路径中看到它。

希望有帮助。

答案 1 :(得分:0)

谢谢,彼得,我最终使用了类似的方法并使它正常工作。我有此函数,它将在需要时运行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"])