【问题标题】:Cloud Task not executing Cloud Function云任务未执行云功能
【发布时间】:2021-09-10 12:13:57
【问题描述】:

我想为我的 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 页面并检查了这些服务帐户的权限:

  1. 默认服务帐号:

  1. 我创建的服务帐号:

当函数触发时,两者都返回上面显示的PERMISSION_DENIEDUNAUTHENTICATED 错误:

知道问题是什么吗?我几乎什么都试过了。

【问题讨论】:

    标签: google-cloud-platform google-cloud-functions google-iam google-tasks-api


    【解决方案1】:

    您忘记将受众放在您的 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           },
    ...
    ...
    
    

    【讨论】:

    • 认为这是可选的,但确实解决了问题。谢谢!
    • 基于此doc,我认为audience 不是必需的,但事实证明添加它为我解决了问题。
    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 2020-04-25
    • 2019-10-22
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2018-06-15
    • 2019-12-23
    相关资源
    最近更新 更多