Jak upublicznić 10 000 plików w S3

Mam folder w wiadrze z 10 000 plikami. Wydaje się, że nie ma sposobu, aby je przesłać i upublicznić od razu. Wrzuciłem je wszystkie, są prywatne i muszę je upublicznić.

Próbowałem konsoli aws, po prostu daje błąd(działa dobrze z folderami z mniejszą ilością plików).

Próbowałem używać S3 w Firefoksie, to samo.

Czy jest jakieś oprogramowanie lub jakiś skrypt, który mogę uruchomić, aby upublicznić to wszystko?

Author: Benjamin, 2010-06-29

8 answers

Możesz wygenerować politykę bucket (zobacz przykład poniżej), która daje dostęp do wszystkich plików w bucket. Zasady bucket można dodać do bucket za pomocą konsoli AWS.

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

Spójrz również na następujące narzędzie generatora zasad dostarczone przez Amazon.

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

 102
Author: Rajiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 10:38:12

Jeśli przesyłasz pliki po raz pierwszy, możesz ustawić, aby były publiczne podczas przesyłania w wierszu poleceń:

aws s3 sync . s3://my-bucket/path --acl public-read

Jak udokumentowano w używanie poleceń S3 wysokiego poziomu z interfejsem wiersza poleceń AWS

Niestety stosuje ACL tylko wtedy, gdy pliki są przesyłane. Nie stosuje (w moich testach) ACL do już przesłanych plików.

Jeśli chcesz zaktualizować istniejące obiekty, możesz zsynchronizować wiadro z samym sobą, ale wydaje się, że przestały działać.

[już nie działa] można to zrobić z linii poleceń:

aws s3 sync s3://my-bucket/path s3://my-bucket/path --acl public-read

(więc to już nie odpowiada na pytanie, ale zostawia odpowiedź dla odniesienia, jak kiedyś działało.)

 42
Author: David Roussel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-30 09:23:48

Musiałem zmienić kilkaset tysięcy przedmiotów. Odpaliłem instancję EC2, żeby to uruchomić, co sprawia, że wszystko idzie szybciej. Najpierw musisz zainstalować gem aws-sdk.

Oto kod:

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
 31
Author: Daniel Von Fange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-04 15:12:13

Miałem ten sam problem, rozwiązanie przez @ DanielVonFange jest nieaktualne, ponieważ nowa wersja SDK jest na zewnątrz.

Dodanie fragmentu kodu, który działa mi teraz z 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
 20
Author: ksarunas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 09:16:03

Chciałem tylko dodać, że w nowej konsoli S3 można wybrać folder(y) i wybrać Make public, aby wszystkie pliki wewnątrz folderów były publiczne. Działa jako zadanie w tle, więc powinno obsługiwać dowolną liczbę plików.

Upublicznij

 13
Author: Selcuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 06:44:42

BucketExplorer bardzo dobrze zarządza operacjami masowymi i jest solidnym klientem S3.

 2
Author: willbt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-30 03:06:36

Sam miałem taką potrzebę, ale ilość plików sprawia, że powoli robi się to w trybie szeregowym. Więc napisałem skrypt {[2] } który robi to na iron.io ' S IronWorker service. Ich 500 darmowych godzin obliczeniowych miesięcznie wystarczy, aby obsłużyć nawet duże wiadra (a jeśli przekroczysz, że cena jest rozsądna). Ponieważ odbywa się to równolegle, kończy się w mniej niż minutę dla 32 000 obiektów, które miałem. Również uważam, że ich serwery działają na EC2, więc komunikacja między zadaniem a S3 jest szybki.

Zapraszam wszystkich do korzystania z mojego skryptu dla własnych potrzeb.

 2
Author: Eric Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 20:47:45

Myślisz, że upublicznią domyślne zachowanie, prawda? : ) Podzielałem Twoją frustrację podczas budowania niestandardowego API do interfejsu z S3 z rozwiązania C#. Oto fragment, który wykonuje przesyłanie obiektu S3 i ustawia go domyślnie na dostęp do publicznego odczytu:

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));
     }
}

Funkcja toaclstring (acl) zwraca public-read, BASE_SERVICE_URL to s3.amazonaws.com a stała AWS_ACL_HEADER to x-amz-acl . Wtyczka i Rzeczy DreamMessage będą prawdopodobnie wyglądać dziwnie, ponieważ używamy Dream framework do usprawnienia naszej komunikacji http. Zasadniczo robimy HTTP PUT z podanymi nagłówkami i specjalną sygnaturą nagłówka dla specyfikacji aws (zobacz tę stronę w AWS docs, aby znaleźć przykłady jak skonstruować nagłówek autoryzacji).

Aby zmienić istniejący obiekt 1000 ACLs, możesz napisać skrypt, ale prawdopodobnie łatwiej jest użyć narzędzia GUI, aby rozwiązać natychmiastowy problem. Na najlepsze, z których dotychczas korzystałem, to firma o nazwie cloudberry dla S3; wygląda na to, że mają bezpłatną wersję próbną 15 dla co najmniej jednego z ich produktów. Właśnie zweryfikowałem, że pozwoli Ci to wybrać wiele obiektów na raz i ustawić ich ACL na publiczny za pomocą menu kontekstowego. Ciesz się chmurą!

 0
Author: Tahbaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-30 03:39:13