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


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

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

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

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

8 71

8 ответов:

вы можете создать политику ведра (см. пример ниже), которая дает доступ ко всем файлам в ведре. Политика корзины может быть добавлена в корзину через консоль AWS.

{
    "Id": "...",
    "Statement": [ {
        "Sid": "...",
        "Action": [
            "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::bucket/*",
        "Principal": {
            "AWS": [ "*" ]
        }
    } ]
}

также посмотрите на следующий инструмент генератора политики, предоставленный Amazon.

http://awspolicygen.s3.amazonaws.com/policygen.html

при загрузке в первый раз, вы можете установить файлы для публичной загрузки в командной строке:

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

(Так это не отвечает на вопрос, но ответа для справки, как это работало.)

мне пришлось поменять несколько сотен тысяч объектов. Я запустил экземпляр 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

У меня была та же проблема, решение @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

просто хотел добавить, что с новой консолью S3 вы можете выбрать папку(Ы) и выбрать Make public чтобы сделать все файлы внутри папок общедоступными. Он работает как фоновая задача, поэтому он должен обрабатывать любое количество файлов.

Make Public

посмотреть BucketExplorer Он очень хорошо управляет массовыми операциями и является надежным клиентом S3.

было это нужно мне, но количество файлов делает его способ замедлить, чтобы сделать в последовательном режиме. Так я и написал скрипт это делает его на iron.io ' s слесарем сервис. Их 500 бесплатных вычислительных часов в месяц достаточно для обработки даже больших ведер (и если вы превысите эту цену разумно). Поскольку это делается параллельно, он завершается менее чем за минуту для 32 000 объектов, которые у меня были. Также я считаю, что их серверы работают на EC2, поэтому связь между заданием и S3 быстро.

кто-нибудь может использовать мой скрипт для своих собственных нужд.

можно подумать, что они сделают чтение поведения по умолчанию, не так ли? : ) Я разделил ваше разочарование при создании пользовательского API для взаимодействия с S3 из решения C#. Вот фрагмент кода, который выполняет загрузку объекта 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), который возвращает функция public-read, BASE_SERVICE_URL - этоs3.amazonaws.com и константа AWS_ACL_HEADER является x-amz-acl. Штекер и DreamMessage вещи, вероятно, будет выглядеть странно для вас, как мы используем Dream framework для оптимизации наших http-коммуникаций. По сути, мы делаем http PUT с указанными заголовками и специальной подписью заголовка для спецификаций aws (см. эту страницу в aws docs для примеров того, как построить заголовок авторизации).

чтобы изменить существующий 1000 объектов ACL, вы можете написать сценарий, но это, вероятно, проще чтобы использовать инструмент GUI для устранения непосредственной проблемы. Лучшее, что я использовал до сих пор от компании под названием морошка для S3; похоже, что у них есть бесплатная 15-дневная пробная версия по крайней мере для одного из их продуктов. Я только что проверил, что это позволит вам выбрать несколько объектов сразу и установить их ACL для публики через контекстное меню. Наслаждайтесь облаком!