【发布时间】:2018-10-06 02:48:18
【问题描述】:
概览:
我正在通过 Node.js v8.12.0 在我的产品部署中构建自动化到 GCP 以及随后的 GCS。此部署过程的开始需要我执行以下操作:
遍历项目文件夹中的文件夹和文件,找到GCS服务账号JSON密钥文件。
识别所述密钥文件的位置。
运行 export GOOGLE_APPLICATION_CREDENTIALS="/path/to/file/[FILE_NAME].json" 以设置位置,以便我可以执行代码以通过节点调用 GCS 函数。
我尝试通过 node.js 中的 child_process.exec 模块执行命令。执行成功,但在备用 shell 中。
根据谷歌文档,设置 GOOGLE_APPLICATION_CREDENTIALS 变量“...仅适用于您当前的 shell 会话,因此如果您打开一个新会话,请再次设置该变量。”
虽然设置起来不需要很多时间,但我想在部署过程中自动执行此操作。那么有没有办法让我在当前的 shell 中执行这个?也欢迎其他想法。
代码如下:
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
var readFileTree = require('read-file-tree');
const prompts = require('prompts');
const find = require('find-file-up');
// var tty = require('tty');
var program = require('commander');
const { exec } = require('child_process');
const chalk = require('chalk');
var gsBuckets = {};
var i = 0;
function findOauthJSON () {
console.log("Finding your service account keys...")
find('fauxfile_1123456ae.json', 'a/b/c', function(err, file) {
if (file !== undefined) {
console.log("Service keys found: ",file);
setOathJSON(file);
} else if (err !== undefined) {
console.log(err);
} else {
console.log("Couldn't find your service account keys. Add to your folders and try again.")
}
});
}
function setOathJSON (file) {
console.log("Setting service key pay to access GCS...");
var command = 'export GOOGLE_APPLICATION_CREDENTIALS=\"'+file+'\"';
exec(command, (err, stdout, stderr) => {
if (err === null) {
console.log("Service key set!");
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
console.log(`err: ${err}`);
console.log("cmd: "+command);
});
}
function gstoreInfo () {
console.log("Getting cloud storage info...");
storage
.getBuckets()
.then(results => {
const buckets = results[0];
buckets.forEach(bucket => {
gsBuckets["gstoreb"+i] = bucket.name;
console.log("Found bucket: "+bucket.name);
i++;
});
})
.catch(err => {
console.error('ERROR:', err);
});
}
【问题讨论】:
-
"这样我就可以执行代码通过节点调用 GCS 函数" 你想从这些节点云函数调用什么 GCS 函数?
-
@jimmartens 列出存储桶、上传对象、设置 ACL(访问控制列表)。
-
是跨 GCP 项目进行通信还是一个项目中的所有内容?
-
您是否考虑过使用构造函数选项对象并为您正在使用的每个 API 传入
keyFilename?这样一来,您就根本不需要GOOGLE_APPLICATION_CREDENTIALS。 -
如果它们都在同一个项目中,如果您使用惯用库,您甚至不需要凭据。我在其他地方回答了这样的问题:stackoverflow.com/questions/47160766/…
标签: node.js google-cloud-platform google-cloud-storage