Gcloud ApiError: Недостаточное разрешение, даже если тот же API записал файл в хранилище

Я в недоумении здесь. Мой код узла успешно загрузил файлы в gcloud Storage, но не может сделать файл общедоступным или даже изменить acl.

Факт заключается в том, что файл был записан в хранилище gcloud, но не может сделать этот же файл общедоступным.

Возвращенная ошибка

{ [ApiError: Недостаточное разрешение] ошибки: [ {домен: "глобальный", причина: "достаточное количество разрешений", сообщение: "недостаточное разрешение"} ], код: 403, сообщение: "недостаточное разрешение", ответ: не определено}

Вот мой код (предположим, что этот код находится в STREAM или stdout.pipe)

var gcs = GLOBAL.gcloud.storage();
var bucket = gcs.bucket(GLOBAL.storage_names.products);
var file = bucket.file('images/'+targetValue+'_'+filename);
stdout.pipe(file.createWriteStream())
  .on('error', function(err) {
    var msg = {
      "status":"Error"
      "err":err
    };
    console.log(msg);

  })
  .on('finish', function() {
    // The file upload is complete.
    console.log("Successfully uploaded "+targetValue+'_'+filename);
    file.acl.add({
      entity: 'allUsers',
      role: gcs.acl.READER_ROLE
    }, function(err, aclObject) {

      if(err==null)
      {
        //stream upload file
        file.makePublic();
      }else{
        console.log("ERROR in ACL Adding");
        console.log(err)
      }

    });
    file.makePublic(function(err, apiResponse) {
      if(err==null)
      {
        console.log("File made public");
      }else{
        console.log("make public error");
        console.log(err);
      }
    });
  });

1 ответ

Хотя код не показывает проблему напрямую, это может помочь: Разрешение корзины WRITER может создавать объекты, но вам нужно разрешение объекта OWNER для изменения ACL на существующих объектах. Кроме того, создателю объекта автоматически не предоставляется разрешение объекта OWNER (даже если они являются ВЛАДЕЛЕЦОМ корзины) - если вы не укажете предопределенный ACL при создании объекта, Google Cloud Storage всегда применяет значение по умолчанию корзины ACL объекта для вновь созданного объекта.

Таким образом, два возможных исправления: (1) заранее установить ACL объекта по умолчанию на контейнере, чтобы включить учетные данные вашего приложения как OWNER или (2) предоставить предопределенный ACL (например, 'publicRead') во время создания объекта, а не изменять его позже,

Другие вопросы по тегам