Облачная функция GCP для чтения файлов из облачного хранилища - PullRequest
0 голосов
/ 21 января 2019

Я новичок в GCP, облачных функциях и экосистеме NodeJS. Любые указатели были бы очень полезны.

Я хочу написать облачную функцию GCP, которая выполняет следующие действия:

  1. Считать содержимое файла (sample.txt), сохраненного в Google Cloud Storage.
  2. Скопируйте его в локальную файловую систему (или просто console.log ())
  3. Запустите этот код, используя функции-эмулятор локально для тестирования

Результат: 500 INTERNAL error with message 'function crashed'. Журналы функций дают следующее сообщение

2019-01-21T20:24:45.647Z - info: User function triggered, starting execution
2019-01-21T20:24:46.066Z - info: Execution took 861 ms, finished with status: 'crash'

Ниже приведен мой код, взятый в основном из примера кода и документации GCP NodeJS.

exports.list_files = (req, res) => {
    const fs = require('fs');
    const {Storage} = require('@google-cloud/storage');
    const storage = new Storage();
    const bucket = storage.bucket('curl-tests');
    bucket.setUserProject("cf-nodejs");
    const file = bucket.file('sample.txt'); // file has couple of lines of text

    const localFilename = '/Users/<username>/sample_copy.txt';

    file.createReadStream()
        .on('error', function (err) { })
        .on('response', function (response) {
            // Server connected and responded with the specified status and 
headers.
        })  
        .on('end', function () {
            // The file is fully downloaded.
        })  
        .pipe(fs.createWriteStream(localFilename));
}

Я бегу так:

functions call list_files --trigger-http 

ExecutionId: 4a722196-d94d-43c8-9151-498a9bb26997
Error: { error:
   { code: 500,
     status: 'INTERNAL',
     message: 'function crashed',
     errors: [ 'socket hang up' ] } }

В конечном итоге я хочу сохранить сертификаты и ключи в хранилищах и использовать их для аутентификации в службе за пределами GCP. Это большая проблема, которую я пытаюсь решить. Но сейчас, сосредоточив внимание на устранении сбоя.

1 Ответ

0 голосов
/ 22 января 2019

Начните разработку и отладку на рабочем столе, используя node, а не эмулятор.Как только ваш код работает без предупреждений и ошибок, начните работать с эмулятором и, наконец, с облачными функциями.

Давайте возьмем ваш код и исправим его части.

bucket.setUserProject("cf-nodejs");

Я сомневаюсь, что ваш проект cf-nodejs.Введите правильный идентификатор проекта.

const localFilename = '/Users/<username>/sample_copy.txt';

Это не сработает.У вас нет каталога /Users/<username> в облачных функциях.Единственный каталог, в который вы можете писать, это /tmp.В целях тестирования измените эту строку на:

const localFilename = '/tmp/sample_copy.txt';

Вы ничего не делаете для ошибок:

.on('error', function (err) { })

Измените эту строку, чтобы хотя бы что-то напечатать:

.on('error', function (err) { console.log(err); })

После этого вы сможете просмотреть вывод в Google Cloud Console -> Драйвер стека -> Журналы.Драйвер стека поддерживает выбор «Облачные функции» - «Имя вашей функции», чтобы вы могли видеть свои выходные данные отладки.

Последний совет, оберните ваш код в блок try / Кроме и console.log сообщение об ошибке вкроме блока.Таким образом, по крайней мере, у вас будет запись в журнале, когда ваша программа падает в облаке.

...