创建 Azure Database for PostgreSQL 的 Azure 服务连接器失败(有解决方案)

这只是一个几乎是个人备忘录。也许对某人有所帮助,但可能性非常低。(实际上,对Microsoft内部技术角色的人可能非常有用)
如果能有所帮助,请务必给个赞,我会很高兴的。

結論是這樣

如果时间紧迫的话,请直接说结论。

事实和原因

    • Azure Spring Apps から Azure Database for PostgreSQL への Service Connector の作成に失敗した

 

    • 原因はログインユーザーが Azure B2B で招待されたユーザーであるため、ログイン時のIDとユーザープリンシパル名が異なること

 

    もし、認証方式として Azure AD 認証を使用していない場合はそれも作成失敗の原因だが、その場合はエラーメッセージが異なる(はず)

避免策略

    1. 如果您能在Azure AD上创建用户,则创建一个新用户

 

    1. 将Azure Spring Apps和Azure Database for PostgreSQL的访问权限授予该用户

 

    1. 在Azure Portal上打开Azure Database for PostgreSQL,选择左侧菜单中的”Authentication”。在右侧屏幕底部,有一个名为”Azure Active Directory Administrator (Azure AD Administrator)”的部分,在那里添加新添加的用户

 

    1. 使用添加的新用户登录Azure CLI,并执行创建Service Connector的命令,应该会成功。这是最简单的方法(应该)。

如果不能创建Azure AD用户,则创建服务主体。在Azure CLI中运行以下命令。SP名称可以自由选择。请将订阅ID替换为实际的ID。

az ad sp create-for-rbac –name –role Contributor –scopes /subscriptions/00000000-0000-0000-0000-000000000000
创建后,记录并保存显示的appId和password
使用已在Azure Portal上注册的Azure AD用户进行Azure AD身份验证登录Azure Database for PostgreSQL。使用psql或pgAdmin等工具。

如果尚未注册Azure AD用户,请在Azure Portal上打开Azure Database for PostgreSQL,并选择左侧菜单中的”Authentication”。在右侧屏幕的底部,有一个名为”Azure Active Directory Administrator (Azure AD Administrator)”的部分,从那里进行注册

在postgres数据库中运行以下SQL语句。请将服务主体创建后显示的appId设置为””。

select * from pgaadauth_create_principal_with_oid(”, ”, ‘service’, true, false);

在Azure CLI中注销并使用服务主体重新登录。appId和password应设置为创建服务主体后显示的内容。

az logout
az login –service-principal -u -p -t

执行创建Service Connector的命令,应该会成功
在删除用于操作之前,建议删除Azure Database for PostgreSQL中用于Azure AD身份验证的登录用户。服务主体的appId就是用户名,所以只需将其删除即可(如果使用pgAdmin,右键单击->删除即可简单完成)

Azure 服务连接器是什么?

 

要理解Azure Service Connector,实际上必须了解Managed Id。Azure拥有一个叫做Managed Id的资源。这是一种机制,使得在从Azure内部的资源A连接到资源B时,可以无需在源代码中直接使用连接字符串或密钥来访问资源B。

托管身份(Managed ID)是特定资源的关联对象并在创建时生成(对于系统托管身份)。如果要从资源A访问资源B,则通过启用资源A的托管身份来创建托管身份。然后,资源B将授予该托管身份对自身的访问权限。

然后,使用资源A上的关联的Managed Id,可以访问资源B。

尽管通过文字来解释,可能还是有点难理解。不过,大概可以传达出一些好像很方便的信息。而且,它是一个非常安全的机制,因为不直接在源代码中处理连接字符串和密钥。所以,我希望大家能够使用这个被称为“托管身份”的机制,虽然机制和构建都有点复杂,但作为替代,Service Connector就会一次性为大家构建好。

在Azure Spring Apps中创建服务器连接器失败。

截至2023年8月,Service Connector仅支持以下3个Azure资源。

    • Azure App Service

 

    • Azure Container Apps

 

    Azure Spring Apps

这次我尝试使用Azure Spring Apps创建服务连接器失败了。这次的原因明确,是Azure AD B2B,但真正的原因是Azure CLI命令的错误。

目前的情况

不管是否使用Azure Spring Apps,如果要在Azure门户中创建服务连接器,则最后会创建一个与其他情况不同的命令,该命令需要在Cloud Shell或本地环境中执行Azure CLI命令。

image.png

然而,无论是在Cloud Shell环境还是本地环境的Azure CLI,实际执行该命令都会出现错误。

在我的情况下,我试图从Azure Spring Apps创建一个连接到Azure Database for PostgreSQL的Service Connector,但当我运行Azure CLI命令时,无法连接到数据库。尽管我在数据库的防火墙中注册了IP地址并尝试重新连接,但仍无法连接,最终遇到错误,并结束了命令运行。

因为某种原因

很明显,原因是当在使用Azure CLI时,登录到Azure的用户无法通过Azure AD验证连接到Azure Database for PostgreSQL。然而,Azure Database for PostgreSQL已经配置为可以使用Azure AD进行验证,并且管理员自己也注册了Azure AD用户。那么为什么无法连接到数据库呢?

总结起来,这是一个错误。当使用Azure CLI登录的用户运行Service Connector创建命令时,该命令似乎尝试使用登录用户的登录ID连接到Azure Database for PostgreSQL。然而,Azure Database for PostgreSQL中创建的Azure AD认证用户的用户名不是登录ID,而是用户主体名称。

登录 ID 是以电子邮件地址的相同“Alias@域名”形式呈现,但用户主体名不一定与登录 ID 相同。此外,在 Azure AD B2B 中被邀请的用户的登录 ID 和用户主体名必定不同。因此,由于这个原因,在被邀请的 B2B 用户中创建服务连接器的命令会失败。

如何应对?

只要Azure AD管理员注册的用户的登录ID和用户主体名称相匹配就可以了。所以,如果你可以在Azure AD中创建用户,那将是最简单和最快的方式。创建用户,授予Azure权限,并将其注册为Azure Database for PostgreSQL的Azure AD管理员即可。然后,只需使用该用户在Azure CLI中登录,并运行创建服务连接器的Azure CLI命令即可。

问题是如果没有在Azure AD上创建用户的权限。在这种情况下,您需要创建一个服务主体,并使用SQL手动将其注册为Azure Database for PostgreSQL的Azure AD管理员。

创建服务主体

使用Azure CLI执行以下命令。可以自由选择SP名称。请将订阅ID替换为您自己的ID。请记下创建后显示的 appId 和 password。

az ad sp create-for-rbac --name <your-sp-name> --role Contributor --scopes /subscriptions/00000000-0000-0000-0000-000000000000

在Azure Database for PostgreSQL中,创建一个Azure AD管理用户作为服务主体。

这是一个非常重要的任务。因为这里的方法和解释可能在其他地方都找不到。通过尝试和错误才能找到正确答案,真是一段艰辛的过程!

首先,请使用已在Azure门户中注册的Azure AD用户通过Azure AD身份验证登录到Azure Database for PostgreSQL。我们推荐使用pgAdmin。如果要使用Azure AD身份验证登录,则需要获取AccessToken。有关详细方法,请查阅Microsoft官方页面。

一旦成功登录后,将以下 SQL 语句在 postgres 数据库中执行。请将 appId 替换为在创建服务主体后显示的真实 appId。(请删除尖括号<>的前后内容)

select * from pgaadauth_create_principal_with_oid('<appId>', '<appId>', 'service', true, false);

尽管如此,如果选择这个选项,在流程中,Azure AD认证的用户名将被创建为appId(ClientId)。这里特别要注意的是,正是因为Service Connector在连接Azure Database for PostgreSQL时使用appId作为用户名的原因。

发送Service Connector创建命令

登出 Azure CLI,然后使用已准备好的服务主体重新登录。请使用在创建服务主体后显示的 appId 和 password 进行设置。

az logout
az login  --service-principal -u <appId> -p <password> -t <tenantId>

一旦成功登录后,打开Azure门户,找到Azure Database for PostgreSQL,并展示创建Service Connector的面板,获取最后一个Azure CLI命令。在已登录此服务主体的状态下执行该命令,即可顺利创建Service Connector。

4. 整理收拾

在删除用于作业的服务主体之前,请先删除在Azure Database for PostgreSQL中为Azure AD身份验证创建的登录用户。由于服务主体的appId就是用户名,所以只需要删除它即可。在pgAdmin中,只需右键单击-> 删除就可以轻松删除。

GitHub问题

不清楚什么时候会有回应,但总的来说,我提出了问题。

 

广告
将在 10 秒后关闭
bannerAds