使用 GCP 资源管理器创建项目的权限被拒绝 API
Permission denied creating project with GCP resource manager API
我正在尝试通过资源管理器 API 从 google 云函数以编程方式创建项目,如下所示:
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;
}
出于测试目的,我已将组织管理员角色添加到默认服务帐户。我在 IAM 中看不到项目创建者角色:
调用 API 时出现以下错误:
{"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}
如何才能成功访问此资源?
当然,它给了你修改自己权限的能力,你可以在GCP documentation中验证,Organization Admin
角色不允许创建新项目。
如您所述,为此目的,服务帐户应被授予 Project Creator
(roles/resourcemanager.projectCreator
) 角色。
根据您的屏幕截图,您正尝试在项目级别授予此权限,但请注意,此角色只能在组织和文件夹级别授予。这就是为什么 Google 云 Web 控制台中的下拉菜单没有为您提供 Project Creator
选项的原因。
如果您对文件夹或组织具有必要的权限,请尝试在相应级别分配该角色。
我正在尝试通过资源管理器 API 从 google 云函数以编程方式创建项目,如下所示:
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;
}
出于测试目的,我已将组织管理员角色添加到默认服务帐户。我在 IAM 中看不到项目创建者角色:
调用 API 时出现以下错误:
{"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}
如何才能成功访问此资源?
当然,它给了你修改自己权限的能力,你可以在GCP documentation中验证,Organization Admin
角色不允许创建新项目。
如您所述,为此目的,服务帐户应被授予 Project Creator
(roles/resourcemanager.projectCreator
) 角色。
根据您的屏幕截图,您正尝试在项目级别授予此权限,但请注意,此角色只能在组织和文件夹级别授予。这就是为什么 Google 云 Web 控制台中的下拉菜单没有为您提供 Project Creator
选项的原因。
如果您对文件夹或组织具有必要的权限,请尝试在相应级别分配该角色。