使用 GCP 资源管理器 API 创建项目的权限被拒绝

Oll*_*lie 1 google-cloud-platform google-cloud-functions google-cloud-resource-manager

我正在尝试通过谷歌云功能的资源管理器 API 以编程方式创建项目,如下所示:

exports.createProjectAsync = async (projectId, projectName) => {
    const scopes = "https://www.googleapis.com/auth/cloud-platform"
    const url = `http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=${scopes}`
    const tokenResult = await fetch(url, {
        headers: {
            "Metadata-Flavor": "Google"
        },
    });
    const tokenStatus = tokenResult.status;
    functions.logger.log(`Call to get token has status ${tokenStatus}`);
    const tokenData = await tokenResult.json()
    functions.logger.log(`Call to get token has data ${JSON.stringify(tokenData)}`);
    const accessToken = tokenData.access_token;
    if (accessToken === null) {
        throw new Error(`Failed to retrieve access token`);
    }
    const headers = {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${accessToken}`
    };
    const payload = {
        "projectId": projectId,
        "name": projectName,
        "parent": {
            "type": "folder",
            "id": FOLDER_NUMBER
        }
    };
    const projectsCreateUrl = `https://cloudresourcemanager.googleapis.com/v1/projects/`
    const result = await fetch(projectsCreateUrl, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify(payload)
    });
    const status = result.status;
    functions.logger.log(`Call to create project returned status ${status}`);
    const data = await result.json()
    functions.logger.log(`data: ${JSON.stringify(data)}`);
    return data;
}
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我已将组织管理员角色添加到默认服务帐户。我在 IAM 中看不到项目创建者角色:

在此输入图像描述

调用 API 时出现以下错误:

{"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}

如何才能成功访问该资源?

jcc*_*ero 6

当然,它使您能够修改自己的权限,正如您可以在GCP 文档中验证的那样,该Organization Admin角色不允许创建新项目。

正如您所指出的,为此目的,服务帐户应被授予Project Creator( roles/resourcemanager.projectCreator) 角色。

根据您的屏幕截图,您正在尝试在项目级别授予此权限,但请注意,只能在组织和文件夹级别授予此角色。这就是 Google Cloud Web 控制台中的下拉菜单不向您提供该选项的原因Project Creator

如果您对文件夹或组织拥有必要的权限,请尝试在相应级别分配该角色。

  • 我的理解是服务帐户存在于项目级别。是否可以将 Roles/resourcemanager.projectCreator 分配给组织/文件夹级别的服务帐户?我不知道如何在 GCP 控制台中执行此操作。我有完全访问权限。 (2认同)
  • 你是对的,服务帐户是在项目级别创建的,但您也可以在组织或文件夹级别向它们分配权限。请复制您要授予项目创建者角色的服务帐户的 ID(电子邮件地址),选择组织或文件夹,然后从 IAM 菜单中通过粘贴来添加服务帐户(您可能可以通过以下方式搜索)出色地)。你应该有能力做到这一点。至少它应该适用于用户定义的服务帐户。请问你可以试试吗?非常好的观点@Ollie。 (2认同)