Как сделать 10 000 файлов в S3 общедоступными - PullRequest
77 голосов
/ 29 июня 2010

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

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

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

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

Ответы [ 9 ]

108 голосов
/ 09 февраля 2011

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

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

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

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

53 голосов
/ 13 января 2016

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

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

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

32 голосов
/ 04 октября 2011

Мне пришлось поменять несколько сотен тысяч предметов.Я запустил экземпляр 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
22 голосов
/ 13 июля 2015

У меня была та же проблема, решение @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
14 голосов
/ 07 августа 2017

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

Make Public

4 голосов
/ 10 декабря 2018

Используя 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)}'

2 голосов
/ 30 января 2013

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

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

2 голосов
/ 30 июня 2010

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

0 голосов
/ 30 июня 2010

Вы могли бы подумать, что они сделают публичным чтение поведения по умолчанию, не так ли? :) Я поделился своим разочарованием при создании пользовательского 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 для оптимизации наших http-коммуникаций. По сути, мы выполняем HTTP PUT с указанными заголовками и специальной подписью заголовка для каждой спецификации AWS (см. Эту страницу в документах aws для примеров того, как создать заголовок авторизации).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...