У меня трудные времена, чтобы заставить вещи работать должным образом при использовании AWS-S3
с Parse-Server
на Heroku
.
В AWS у меня есть корзина S3 с именем mybucket, и пользователь с именем mybucket-aws связан с этой политикой:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::mybucket",
"arn:aws:s3:::mybucket/*"
]
}
]
}
Кроме того, на Heroku у меня есть сервер разбора, подобный этому:
var express = require('express');
var ParseServer = require('parse-server').ParseServer;
var path = require('path');
var mongo = require('mongodb');
var MongoClient = mongo.MongoClient;
var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI;
if (!databaseUri) {
console.log('DATABASE_URI not specified, falling back to localhost.');
}
var api = new ParseServer({
databaseURI: databaseUri,
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID,
masterKey: process.env.MASTER_KEY,
filesAdapter: "@parse/s3-files-adapter",
serverURL: process.env.SERVER_URL,
publicServerURL: process.env.PARSE_PUBLIC_SERVER_URL,
appName: 'MyApp',
.........
});
А вот код swift
, который я использую в своем приложении iOS
при загрузке аудиоданных на сервер:
//audioFileName is the name of the sound file.
do {let soundData = try Data(contentsOf: getDocumentsDirectory().appendingPathComponent(audioFileName)),
parse_Sound = PFFile(name: "Voice", data: soundData)
parse_Sound?.saveInBackground(block: {
(succeeded:Bool, error:Error?) in
if succeeded {
// Keep working all is OK.
} else {print("Error: \(error ?? "" as! Error)")}
})
} catch let error {
print("Error:\n" + error.localizedDescription)
}
Наконец, вот код javascript, запускаемый через облачную функцию, которая используется, когда я хочу удалить аудиоданные с сервера. Он вызывается через приложение iOS. И это не (полностью) работает.
const aws = require('aws-sdk');
.........
(function() {
var destroyPromises = [];
const s3 = new aws.S3();
for (i = 0; i < myArray.length; i++) {
// Let us remove the sound data:
destroyPromises.push(s3.deleteObject({
Bucket: "mybucket",
Key: myArray[i].get("audio")
}).promise());
destroyPromises.push(myArray[i].destroy({}));
}
Поскольку остальные данные удаляются, как и ожидалось, я думаю, что это не ошибка в использовании обещаний. Только аудиоданные на AWS / S3 не удаляются должным образом. Зная, что я могу записать данные в корзину (при загрузке), я предполагаю, что у меня есть доступ на запись и, следовательно, я также должен иметь возможность удалять данные. Но я не уверен на 100% в этом и подозреваю, что что-то может быть не так в моих настройках разрешений.
В любом случае, кто-то может понять, почему я не могу удалить аудиоданные в моем s3-ведре и сказать, что мне делать?