azure 为物联网中心创建服务主体

azure create service-principal for iot hub

我在 Azure Iot Hubscope 下尝试通过 azure cli 创建 service principal 时收到 ERROR: The request did not have a subscription or a valid tenant level resource provider.。我正在使用 CLI (bash),但 python 也足够了。

如末尾所示,我拥有在此订阅中创建 sp 的正确凭据和权利,并且我拥有相关物联网中心的所有者权利。

万一我错过了一个更好的方法来完成这个,这里是上下文:我们需要验证一个作业,该作业在新设备被刷新后立即自动注册,然后再被运走以插入in。这会做很多事情来定制闪存文件系统(例如添加唯一的设备主机名和本地密码);最后它需要向 IotHub 注册设备。

az iot hub device-identity create --device-id [device id] --hub-name [hub name] --edge-enabled

在我的用户权限下,我可以 az login 并完成所有这些 - 但它需要 运行 在没有交互式登录的自动化作业中。我相信 service principal 实现此目的的方法 (?)。

因此,尝试创建主体 I 运行:

# the following pulls a valid(looking) `"/subscriptions/NAME/resourceGroups/THEGROUP/providers/Microsoft.Devices/IotHubs/THEHUB"`
IOTHUB_ID="$(az iot hub show --name TheHubName --query id)

az ad sp create-for-rbac --name http://my-iothub-serviceprincipal --scopes $IOTHUB_ID --role contributor --query password --output tsv

失败并显示以下内容(注意:贡献者范围太广,稍后将成为自定义角色):

WARNING:   Role assignment creation failed.
ERROR: The request did not have a subscription or a valid tenant level resource provider.

作为确保我拥有正确的 az login 和其他本地状态的测试,以下针对 Azure ACR scope 的类似命令会成功 ,在门户中可以看到一个新的服务主体。

ACR_ID="$(az iot hub show --name TheAcrName --query id)
az ad sp create-for-rbac --name http://acr-service-principal-foobar --scopes $ACR_ID --role acrpull --query password --output tsv

这是由 azure CLI 中的错误引起的。 az iot hub show 正在返回一个引用不正确的字符串; az acr show 例如没有。

az iot hub show --name your-iothub-name --query id returns 像下面这样的字符串。 两个引用 " 都是原文

'"/subscriptions/guid/.../IotHubs/your-iothub-name"'

az acr show --name your-acr-name --query id returns 相同的格式字符串,但没有额外的 ' 引号。

"/subscriptions/.../registries/your-acr-name"

az iot hub device-identity create 无法处理 '"..."' (可以理解)但不幸的是并没有完全失败,这使得引用混合起来有点难以追踪一点脚本输出。