Позвольте мне начать с того, что я обычно очень неохотно публикую эти вопросы, поскольку я всегда чувствую, что есть ответ на все, что есть в Интернете. Проведя бесчисленные часы в поисках ответа на этот вопрос, я, наконец, отказался от этого утверждения.
Предположение
Это работает:
s3.getSignedUrl('putObject', params);
Что я пытаюсь сделать?
- Загрузите файл через PUT (с клиентской стороны) в Amazon S3, используя метод getSignedUrl
- Разрешить всем просматривать файл, загруженный на S3
Примечание.. Если есть более простой способ разрешить загрузке на стороне клиента (iPhone) на Amazon S3 с предварительно подписанными URL-адресами (и без предоставления учетных данных на стороне клиента), я все уши.
Основные проблемы *
- При просмотре Консоли управления AWS загруженный файл имеет пустые разрешения и метаданные.
- При просмотре загруженного файла (т.е. дважды щелкнув файл в AWS Management Console) я получаю ошибку
AccessDenied
.
Что я пробовал?
Попробуйте # 1: Мой оригинальный код
В NodeJS я создаю заранее подписанный URL-адрес:
var params = {Bucket: mybucket, Key: "test.jpg", Expires: 600};
s3.getSignedUrl('putObject', params, function (err, url){
console.log(url); // this is the pre-signed URL
});
Предварительно подписанный URL-адрес выглядит примерно так:
https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Expires=1391069292&Signature=u%2BrqUtt3t6BfKHAlbXcZcTJIOWQ%3D
Теперь я загружаю файл через PUT
curl -v -T myimage.jpg https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Expires=1391069292&Signature=u%2BrqUtt3t6BfKHAlbXcZcTJIOWQ%3D
ПРОБЛЕМА
Я получаю Основные проблемы, перечисленные выше
Попробуйте # 2: добавление Content-Type и ACL в PUT
Я также попытался добавить Content-Type и x-amz-acl в свой код, заменив параметры следующим образом:
var params = {Bucket: mybucket, Key: "test.jpg", Expires: 600, ACL: "public-read-write", ContentType: "image/jpeg"};
Затем я попробую хороший ol 'PUT:
curl -v -H "image/jpeg" -T myimage.jpg https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Content-Type=image%2Fjpeg&Expires=1391068501&Signature=0yF%2BmzDhyU3g2hr%2BfIcVSnE22rY%3D&x-amz-acl=public-read-write
ПРОБЛЕМА
Мой терминал выводит некоторые ошибки:
-bash: Content-Type=image%2Fjpeg: command not found
-bash: x-amz-acl=public-read-write: command not found
И я также получаю Основные проблемы, перечисленные выше.
Попробуйте №3: изменение разрешений в вебе, чтобы быть общедоступным
Все перечисленные ниже элементы отмечены галочкой в консоли управления AWS)
Grantee: Everyone can [List, Upload/Delete, View Permissions, Edit Permissions]
Grantee: Authenticated Users can [List, Upload/Delete, View Permissions, Edit Permissions]
Политика ведра
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1390381397000",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::mybucket/*"
}
]
}
Попробуйте # 4: Установка разрешений IAM
Я установил для этой политики пользователя следующее:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
Политика групповой политики AuthenticatedUsers:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1391063032000",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"*"
]
}
]
}
Попробуйте # 5: настройка политики CORS
Я установил политику CORS следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
И... Теперь я здесь.