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);
对于我正在进行的项目,我的任务是创建一个测试应用程序,该应用程序使用 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);