Как сделать 10 000 файлов в S3 общедоступной
У меня есть папка в ведре с 10 000 файлами. Кажется, что нет способа загрузить их и опубликовать их сразу. Поэтому я загрузил их всех, они частные, и мне нужно сделать их общедоступными.
Я пробовал консоль aws, он просто дает ошибку (отлично работает с папками с меньшим количеством файлов).
Я пытался использовать организацию S3 в Firefox, то же самое.
Есть ли какое-то программное обеспечение или какой-нибудь script, который я могу запустить, чтобы сделать все это общедоступным?
Ответы
Ответ 1
Вы можете создать политику ведра (см. пример ниже), который дает доступ ко всем файлам в ведре. Политика ведра может быть добавлена в ведро через консоль AWS.
{
"Id": "...",
"Statement": [ {
"Sid": "...",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucket/*",
"Principal": {
"AWS": [ "*" ]
}
} ]
}
Также посмотрите на следующий инструмент генератора политик, предоставленный Amazon.
http://awspolicygen.s3.amazonaws.com/policygen.html
Ответ 2
Если вы загружаете в первый раз, вы можете установить общедоступные файлы для загрузки в командной строке:
aws s3 sync . s3://my-bucket/path --acl public-read
Как описано в разделе Использование команд высокого уровня s3 с интерфейсом командной строки AWS
К сожалению, ACL применяется только при загрузке файлов. Он (в моем тестировании) не применяет ACL к уже загруженным файлам.
Если вы хотите обновить существующие объекты, вы раньше могли синхронизировать корзину с самим собой, но, похоже, это перестало работать.
[Больше не работает] Это можно сделать из командной строки:
aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read
(Таким образом, это больше не отвечает на вопрос, но оставляет ответ для справки, как это было раньше.)
Ответ 3
Мне пришлось сменить несколько сотен тысяч объектов. Я запускал экземпляр EC2, чтобы запустить его, что ускоряет его работу. Сначала вы захотите установить драгоценный камень aws-sdk
.
Здесь код:
require 'rubygems'
require 'aws-sdk'
# Change this stuff.
AWS.config({
:access_key_id => 'YOURS_HERE',
:secret_access_key => 'YOURS_HERE',
})
bucket_name = 'YOUR_BUCKET_NAME'
s3 = AWS::S3.new()
bucket = s3.buckets[bucket_name]
bucket.objects.each do |object|
puts object.key
object.acl = :public_read
end
Ответ 4
У меня была та же проблема, решение от @DanielVonFange устарело, поскольку новая версия SDK отсутствует.
Добавление фрагмента кода, который работает для меня прямо сейчас с AWS Ruby SDK:
require 'aws-sdk'
Aws.config.update({
region: 'REGION_CODE_HERE',
credentials: Aws::Credentials.new(
'ACCESS_KEY_ID_HERE',
'SECRET_ACCESS_KEY_HERE'
)
})
bucket_name = 'BUCKET_NAME_HERE'
s3 = Aws::S3::Resource.new
s3.bucket(bucket_name).objects.each do |object|
puts object.key
object.acl.put({ acl: 'public-read' })
end
Ответ 5
Просто хотел добавить, что с новой консолью S3 вы можете выбрать свои папки и выбрать " Make public
чтобы сделать все файлы внутри папок общедоступными. Он работает как фоновая задача, поэтому должен обрабатывать любое количество файлов.
![Make Public]()
Ответ 6
Посмотрите BucketExplorer, он очень хорошо управляет массовыми операциями и является надежным S3-клиентом.
Ответ 7
Если бы это было нужно, но количество файлов заставляло его замедлять работу в серийном режиме. Поэтому я написал a script, который делает это на iron.io сервис IronWorker. Их 500 бесплатных часов вычислений в месяц достаточно, чтобы обрабатывать даже большие ведра (и если вы превысите то, что цена разумна). Поскольку он выполняется параллельно, он заканчивается менее чем за минуту для 32 000 объектов, которые у меня были. Также я считаю, что их серверы работают на EC2, поэтому связь между заданием и S3 выполняется быстро.
Никто не может использовать мой script для своих нужд.
Ответ 8
Вы думаете, что они будут публично читать поведение по умолчанию, не так ли?:)
Я разделял ваше разочарование при создании пользовательского API для взаимодействия с S3 с решением С#. Вот фрагмент, который выполняет загрузку объекта S3 и устанавливает его для общедоступного доступа по умолчанию:
public void Put(string bucketName, string id, byte[] bytes, string contentType, S3ACLType acl) {
string uri = String.Format("https://{0}/{1}", BASE_SERVICE_URL, bucketName.ToLower());
DreamMessage msg = DreamMessage.Ok(MimeType.BINARY, bytes);
msg.Headers[DreamHeaders.CONTENT_TYPE] = contentType;
msg.Headers[DreamHeaders.EXPECT] = "100-continue";
msg.Headers[AWS_ACL_HEADER] = ToACLString(acl);
try {
Plug s3Client = Plug.New(uri).WithPreHandler(S3AuthenticationHeader);
s3Client.At(id).Put(msg);
} catch (Exception ex) {
throw new ApplicationException(String.Format("S3 upload error: {0}", ex.Message));
}
}
Функция ToACLString (acl) возвращает общедоступное чтение, BASE_SERVICE_URL s3.amazonaws.com, а константа AWS_ACL_HEADER x-amz-acl. Материалы plug and DreamMessage, скорее всего, будут выглядеть странно для вас, поскольку мы используем среду Dream для оптимизации наших HTTP-сообщений. По существу, мы делаем http PUT с указанными заголовками и специальную подпись заголовка для спецификаций aws (см. Эту страницу в aws docs для примеров о том, как создать заголовок авторизации).
Чтобы изменить существующие ACL-объекты с 1000 объектами, вы можете написать script, но, возможно, проще использовать инструмент GUI для исправления непосредственной проблемы. Лучшее, что я использовал до сих пор, - это компания под названием cloudberry для S3; похоже, у них есть бесплатная 15-дневная пробная версия для хотя бы одного из их продуктов. Я только что проверил, что он позволит вам сразу выбрать несколько объектов и установить их ACL для общего доступа через контекстное меню. Наслаждайтесь облаком!
Ответ 9
Используя cli:
aws s3 ls s3://bucket-name --recursive > all_files.txt && grep.jpg all_files.txt > files.txt && cat files.txt | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'