Cara membuat 10.000 file di S3 publik


93

Saya memiliki folder dalam ember dengan 10.000 file. Sepertinya tidak ada cara untuk mengupload dan langsung mempublikasikannya. Jadi saya mengupload semuanya, semuanya pribadi, dan saya harus menjadikannya publik.

Saya sudah mencoba konsol aws, itu hanya memberikan kesalahan (berfungsi dengan baik dengan folder dengan lebih sedikit file).

Saya sudah mencoba menggunakan pengorganisasian S3 di Firefox, hal yang sama.

Apakah ada beberapa perangkat lunak atau skrip yang dapat saya jalankan untuk menjadikan semua ini publik?


4
Setiap alat yang saya coba rusak, jadi saya akhirnya menulis skrip PHP yang memakan waktu beberapa jam dan hanya mengulang-ulang setiap objek di keranjang dan membuatnya menjadi publik.
PeterV

Jawaban:


120

Anda dapat membuat kebijakan keranjang (lihat contoh di bawah) yang memberikan akses ke semua file di dalam keranjang. Kebijakan bucket dapat ditambahkan ke bucket melalui konsol AWS.

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

Lihat juga alat pembuat kebijakan berikut yang disediakan oleh Amazon.

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


5
Ini tidak berhasil untuk saya. Beberapa objek masih mengembalikan respons 'akses ditolak' bahkan dengan kebijakan bucket yang diterapkan. Itu disalin-tempel dari atas dengan hanya nama keranjang yang diubah. Saya kira inilah saatnya untuk menulis skrip untuk mengulang semua 1,3 juta objek ... agak menjengkelkan
Blake Miller

Anda perlu mengubah "bucket" menjadi nama bucket Anda
karnage

11
Aku benci harus melakukannya dengan cara ini. Itu JSON yang jelek.
superluminary

7
Hanya Catatan: Ini mungkin tampak jelas, tetapi Anda juga dapat memilih untuk membatasi akses ke spesifik folder : bucket/avatars/*. (Jangan lupa *pada akhirnya. Saya lakukan dan saya berlari berputar-putar untuk sementara waktu.)
bschaeffer

2
@Benjamin Apa yang dimaksud dengan konfigurasi "dasar" untuk Anda tidak sesuai untuk orang lain, karena persyaratan keamanan setiap orang berbeda. AWS menyediakan cara seragam untuk menyesuaikan kebijakan ini. Oleh karena itu, seseorang harus meluangkan waktu untuk mempelajari kebijakan keamanan dengan benar dan tidak menghindar dari beberapa baris sederhana JSON.
afilina

71

Jika Anda mengupload untuk pertama kali, Anda dapat menyetel file menjadi publik saat mengupload di baris perintah:

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

Seperti yang didokumentasikan dalam Menggunakan Perintah s3 Tingkat Tinggi dengan Antarmuka Baris Perintah AWS

Sayangnya itu hanya berlaku ACL saat file diunggah. Itu tidak (dalam pengujian saya) menerapkan ACL ke file yang sudah diunggah.

Jika Anda benar-benar ingin memperbarui objek yang sudah ada, Anda biasanya dapat menyinkronkan keranjang ke dirinya sendiri, tetapi tampaknya ini telah berhenti bekerja.

[Tidak berfungsi lagi] Ini dapat dilakukan dari baris perintah:

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

(Jadi ini tidak lagi menjawab pertanyaan, tetapi meninggalkan jawaban untuk referensi seperti dulu.)


Apakah perintah ini berlaku pada file yang sudah diunggah tetapi belum dibaca publik?
Alston

10
Saat saya mengujinya, sepertinya hanya menambahkan ACL ke file yang baru disinkronkan.
David Roussel

Terima kasih telah memutar ulang, saya juga mengujinya. Apakah ada cara untuk mengubah izin file yang diunggah?
Alston

Oh, tidak heran. Saya bingung dengan ini. Sangat menghargai Anda mengklarifikasi.
Sridhar Sarnobat

Jawaban diperbarui untuk menyertakan cara mengubah file yang ada.
David Roussel

34

Saya harus mengubah beberapa ratus ribu objek. Saya menjalankan instans EC2 untuk menjalankan ini, yang membuat semuanya berjalan lebih cepat. Anda akan ingin memasang aws-sdkpermata terlebih dahulu.

Berikut kodenya:

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

2
Cara sederhana adalah mengunggahnya dengan flag public_read yang disetel di tempat pertama, tetapi jika gagal, ini adalah opsi yang bagus.
superluminary

Kode yang terpotong ini sudah ketinggalan zaman, lihat jawaban
ksarunas

26

Saya memiliki masalah yang sama, solusi oleh @DanielVonFange sudah usang, karena versi baru SDK sudah keluar.

Menambahkan cuplikan kode yang cocok untuk saya sekarang dengan 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

1
Jawaban yang fantastis - hanya skrip yang saya butuhkan di tempat yang sempit
Phantomwhale

@ksarunas Dalam kasus saya, saya perlu mengubah izin publik menjadi pribadi jadi ganti baca-publik dengan pribadi dan akses diubah tetapi tetap, saya dapat mengakses URL?
Rahul

19

Hanya ingin menambahkannya dengan Konsol S3 baru Anda dapat memilih folder Anda dan memilih Make publicuntuk membuat semua file di dalam folder menjadi publik. Ini berfungsi sebagai tugas latar belakang sehingga harus menangani sejumlah file.

Jadikan Publik


5
Sayangnya butuh waktu lama dan Anda tidak bisa menutup browser saat perintah dijalankan. Browser Anda mengirimkan 2 permintaan untuk setiap file, dalam kasus saya, dua permintaan tersebut membutuhkan waktu 500ms. Jika Anda memiliki banyak file, itu akan memakan waktu lama = (
Herlon Aguiar

2
Dan, ada masalah lain: ini akan dipublikasikan sepenuhnya. Jika Anda hanya menginginkan akses baca umum, itu masalah.
Marcelo Agimóvel

BERHATI-HATI - Saya melakukan ini untuk Umum dan "bilah kemajuan" yang muncul begitu halus, saya pikir itu sudah selesai. Saya memeriksa dan mungkin menghabiskan satu jam mengerjakan ini sebelum saya menyadari Anda mengklik Jadikan Publik dan "bilah kemajuan kecil yang tidak terlihat muncul" ... grrr ... karena saya menutup jendela browser sekitar 10 kali, saya berasumsi bahwa membunuhnya setiap kali . Saya menjalankannya sekarang - cukup cepat - mungkin 20 menit untuk 120 ribu gambar
Scott

12

Menggunakan 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)}'


3
tidak bisakah Anda menggunakan pipa untuk grep daripada menulis ke disk dengan semua files.txt? Ini bisaaws s3 ls s3://bucket-name --recursive | grep .jpg | awk '{cmd="aws s3api put-object-acl --acl public-read --bucket bucket-name --key "$4;system(cmd)}'
sakurashinken

3

Sempat ini perlu sendiri tapi banyaknya file membuatnya JAUH lambat untuk dilakukan secara serial. Jadi saya menulis naskah yang melakukan itu pada iron.io 's barang besi layanan. 500 jam komputasi gratis mereka per bulan sudah cukup untuk menangani bucket yang besar (dan jika Anda melebihi itu, harganya masuk akal). Karena dilakukan secara paralel, penyelesaiannya dalam waktu kurang dari satu menit untuk 32.000 objek yang saya miliki. Saya juga yakin server mereka berjalan pada EC2 sehingga komunikasi antara pekerjaan dan S3 cepat.

Siapa saja boleh menggunakan skrip saya untuk kebutuhan mereka sendiri.


2

Lihat BucketExplorer yang mengelola operasi massal dengan sangat baik dan merupakan Klien S3 yang solid.


3
Sekarang juga dimungkinkan untuk mengubah izin secara massal di Cyberduck (gratis) melalui palet Info.
Taylor Edmiston

BucketExplorer hanya berguna jika Anda memiliki izin untuk mencantumkan semua keranjang. Jauh lebih baik menggunakan CLI atau SDK untuk operasi ini dan membiarkan pengguna Anda dengan izin terbatas.
perilandmishap

0

Anda akan berpikir mereka akan membuat publik membaca perilaku default, bukan? :) Saya membagikan rasa frustrasi Anda saat membangun API khusus untuk berinteraksi dengan S3 dari solusi C #. Berikut ini cuplikan yang menyelesaikan pengunggahan objek S3 dan menyetelnya ke akses baca publik secara default:

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

Fungsi ToACLString (acl) mengembalikan bacaan publik , BASE_SERVICE_URL adalah s3.amazonaws.com dan konstanta AWS_ACL_HEADER adalah x-amz-acl . Plug dan item DreamMessage kemungkinan akan terlihat aneh bagi Anda karena kami menggunakan kerangka Dream untuk merampingkan komunikasi http kami. Pada dasarnya kami melakukan PUT http dengan header yang ditentukan dan tanda tangan header khusus sesuai spesifikasi aws (lihat halaman ini di dokumen aws untuk contoh bagaimana membuat header otorisasi).

Untuk mengubah 1000 objek ACL yang sudah ada, Anda dapat menulis skrip tetapi mungkin lebih mudah menggunakan alat GUI untuk segera memperbaiki masalah. Yang terbaik yang pernah saya gunakan sejauh ini adalah dari perusahaan bernama cloudberry untuk S3; tampaknya mereka memiliki uji coba gratis selama 15 hari untuk setidaknya satu produk mereka. Saya baru saja memverifikasi bahwa itu akan memungkinkan Anda untuk memilih beberapa objek sekaligus dan mengatur ACL mereka ke publik melalui menu konteks. Selamat menikmati cloud!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.