如何访问 Cloud Function node.js10 中的 Secret Manager?

Posted

技术标签:

【中文标题】如何访问 Cloud Function node.js10 中的 Secret Manager?【英文标题】:How to access Secret Manager in Cloud Function node.js10? 【发布时间】:2020-12-24 12:20:09 【问题描述】:

我已经为此工作了 2 天,对进度感到非常沮丧,非常感谢任何关于我的理解/代码/方法可能有问题的指导!

我正在尝试使用 node.js 从秘密管理器获取版本值,下面的脚本在 GCE 上运行良好,但每当我在 Cloud 函数上运行它时它都会失败。

// My script on GCE, it works fine
const  SecretManagerServiceClient  = require('@google-cloud/secret-manager');
const secretManagerServiceClient = new SecretManagerServiceClient();
const name = 'projects/moonhome/secrets/moonFirstSecret/versions/latest';

testSecretManager = async () => 
  const [version] = await secretManagerServiceClient.accessSecretVersion( name );
  const payload = version.payload.data.toString();
  console.debug(`Payload: $payload`);
;
testSecretManager();

// My index.js on Cloud Function
const  SecretManagerServiceClient  = require('@google-cloud/secret-manager');
const secretManagerServiceClient = new SecretManagerServiceClient();
const name = 'projects/moonhome/secrets/moonFirstSecret/versions/latest';

testSecretManager = async () => 
  const [version] = await secretManagerServiceClient.accessSecretVersion( name );
  const payload = version.payload.data.toString();
  console.debug(`Payload: $payload`);
;

exports.helloHttp = (req, res) => 
  testSecretManager();
  res.send("noooo1");
;
// One of many versions of packaga.json I tried on Cloud function

  "dependencies": 
      "@google-cloud/secret-manager": 
        "version": "3.1.0",
        "resolved": "https://registry.npmjs.org/@google-cloud/secret-manager/-/secret-manager-3.1.0.tgz",
        "integrity": "sha512-/9IOWEhKAz/r3kSyp16kjudELkEJSRhwFfzukKbzQehVRZ3RceNDzjn+Rti1TivODJHEEIBZVsQFsKp7cLfUgQ==",
        "requires": 
            "google-gax": "^2.1.0"
      
    
  

以下是我的问题:

    我注意到 Cloud Function 中 node.js 运行时上有一个list 可用系统包,所以我想知道这是否是原因。我已经提交了将 @google-cloud/secret-manager 添加到 node.js 运行时的请求。但是,Cloud Function 文档中有一个示例,其中使用了 escape-html,该列表中也没有该示例。我的问题是,我是否应该请求将 secret-manager 包添加到 node.js 运行时?

    由于 Cloud Function 需要一个事件触发器,我还尝试用一个简单的函数包装这个 testSecretManager 来处理 http 请求,并在我的浏览器的端点上对其进行测试。简单的函数本身工作正常,但是每当我将任何与秘密管理器相关的内容插入该函数时,函数都会失败或页面显示它Error: could not handle the request。我的问题是,我是否必须用 HTTP 请求或任何其他事件处理函数包装 testSecretManager 才能触发 Cloud Function 中的目标函数?

    我对 Cloud 函数上的 package.json 文件非常困惑,当我在 GCE 中使用 secret-manager 时,package-lock.json 有 600 多行,所以我尝试将这些行处理为 Cloud Function 上的 package.json,但是它不起作用.....我的问题是,当我想要的只是 @google-cloud/secret-manager 包时,我应该在 package.json 中包含什么?

【问题讨论】:

【参考方案1】:

    您混淆了系统包和节点包。系统包安装在主机上(例如apt-get install)。 NPM 包安装到 Node 中(例如npm install)。 您不应要求将秘密管理器添加到系统包中。

    你的功能是混合同步和异步。由于您的testSecretManager 函数是同步函数,因此在helloHttp 中调用它时需要以await 开头。然后你需要将helloHttp 标记为异步。如果这不起作用,请复制并粘贴确切的错误消息和堆栈跟踪。

    package.jsonpackage-lock.json 是具有不同语法的独立文件。 您不应将数据从 lockfile 复制到您的包文件中。这是您可以复制的 an example:

     "dependencies": 
       "@google-cloud/secret-manager": "^3.1.0"
     ,
    

【讨论】:

成功了!非常感谢!!!!现在我将尝试获取在某处打印的秘密,console.debug() 没有在日志中留下任何内容。 再次感谢您!我学到了很多!现在异步已修复,秘密现在只显示在页面上。

以上是关于如何访问 Cloud Function node.js10 中的 Secret Manager?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Cloud Build 访问 GSM 机密并传递给 Cloud Function

如何使用 node.js 运行时访问 Azure Function App 函数中的 multipart/form-data

通过 API Key 访问 Google Cloud Function

从 Spring Cloud Function 访问 AWS Lambda 上下文

在 Google Cloud Function 中设置环境变量

我应该如何使用 Google Cloud KMS 存储由另一个应用程序生成的访问令牌?