GCP API - 确定创建资源实例时使用的角色

GCP API - Determining what role an resource instance has been created with

对于我正在进行的项目,我的任务是创建一个测试应用程序,该应用程序使用 Terraform 创建资源实例,然后测试它是否已正确创建。目的是通过验证所创建资源的某些特征来测试 Terraform 脚本结果。这是大纲。

对于其中的几个脚本,资源被分配了一个角色。它可以是 PubSub 订阅、DataCatalog 等。

Spanner 数据库的示例 Terraform 代码分配 roles/spanner.databaseAdmin:

resource "google_spanner_database_iam_member" "user_database_admin" {
  for_each = toset(var.iam_user_database_admins)
  project = var.project
  instance = var.instance_id
  database = google_spanner_database.spanner_database.name
  role       = "roles/spanner.databaseAdmin"
  member     =  "user:${each.key}"
}

所以我的问题是:有没有办法使用 .NET GCP API 进行调用以确定角色已分配?我可以通过客户端对象的 TestIamPermissions 方法测试权限,这就是我目前正在做的事情。但这给了我一个有时很长的可能权限列表。有没有办法说“这个扳手数据库是否分配了 roles/spanner.databaseAdmin?”

这是一个代码测试 PubSub 订阅权限的示例:

TestIamPermissionsRequest subscriptionRequest = new TestIamPermissionsRequest
{
    ResourceAsResourceName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId),
    Permissions = {
        "pubsub.subscriptions.get",
        "pubsub.subscriptions.delete",
        "pubsub.subscriptions.update"
    }
};
TestIamPermissionsResponse subscriptionResponse = publisher.TestIamPermissions(subscriptionRequest);

似乎应该有一种更简洁的方法来执行此操作,但作为 GCP 的新手,我还没有找到方法。欢迎提出建议。

我想我应该用我最终发现的来结束这个问题。正确的问题不是分配给资源实例的角色是什么角色,而是允许哪些用户使用该资源以及使用什么角色。

正确的调用是 GetIamPolicy,它在我一直使用的所有资源的 API 中可用。问题是由于没有用户帐户被分配给资源,我什么也没看到。我更新了 Terraform 脚本以将用户分配给具有所需角色的资源。调用 GetIamPolicy 时,它 returns 绑定中的一个数组,其中列出了分配的角色和用户。这是我需要的信息。没有必要继续使用 TestIamPermissions。

这是我使用它的一个例子:

            bool roleFound = false;
            bool userFound = false;
            bool exception = false;
            try
            {
                Policy policyResponse = Client.GetIamPolicy(Resource);
                var bindings = policyResponse.Bindings;
                foreach (var item in bindings)
                {
                    if (AcceptedRoles.Contains(item.Role))
                        roleFound = true;

                    foreach (var user in item.Members)
                    {
                        string testUser = user;
                        if (user.Substring(0, 5) == "user:")
                        {
                            testUser = user.Substring(5);
                        }
                        else if (user.Substring(0, 6) == "group:")
                        {
                            testUser = user.Substring(6);
                        }
                        if (Settings.UserTestList.Contains(testUser))
                            userFound = true;
                    }
                }
            }
            catch (Grpc.Core.RpcException)
            {
                exception = true;
            }

            Assert.True(roleFound);
            Assert.True(userFound);
            Assert.False(exception);