当前位置: 首页 > 知识库问答 >
问题:

更新IoT设备配置时,谷歌云功能错误(权限被拒绝)

慕容光启
2023-03-14

所以,我需要做的基本上是,当我在谷歌云Firestore中更改一个值时,它会触发一个云功能,将该值发送到一个物联网设备。以下是我所做的:

  1. 我为此特定任务创建了一个服务帐户。我授予它以下权限:
    1. cloudiot.admin(用于管理Google Cloud IoT设备)
    2. Firebase.sdkadminServiceAgent(用于管理Firestore)
    3. 所有者(临时所有者,用于调试)
    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    const iot = require("@google-cloud/iot");
    
    const app = admin.initializeApp();
    const firestore = app.firestore();
    const client = new iot.v1.DeviceManagerClient();
    
    firestore.settings({ timestampsInSnapshots: true });
    
    exports.deviceConfigs = functions.firestore
      .document("device-configs/{device}")
      .onWrite(async (change, context) => {
        const deviceId = context.params.device;
    
        if (!change.after.exists) {
          functions.logger.error(`Device configurations removed for ${deviceId}`);
          return;
        }
        const config = change.after.data();
    
        const formattedName = client.devicePath(
          process.env.GCLOUD_PROJECT,
          functions.config().iot.core.region,
          functions.config().iot.core.registry,
          deviceId
        );
    
        const request = {
          name: formattedName,
          binaryData: Buffer.from(JSON.stringify(config)).toString("base64"),
        };  
    
        await client.modifyCloudToDeviceConfig(request);
      });
    

    因此,每当我在集合“device-configs”中写入文档时,该功能将被触发,并向IoT设备发送一个自动请求,通知配置更改。它被认证是因为它是直接从google后端运行的,因为它是一个云功能,所以它应该被认证为我创建的服务帐户。

    然而,每次它被触发时,它在最后一行失败。错误如下:

    错误:7 permission_dention:调用方在object没有权限。callerrorfromstatus(/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:26)在object.onreceivestatus(/workspace/node_modules/@grpc/grpc-js/build/src/client.js:176:52)在object.build/src/client-interceptors.js:299:181)在/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:145:78在processTicksAndRejections(internal/process/task_queues.js:79:11)

    我真的不知道该怎么办了。我尝试在模拟器上本地运行它,使用服务密钥作为身份验证,但它仍然返回相同的错误。我试图找到一种方法来记录Google Cloud收到的所有api请求,以查看头上是否存在身份验证,但我找不到这样做的方法。

    好吧,我不知道这是否有帮助,但我还有另一个云功能,它监听PubSub主题的新消息,并相应地更新Firestore数据库。这个功能运行良好。代码如下:

    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    const iot = require("@google-cloud/iot");
    
    const app = admin.initializeApp();
    const firestore = app.firestore();
    const client = new iot.v1.DeviceManagerClient();
    
    firestore.settings({ timestampsInSnapshots: true });
    
    exports.deviceState = functions.pubsub
      .topic("device-events")
      .onPublish(async (message) => {
        functions.logger.warn("Mensagem:", { message });
        const deviceId = message.attributes.deviceId;
        const deviceRef = firestore.doc(`device-state/${deviceId}`);
    
        try {
          await deviceRef.update({
            state: message.json,
            online: true,
          });
          functions.logger.log("Device updated successfully");
        } catch (error) {
          functions.logger.error(error);
        }
      });
    

共有1个答案

贺博厚
2023-03-14

基本上,确保tripple、quadrupple检查项目和注册表名称!逐个字符检查。这件事花了我整整4天的时间才解决。

 类似资料:
  • 我正在尝试Google Cloud Vision API(测试版),它返回“权限被拒绝”消息。但该项目启用了“云视觉API”。感谢您的帮助。 谷歌API浏览器中的错误详细信息

  • 当尝试以构建容器映像时,我得到一个: 错误:(gcloud.builds.submit)HTTPError 403:权限不足 我正在从一个compute VM实例中进行尝试,在该实例中,使用服务帐户设置了gcloud。

  • 我创建了一个服务帐户,并为其分配了访问云功能的权限: gcloud beta函数add-iam-policy-binding MyFunction--member=serviceaccount:cf-access@my-project.iam.gserviceaccount.com--role=roles/cloudfunctions.admin 产出: 现在,我下载了服务帐户json文件。 所以

  • 我不能让谷歌云功能运行超过60秒,即使超时设置为540秒!!有什么建议吗? 我将部署时的超时标志设置为--timeout=540,并且我知道该设置会通过,因为在GCP WEB UI中会显示540秒的超时设置。我还尝试通过GCP WEB UI手动编辑超时至540。但无论如何,我还是在大约62000毫秒后超过了最后期限。 我已经尝试了pub/sub和https方法作为func触发器,但是仍然在60度左

  • 问题内容: 我运行 npm install lodash, 但它抛出 错误:EACCES:权限被拒绝 错误。我知道这是权限问题,但据我所知,本地安装节点模块不需要sudo权限。如果我使用sudo运行它,它将安装在〜/ node_modules文件夹中。 drwxrwxr-x 是现有文件夹的文件许可权。我不知道可能出了什么问题。 下面是错误消息。 问题答案: 使用 npm init 创建 packa

  • 我运行npm install lodash,但它抛出错误:EACCES:权限被拒绝错误。我知道这是权限问题,但据我所知,在本地安装节点模块不需要sudo权限。如果我用sudo运行它,它会安装在~/node\u modules文件夹中。drwxrwxr-x是现有文件夹的文件权限。我不知道可能出了什么问题。 下面是错误消息。