Подтвердить что ты не робот

Как сделать 10 000 файлов в S3 общедоступной

У меня есть папка в ведре с 10 000 файлами. Кажется, что нет способа загрузить их и опубликовать их сразу. Поэтому я загрузил их всех, они частные, и мне нужно сделать их общедоступными.

Я пробовал консоль aws, он просто дает ошибку (отлично работает с папками с меньшим количеством файлов).

Я пытался использовать организацию S3 в Firefox, то же самое.

Есть ли какое-то программное обеспечение или какой-нибудь script, который я могу запустить, чтобы сделать все это общедоступным?

4b9b3361

Ответ 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)}'