【问题标题】:Use Google Cloud Secrets when initializing code初始化代码时使用 Google Cloud Secrets
【发布时间】:2022-01-29 17:42:23
【问题描述】:

我有这个代码来检索秘密:

import {SecretManagerServiceClient} from "@google-cloud/secret-manager";

const client = new SecretManagerServiceClient();

async function getSecret(secret: String, version = "latest") {
    const projectID = process.env.GOOGLE_CLOUD_PROJECT;
    const [vs] = await client.accessSecretVersion({
        name: `projects/${projectID}/secrets/${secret}/versions/${version}`
    });
    const secretValue = JSON.parse(vs.payload.data.toString());
    return secretValue;
}

export {getSecret};

我想用await getSecrets("SENTRY_DNS") 替换process.env.SENTRY_DNS,但我不能在async 函数之外调用promise (await)。

Sentry.init({
    dsn: process.env.SENTRY_DNS,
    environment: Config.isBeta ? "Beta" : "Main"
});

function sentryCreateError(message, contexts) {
    Sentry.captureMessage(message, {
        level: "error", // one of 'info', 'warning', or 'error'
        contexts
    });
}

Google Secrets 的最佳做法是什么?我应该在“配置”文件中加载一次秘密,然后从那里调用值吗?如果是这样,我不知道该怎么做,你有例子吗?

【问题讨论】:

  • 你在哪里运行你的代码,为什么不能在你调用accessSecretVersion的地方使用async/await?
  • 检查上面的例子,Sentry.init() 在函数之外运行。这就是问题所在,也许我需要创建一个类,以便 init 代码可以调用 await 函数?
  • 顶级 await 是现代 nodejs 中的一个东西。
  • @sethvargo,非常感谢您的帮助。如果我在顶级 const dns = await getSecret("SENTRY_DNS"); 添加此代码,则会收到错误消息:Parsing error: Unexpected reserved word 'await'.。我正在使用 nodejs v16。

标签: node.js google-cloud-platform google-secret-manager


【解决方案1】:

抛开您的代码示例(反正我不使用 JS),我会考虑几个不同的问题,这些问题的答案可能会影响设计。例如:

  1. 这段代码在哪里执行? - 计算引擎、应用引擎、云运行、k8s、云函数等。根据答案 - 存储机密的方法可能会有所不同。

假设,例如,这将是一个云功能。下一个问题-

  1. 您希望将秘密值存储在特殊的环境变量中,还是存储在秘密管理器中?第一个选项更快,但不太安全 - 例如,可以在控制台中访问云功能详细信息的每个人都可能会看到这些环境变量值。

  2. 在初始化时将秘密值加载到内存中?还是在每次调用时?第一个选项更快,但如果修改了秘密值(当终止某些实例并初始化新实例时,用新值逐渐替换旧值),可能会导致一些问题。

第二个选项可能需要一些额外的讨论。可能可以异步获取值。在什么情况下可能有用?我认为 - 只有在您的代码有其他事情要做的情况下,同时等待秘密值,这是(可能)完成云功能的主要工作所必需的。我们可以剃掉多少? - 可能在 Secret Manager API 调用中使用了几毫秒。有什么缺点吗? - 代码复杂性,因为将来有人要维护代码。这种性能提升是否仍然超重? - 我们可能可以回到上面列表中的第 2 项,并考虑在这种情况下将秘密存储在环境变量中。

第一个选项呢?再次 - 如果性能是优先级 - 回到上面的第 2 项,否则 - 代码的简单性和可维护性是优先级,我们在这里不需要任何异步工作吗?这个问题的答案可能取决于您公司/团队的技能、知识和财务预算,而不是技术偏好。

  1. 关于存储秘密值的“config”文件...虽然可以在云函数执行期间将数据存储在伪“/tmp”目录中(实际上是在云函数的内存中),但我们应该不要期望在云函数调用之间保留数据。因此,我们要么回到环境变量(参见上面的第 2 项),要么回到具有 API 访问权限的其他远程位置。不知道有没有比Secret Manager延迟更好的其他服务,可以作为存储秘密的缓存。假设我们找到了这样的服务。现在我们再次陷入了性能与复杂性/可维护性的两难境地……

一些结束语。我的背景、经验、预算、要求——可能与你的情况完全不同。我的假设(即代码用于云功能) - 也可能是完全错误的......因此,我建议以一些批评来考虑我的写作,并使用仅与您的具体情况相关的想法。

【讨论】:

  • 感谢您的回复,但我认为您错过了理解问题。如果我应该使用秘密,我要求的是代码示例。
猜你喜欢
  • 1970-01-01
  • 2019-03-19
  • 2021-08-03
  • 1970-01-01
  • 2020-08-26
  • 2022-10-02
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多