我非常愿意學習是否有更好的“最佳實踐”方法來執行此操作,但是我偶爾會運行一些腳本來編輯資料庫,因此我需要為這些腳本傳遞資料庫密碼。我通過呼叫呼叫 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設定里面我的異步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
uj5u.com熱心網友回復:
但是,如果我將 process.env.DB_PASS 設定移動到我的 async main() 函式中,那么它具有該 main 函式的本地范圍。此腳本中的函式呼叫的其他檔案將 process.env.DB_PASS 視為未定義(但請查看檔案頂部全域設定的任何 process.env 變數的值。
這是不正確的,它將被全域設定。可能只是您的其他檔案在您的 main() 運行之前執行。
通常,解決方案是簡單地確保在設定環境變數后main(),呼叫所有其他邏輯。這意味著您的所有邏輯都應該在函式中。
uj5u.com熱心網友回復:
通常,您使用某種配置工具(例如dotenv或config)來管理應用程式設定和機密。確保不要將機密檔案保存在源代碼管理中。
要獲取您的資料庫機密,您必須在嘗試讀取任何需要該資料的變數之前對 Google 進行異步呼叫并獲取回應。
我假設您只是從命令列運行它。
首先,您需要一個 async iife 來執行您的 main:
(async () => {
// you could put your main code here.
await main();
})();
接下來,向您的 Google 機密管理器添加要求。它可以去任何地方,但你應該確保你可以在你只呼叫一次的地方訪問它。您也可以在主檔案中執行此操作。
const gcsm = require('./secretManager');
然后在 main 中呼叫您的 Google 機密管理器。(我正在撰寫 api。)并設定您的環境。當您實際將異步代碼放入其中時,您還需要等待您對 db.hello() 的呼叫。從技術上講,您不需要使用撰寫的代碼來執行此操作。
const main = async () => {
const dbPassword = await gcsm.getSecret('some config location');
process.env.DB_PASS = dbPassword;
process.env.SCOPED_KEY = "helloimscoped"
await db.hello();
}
在 process_pull_test 的 hello() 中,讀取 env 變數。
async function hello() {
console.log(process.env.DB_PASS);
console.log(dbHost);
console.log(dbUser);
console.log(dbName);
console.log(dbPort);
console.log(scopedKey);
// note the following line doesn't return anything because
// console.log returns undefined. You probably want to return a
// string value to test for now.
return console.log("Hello Secrets");
}
這應該讓你繼續前進。
附加評論:
- 當您第一次在 process_pull_test 中記錄 SCOPED_KEY 時,它沒有作用域,它只是在需要時記錄并且仍然未定義。
- 當你登錄
scopedKeyhello() 時,它仍然是未定義的,因為你在 process_pull_test 頂部的 require 時間設定了它。 - 當您在 main() 中設定 SCOPED_KEY 時,為時已晚,您已經
scopedKey在需要時將其保存為未定義。如果您在記錄之前設定scopedKey為process.env.SCOPED_KEYhello(),您會看到更新后的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409188.html
標籤:
下一篇:節點匯入陳述句無法識別../前綴
