Cloud Task 不执行 Cloud Function
Cloud Task not executing Cloud Function
我想为我的 Cloud Function 增加安全性,所以我删除了调用它的 allUsers
访问权限 - 所以我只能从我的 GCP 中的服务帐户调用它。
所以我已经按照 GCP docs exactly:
中的教程进行操作
云函数
async function createTask(taskName, functionToFire, payload, fireAt){
const tasksClient = new CloudTasksClient()
const projectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId
console.log(`${taskName} will fire ${functionToFire} at ${fireAt}...`)
const location = 'us-central1'
const queuePath = tasksClient.queuePath(projectId, location, taskName)
const url = `https://us-central1-${PROJECT_ID}.cloudfunctions.net/task/${functionToFire}`
const serviceAccountEmail = 'cloud-tasks@${PROJECT_ID}.iam.gserviceaccount.com';
// const sendAt = Date.now() / 1000 + 10 // plus 10 seconds of current epoch
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail
},
body: Buffer.from(JSON.stringify(payload)).toString('base64'),
headers: {
'Content-Type': 'application/json',
},
},
scheduleTime: {
seconds: (fireAt / 1000) // Convert millis to seconds
}
}
await tasksClient.createTask({ parent: queuePath, task })
return 200;
}
云函数权限
服务帐户已被授予对名为 task
的特定功能的以下权限:
- 云功能管理员
- 云函数调用程序
- 云函数服务代理
然而,当任务实际触发时,它给出了这个错误:
PERMISSION_DENIED(7): HTTP status code 403
我也遇到过以下错误:
UNAUTHENTICATED(16): HTTP status code 401
我已经使用 2 个服务帐户进行了测试 - 推荐的使用文档的帐户(如上所示)以及我专门为此创建的服务帐户 cloud-tasks@${PROJECT_ID}.iam.gserviceaccount.com
。
我还去了通用 IAM 页面并检查了这些服务帐户的权限:
- 默认服务帐户:
- 我创建的服务帐户:
当函数触发时,return 和 PERMISSION_DENIED
或 UNAUTHENTICATED
错误如上所示:
知道问题出在哪里吗?我几乎什么都试过了。
您忘记将受众放入您的 OIDC 令牌定义中。您可以在 nodeJS documentation
中找到对象定义
...
...
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail: serviceAccountEmail
//Audience is the raw URL, without extra path or query parameter
audience: https://us-central1-${PROJECT_ID}.cloudfunctions.net/task },
...
...
我想为我的 Cloud Function 增加安全性,所以我删除了调用它的 allUsers
访问权限 - 所以我只能从我的 GCP 中的服务帐户调用它。
所以我已经按照 GCP docs exactly:
中的教程进行操作云函数
async function createTask(taskName, functionToFire, payload, fireAt){
const tasksClient = new CloudTasksClient()
const projectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId
console.log(`${taskName} will fire ${functionToFire} at ${fireAt}...`)
const location = 'us-central1'
const queuePath = tasksClient.queuePath(projectId, location, taskName)
const url = `https://us-central1-${PROJECT_ID}.cloudfunctions.net/task/${functionToFire}`
const serviceAccountEmail = 'cloud-tasks@${PROJECT_ID}.iam.gserviceaccount.com';
// const sendAt = Date.now() / 1000 + 10 // plus 10 seconds of current epoch
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail
},
body: Buffer.from(JSON.stringify(payload)).toString('base64'),
headers: {
'Content-Type': 'application/json',
},
},
scheduleTime: {
seconds: (fireAt / 1000) // Convert millis to seconds
}
}
await tasksClient.createTask({ parent: queuePath, task })
return 200;
}
云函数权限
服务帐户已被授予对名为 task
的特定功能的以下权限:
- 云功能管理员
- 云函数调用程序
- 云函数服务代理
然而,当任务实际触发时,它给出了这个错误:
PERMISSION_DENIED(7): HTTP status code 403
我也遇到过以下错误:
UNAUTHENTICATED(16): HTTP status code 401
我已经使用 2 个服务帐户进行了测试 - 推荐的使用文档的帐户(如上所示)以及我专门为此创建的服务帐户 cloud-tasks@${PROJECT_ID}.iam.gserviceaccount.com
。
我还去了通用 IAM 页面并检查了这些服务帐户的权限:
- 默认服务帐户:
- 我创建的服务帐户:
当函数触发时,return 和 PERMISSION_DENIED
或 UNAUTHENTICATED
错误如上所示:
知道问题出在哪里吗?我几乎什么都试过了。
您忘记将受众放入您的 OIDC 令牌定义中。您可以在 nodeJS documentation
中找到对象定义...
...
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail: serviceAccountEmail
//Audience is the raw URL, without extra path or query parameter
audience: https://us-central1-${PROJECT_ID}.cloudfunctions.net/task },
...
...