Как поместить объект в amazon s3, используя назначенный URL?
Я пытаюсь использовать подписанный url для загрузки изображений в ведро s3. Ниже приведена политика моего ведра:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::12345678:user/myuser",
"arn:aws:iam::12345678:root"
]
},
"Action": [
"s3:List*",
"s3:Put*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
]
}
]
}
Я генерирую подписанный URL-адрес с сервера следующим образом:
var aws = require('aws-sdk');
aws.config = {
accessKeyId: myAccessKeyId,
secretAccessKey: mySecretAccessKey
};
var s3 = new aws.s3();
s3.getSignedUrl('putObject', {
Bucket: 'myBucket',
Expires: 60*60,
key: 'myKey'
}, function (err, url) {
console.log(url);
});
Я получаю URL. Но когда я пытаюсь поместить объект, я получаю следующую ошибку:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>FXXXXXXXXX</RequestId>
<HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
Обновление 1
Вот политика myuser:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::2xxxxxxxxxxx:user/myuser",
"arn:aws:iam::2xxxxxxxxxxx:root"
]
},
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
]
}
]
}
Обновление 2
Я могу загрузить только после установки следующей опции. Я не понимаю, что такое использование политики ведра, если работает только ручной выбор разрешения.
![Разрешение для всех]()
Обновление 3
Работает следующий код. Теперь единственной проблемой является подписанный url
#!/bin/bash
file="$1"
bucket="mybucket"
resource="/${bucket}/${file}"
contentType="image/png"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key="AKxxxxxxxxxxxxxxxxx"
s3Secret="/Wuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://${bucket}.s3.amazonaws.com/${file}
Ответы
Ответ 1
Мне удалось успешно загрузить файл, используя ваш код.
Ниже приведены шаги, которые я выполнил:
-
Создан новый ковш и новый пользователь IAM
-
Задайте политику пользователя IAM, как показано ниже:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1418647210000",
"Effect": "Allow",
"Action": [
"s3:Put*"
],
"Resource": [
"arn:aws:s3:::myBucket/*"
]
}
]
}
-
НЕ создала политику ведра
-
Используется ваш код для создания предварительно подписанного URL:
var aws = require('aws-sdk');
aws.config = {
accessKeyId: myAccessKeyId,
secretAccessKey: mySecretAccessKey
};
var s3 = new aws.s3();
s3.getSignedUrl('putObject', {
Bucket: 'myBucket',
Expires: 60*60,
Key: 'myKey'
}, function (err, url) {
console.log(url);
});
-
Скопировал URL-адрес на экране и использовал curl для тестирования загрузки, как показано ниже:
curl.exe -k -X PUT -T "someFile" "https://myBucket.s3.amazonaws.com/myKey?AWSAccessKeyId=ACCESS_KEY_ID&Expires=1457632663&Signature=Dhgp40j84yfjBS5v5qSNE4Q6l6U%3D"
В моем случае для изменений политики в целом потребовалось 5-10 секунд, поэтому, если она не удалась в первый раз, обязательно продолжайте отправлять ее на некоторое время.
Надеюсь, что это поможет.
Ответ 2
Вы правильно настроили разрешения на ведро, чтобы разрешить доступ от пользователя.
Но вам также нужно отредактировать политику пользователя, чтобы позволить пользователю получить доступ к службе S3.
Отредактируйте политику IAM для пользователя, учетные данные которого вы используете для создания самозаверенного URL. Что-то вроде этого обязательно охватит все:
{
"Statement": [
{
"Sid": "AllowAllS3Access",
"Action": "s3:*",
"Effect": "Allow",
"Resource": "*"
}
]
}
Ответ 3
- В консоли IAM нажмите Пользователи
- В правом списке выберите пользователя IAM, который вы использовали (должен быть "myuser" )
- Выберите "Разрешения" на вкладках
- Нажмите "Прикрепить политику" и выберите "AmazonS3FullAccess"
Последняя страница будет выглядеть как this.
Вы также можете проверить вкладку "Учетные записи безопасности", ваш accessKeyId должен быть в списке. SecretAccessKey просто не может получить снова.