Placer le fichier à Amazon S3 en utilisant multipart télécharger
Je suis en train de télécharger un fichier avec le Amazon SDK Java, via multipart télécharger. L'idée est de passer un téléchargement-id pour une applet, qui met les parties de fichier en lecture seule-seau. Aller de cette façon, j'évite de stocker des informations d'identification AWS dans l'applet.
Dans mes tests, j'ai générer un upload-id avec boto (python) et de stocker un fichier dans le seau. Qui fonctionne bien.
Mon Applet obtient un "403 Accès refusé" à partir de la S3, et je n'ai aucune idée pourquoi.
Voici mon code (qui est partiellement prises de http://docs.amazonwebservices.com/AmazonS3/latest/dev/llJavaUploadFile.html):
AmazonS3 s3Client = new AmazonS3Client();
List<PartETag> partETags = new ArrayList<PartETag>();
long contentLength = file.length();
long partSize = Config.getInstance().getInt("part_size");
String bucketName = Config.getInstance().getString("bucket");
String keyName = "mykey";
String uploadId = getParameter("upload_id");
try {
long filePosition = 0;
for (int i = 1; filePosition < contentLength; i++) {
partSize = Math.min(partSize, (contentLength - filePosition));
//Create request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket).withKey(keyName)
.withUploadId(uploadId).withPartNumber(i)
.withFileOffset(filePosition)
.withFile(file)
.withPartSize(partSize);
//Upload part and add response to our list.
partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());
filePosition += partSize;
}
System.out.println("Completing upload");
CompleteMultipartUploadRequest compRequest = new
CompleteMultipartUploadRequest(bucket,
keyName,
uploadId,
partETags);
s3Client.completeMultipartUpload(compRequest);
} catch (Exception e) {
s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
bucketName, keyName, uploadId));
}
Dans l'applet du journal de débogage, je trouve ce, alors:
INFO: Sending Request: PUT https://mybucket.s3.amazonaws.com /mykey Parameters: (uploadId: V4hwobOLQ1rYof54zRW0pfk2EfhN7B0fpMJTOpHOcmaUl8k_ejSo_znPI540.lpO.ZO.bGjh.3cx8a12ZMODfA--, partNumber: 1, ) Headers: (Content-Length: 4288546, Content-Type: application/x-www-form-urlencoded; charset=utf-8, )
24.01.2012 16:48:42 com.amazonaws.http.AmazonHttpClient handleErrorResponse
INFO: Received error response: Status Code: 403, AWS Service: null, AWS Request ID: DECF32CCFEE9EBF0, AWS Error Code: AccessDenied, AWS Error Message: Access Denied, S3 Extended Request ID: xtL1ixsGM2/vsxJ+cZRHpkPZ23SMfP8hZZjQCQnp8oWGwdS2/aGfYgomihyqaDCQ
Trouvez-vous de toute évidence des défaillances dans le code?
Grâce,
Stefan
OriginalL'auteur schneck | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Alors que votre cas est solide et c'est une tentative évidente d'ailleurs, je ne pense pas que le Multipart Télécharger API a été conçu pour permettre cela, et vous êtes fait violer une barrière de sécurité:
Le code de téléchargement est simplement un identifiant pour aider les Multipart Télécharger API en assembler les pièces ensemble (c'est à dire plus comme un objet temporaire de la clé) n'est pas une dédiée mécanisme de sécurité (voir ci-dessous). Par conséquent, vous avez encore besoin d'un accès adéquat des pouvoirs en place, mais depuis que vous appelez AmazonS3Client(), qui Construit une nouvelle Amazon S3 client de rendre anonymes les demandes d'Amazon S3, votre demande de rendements 403 Accès refusé en conséquence.
Ce que vous essayez d'atteindre est possible via Téléchargement D'Objets À L'Aide De Pré-Signé Url, quoique sans le multipart fonctionnalité, malheureusement:
La lenghty citation illustre, pourquoi un tel système probablement besoins de plus en plus complexes, la conception de la sécurité que de "simplement" remise d'un code de téléchargement (comme similaires à celles des deux pourrait apparaître à première vue).
Évidemment on aimerait être en mesure d'utiliser les deux fonctions ensemble, mais cela ne semble pas être encore disponible.
Faciliter IAM en écriture seule politique est une excellente alternative en effet, j'ai trop centré sur comment que vous essayez d'atteindre votre objectif plutôt que sur les cas d'utilisation - vous pouvez prendre encore par Faire des Demandes à l'Aide Utilisateur IAM Temporaire des informations d'Identification afin d'éviter totalement le stockage permanent des informations d'identification au sein de votre applet.
N'est-ce pas le danger avec une écriture seule, public seau est que quelqu'un pourrait spam de votre compartiment en utilisant rien de plus que curl? Ou ai-je raté quelque chose?
OriginalL'auteur Steffen Opel