我非常愿意学习是否有更好的“最佳实践”方法来执行此操作,但是我偶尔会运行一些脚本来编辑数据库,因此我需要为这些脚本传递数据库密码。我通过调用调用 google cloud Secrets Manager 的函数来获取密码,但我无法将其添加到 process.env。
例如,如果我把它放在我的脚本文件的顶部:
process.env.DB_HOST='127.0.0.1';
process.env.DB_USER='michael';
process.env.DB_NAME='staging-db';
process.env.DB_PORT=1234;
process.env.DB_PASS= await accessSecret('projects/myproject-123/secrets/DB_PASS/versions/latest');
当上述运行我得到错误
SyntaxError: await is only valid in async functions and the top level bodies of modules
但是,如果我将 process.env.DB_PASS 设置移动到我的 async main() 函数中,那么它具有该 main 函数的本地范围。此脚本中的函数调用的其他文件将 process.env.DB_PASS 视为未定义(但请查看文件顶部全局设置的任何 process.env 变量的值。
如何在不将文字秘密实际粘贴到代码中的情况下引入并设置该秘密?
为了表示范围界定的问题,这里是该问题的工作代码再现。这是我正在运行的脚本文件:
process.env.DB_HOST='127.0.0.1';
process.env.DB_USER='michael';
process.env.DB_NAME='staging-db';
process.env.DB_PORT=1234;
const db = require('../../src/database/process_pull_test');
const main = async () => {
process.env.SCOPED_KEY = "helloimscoped"
db.hello();
}
main().catch((e) => {console.error(e)});
这是process_pull_test
文件
console.log("SCOPED KEY", process.env.SCOPED_KEY);
const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbName = process.env.DB_NAME;
const dbPort = process.env.DB_PORT;
const scopedKey = process.env.SCOPED_KEY;
async function hello() {
console.log(dbHost);
console.log(dbUser);
console.log(dbName);
console.log(dbPort);
console.log(scopedKey);
return console.log("Hello Secrets");
}
module.exports = {
hello: hello
}
而且,这是输出
SCOPED KEY undefined
127.0.0.1
michael
staging-db
1234
undefined
Hello Secrets