Обзор:
Я создаю автоматизацию при развертывании продуктов в GCP, а затем в GCS через Node.js v8.12.0. В начале этого процесса развертывания я должен сделать следующее:
Просмотрите папки и файлы в папке проекта, чтобы найти файл ключа JSON для учетной записи службы GCS.
Определите местонахождение указанного ключевого файла.
Запустите export GOOGLE_APPLICATION_CREDENTIALS = "/ path / to / file / [FILE_NAME] .json", чтобы указать местоположение, чтобы я мог выполнить код для вызова функций GCS через узел.
Я пробовал выполнить команду через модуль child_process.exec в node.js. Выполнение прошло успешно, но в другой оболочке.
Согласно документации Google, установка переменной GOOGLE_APPLICATION_CREDENTIALS «... применяется только к вашему текущему сеансу оболочки, поэтому, если вы откроете новый сеанс, установите переменную снова».
Хотя установка не занимает много времени, я бы хотел автоматизировать это в процессе развертывания. Итак, есть ли способ выполнить это в текущей оболочке? Открыт также и для других идей.
код ниже:
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.info("Finding your service account keys...")
find('fauxfile_1123456ae.json', 'a/b/c', function(err, file) {
if (file !== undefined) {
console.info("Service keys found: ",file);
setOathJSON(file);
} else if (err !== undefined) {
console.info(err);
} else {
console.info("Couldn't find your service account keys. Add to your folders and try again.")
}
});
}
function setOathJSON (file) {
console.info("Setting service key pay to access GCS...");
var command = 'export GOOGLE_APPLICATION_CREDENTIALS=\"'+file+'\"';
exec(command, (err, stdout, stderr) => {
if (err === null) {
console.info("Service key set!");
}
// the *entire* stdout and stderr (buffered)
console.info(`stdout: ${stdout}`);
console.info(`stderr: ${stderr}`);
console.info(`err: ${err}`);
console.info("cmd: "+command);
});
}
function gstoreInfo () {
console.info("Getting cloud storage info...");
storage
.getBuckets()
.then(results => {
const buckets = results[0];
buckets.forEach(bucket => {
gsBuckets["gstoreb"+i] = bucket.name;
console.info("Found bucket: "+bucket.name);
i++;
});
})
.catch(err => {
console.error('ERROR:', err);
});
}@jimmartens Список сегментов, загрузка объектов, настройка ACL (списков контроля доступа).
общается ли он между проектами GCP или все в одном проекте?
Рассматривали ли вы использование объекта параметров конструктора и передачу keyFilename для каждого из используемых вами API? Таким образом, вам вообще не понадобится GOOGLE_APPLICATION_CREDENTIALS.
Если это все в одном проекте, вам даже не нужны учетные данные, если вы используете библиотеки Idiomatic. Я где-то еще ответил примерно так: stackoverflow.com/questions/47160766/…
@jimmartens Всего один проект. Я обновил свой фрагмент кода, включив в него идиоматические библиотеки, которые я использовал. Когда я пытаюсь получить список сегментов из GCS, я получаю нулевой ответ. Это только когда я устанавливаю GOOGLE_APPLICATION_CREDENTIALS, когда я получаю список корзины.
Хорошо, последний вопрос, вы говорите, что это функция GCS? Вы используете его как облачную функцию? Мне удалось написать функцию HTTP Triggered Cloud для записи сегментов проекта в журналы, и она отлично работает.
Догадаться. Я скоро отправлю ответ.





Догадаться. Идиоматические библиотеки узла позволяют вам установить путь keyFileName через созданный экземпляр объекта место хранения следующим образом:
const storage = new Storage({
projectId: 'mystorage-bucket-123456',
keyFilename: ''/path/to/keyfile.json''
});Эта документация немного скрыта, но вы можете найти ее здесь: https://github.com/googleapis/google-cloud-node/blob/master/docs/authentication.md
Каждый раз, когда вы вызываете хранилище, keyFilename передается для аутентификации. Я использовал тот же код, что и выше, и он сработал.
Это круто. Спасибо!
«чтобы я мог выполнить код для вызова функций GCS через узел» Какую функцию GCS вы пытаетесь вызвать из этих облачных функций узла?