Можно ли сделать zip из одного хранилища Google в другое с помощью узла js - PullRequest
0 голосов
/ 28 февраля 2019

недавно я получил требование выбрать набор файлов из одной корзины gcp, сделать zip-файл и поместить его в другую корзину.это делается для того, чтобы zip-файл был доступен для пользователя моей системы.Я знаю, что мы могли бы, например, загрузить необходимые файлы из корзины, сделать zip и повторно загрузить в следующую корзину.Но это сокрушит мой сервер, если количество запросов увеличится со временем.Так есть ли способ сделать это на самом ведре и переместить его в следующее ведро?я использую Node.js.

1 Ответ

0 голосов
/ 01 марта 2019

Короткий ответ: нет , нет способа заархивировать объекты из корзины в целевую корзину

Однако существует элегантный способ сделать это самостоятельно, что потребуеттри компонента: (1) паб / подтема GCP, (2) служба узла /request-zip и (3) группа экземпляров облачных вычислений для обработки zips

(1) создание публикацииподтема

gcloud pubsub topics create request-zip
gcloud pubsub subscriptions create --topic request-zip work-zip

(2) Создайте службу /request-zip для публикации в теме request-zip 1013 * Ниже приведен краткий рецепт псевдокода, показывающий, как получить список файлов ипоставьте его в очередь на тему request-zip.Этот звонок быстрый.Возможно, вы захотите добавить адрес электронной почты или создать другую очередь «готово», чтобы уведомить вызывающего абонента о завершении работы. const express = require('express') const app = express() const port = 3000 const bodyParser = require('body-parser') const {PubSub} = require('@google-cloud/pubsub'); app.use(bodyParser.json()) app.post('/request-zip', (req, res) => { const pubsub = new PubSub({projectId}); // send the file list to the queue sendMessageResponse = await pubsub.sendMessage("request-zip", req.body.files.join(',')); console.info(sendMessageResponse) } app.listen(port, () => console.log(`Example app listening on port ${port}!`)) пример публикации в теме на cli для тестирования gcloud pubsub topics publish request-zip --message "file1.txt,file2.png" (3) Запустите группу экземпляров для обработки очереди

Напишите короткий сценарий оболочки, подобный следующему, и раскрутите несколько экземпляров, чтобы получить zips

пример получения сообщения

while true; do
   # i suggest testing success on all routines and then --ack at the end.
   files=$(gcloud pubsub subscriptions pull work-zip --auto-ack --format json|jq -r '. 
   [].message.data'|base64 -d)
   gsutil sync gs://my-bucket/{$files} .
   zip -r archive.zip .
   gsutil sync archive.zip gs://target-bucket/
   rm -rf *
done
...