S3'te 10.000 dosya nasıl herkese açık hale getirilir


93

Bir pakette 10.000 dosyalık bir klasörüm var. Bunları yüklemenin ve hemen herkese açık hale getirmenin bir yolu yok gibi görünüyor. Bu yüzden hepsini yükledim, özeller ve hepsini herkese açık hale getirmem gerekiyor.

Aws konsolunu denedim, sadece bir hata veriyor (daha az dosya içeren klasörlerde iyi çalışıyor).

Firefox'ta S3 düzenlemeyi kullanmayı denedim, aynı şey.

Tüm bunları halka açık hale getirmek için çalıştırabileceğim bir yazılım veya komut dosyası var mı?


4
Denediğim her araç çöktü, bu yüzden birkaç saat süren ve paketteki her nesneyi dolaşan ve herkese açık hale getiren bir PHP betiği yazdım.
PeterV

Yanıtlar:


120

Paketteki tüm dosyalara erişim sağlayan bir paket politikası oluşturabilirsiniz (aşağıdaki örneğe bakın). Paket politikası, AWS konsolu aracılığıyla bir pakete eklenebilir.

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

Amazon tarafından sağlanan aşağıdaki politika oluşturma aracına da bakın.

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


5
Bu benim için işe yaramadı. Bazı nesneler, paket politikası yürürlükteyken bile 'erişim reddedildi' yanıtını döndürüyor. Yukarıdan kopyalayıp sadece paket adı değiştirilerek yapıştırılır. Sanırım 1,3 milyon nesnenin tamamında döngü yapmak için bir komut dosyası yazmanın zamanı geldi ... biraz rahatsız edici
Blake Miller

"kova" yı
kovanızın

11
Bunu bu şekilde yapmak zorunda kalmaya gücendim. Bu biraz çirkin JSON.
superluminary

7
Sadece bir not: Bu açık gibi görünebilir, ama aynı zamanda belirli limit erişimine seçebilir klasörler : bucket/avatars/*. (Sonunu unutma *. Yaptım ve bir süre daireler çizerek koştum.)
Sonunu unutma Yaptım bschaeffer

2
@Benjamin Sizin için "temel" yapılandırma nedir, başkaları için uygun değildir, çünkü herkesin güvenlik gereksinimleri farklıdır. AWS, bu politikaları özelleştirmek için tek tip bir yol sağlar. Bu nedenle, güvenlik politikalarını doğru bir şekilde öğrenmek için zaman ayırmalı ve birkaç basit JSON satırından çekinmemelisiniz.
afilina

71

İlk kez yüklüyorsanız, dosyaları komut satırından yüklemede herkese açık olacak şekilde ayarlayabilirsiniz:

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

AWS Komut Satırı Arayüzü ile Yüksek Seviye s3 Komutlarını Kullanma konusunda belgelendiği gibi

Maalesef ACL'yi yalnızca dosyalar karşıya yüklendiğinde uygular. (Benim testimde) ACL'yi önceden yüklenmiş dosyalara uygulamıyor.

Mevcut nesneleri güncellemek istiyorsanız, paketi kendisiyle senkronize edebiliyordunuz, ancak bu çalışmayı durdurmuş gibi görünüyor.

[Artık çalışmıyor] Bu, komut satırından yapılabilir:

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

(Yani bu artık soruyu yanıtlamaz, ancak işe yaradığı gibi referans için yanıtı bırakır.)


Bu komut, önceden yüklenmiş ancak henüz genel olarak okunmamış dosyalar üzerinde etkili mi?
Alston

10
Test ettiğimde, ACL'yi yalnızca yeni senkronize edilen dosyalara ekliyor gibi görünüyor.
David Roussel

Tekrar için teşekkürler, ben de test ettim. Karşıya yüklenen dosyaların iznini toplu olarak değiştirmenin herhangi bir yolu var mı?
Alston

Oh, şaşılacak bir şey yok. Kafam karıştı. Açıkladığın için gerçekten minnettarım.
Sridhar Sarnobat

Cevap, mevcut dosyaların nasıl değiştirileceğini içerecek şekilde güncellendi.
David Roussel

34

Birkaç yüz bin nesneyi değiştirmek zorunda kaldım. Bunu çalıştırmak için bir EC2 bulut sunucusu başlattım, bu da her şeyin daha hızlı ilerlemesini sağlıyor. Yüklemek isteyeceksinizaws-sdk mücevheri .

İşte 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

2
Basit yol, onları ilk etapta public_read bayrağı ayarlanmış olarak yüklemektir, ancak başarısız olursa, bu iyi bir seçenektir.
superluminary

Bu kod Kesik modası geçmiş, benim bakınız cevap
ksarunas

26

Aynı sorunu yaşadım, SDK'nın yeni sürümü çıktığı için @DanielVonFange'ın çözümü modası geçmiş.

AWS Ruby SDK ile şu anda benim için çalışan kod parçacığı eklemek:

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
Harika cevap - dar bir noktada ihtiyacım olan senaryo
Phantomwhale

@ksarunas Benim durumumda, genel izinleri özel olarak değiştirmem gerekiyor, bu yüzden genel okumayı özel ile değiştirmem gerekiyor ve erişim değişti ama yine de URL'ye erişebilir miyim?
Rahul

19

Yeni S3 Konsolu Make publicile klasörlerinizi seçebilir ve klasörlerin içindeki tüm dosyaları herkese açık hale getirebilirsiniz. Arka plan görevi olarak çalışır, bu nedenle herhangi bir sayıda dosyayı işlemelidir.

Kamu yapmak


5
Maalesef uzun zaman alıyor ve komut çalıştırılırken tarayıcıyı kapatamazsınız. Tarayıcınız her dosya için 2 istek gönderiyor, benim durumumda iki istek 500ms sürdü. Çok fazla dosyanız varsa, uzun sürecek = (
Herlon Aguiar

2
Ve başka bir sorun daha var: bu tamamen kamuoyuna açıklanacak. Yalnızca halka açık erişim istiyorsanız, bu bir problemdir.
Marcelo Agimóvel

ÇOK FARKINDA OLUN - Bunu Genel Yap'ı yaptım ve açılan "ilerleme çubuğu" o kadar ince ki, bittiğini düşündüm. Kontrol ettim ve muhtemelen bu konu üzerinde çalışarak bir saat geçirdim, bunu farkına varmadan önce Herkese Açık Yap'ı tıkladığında küçük ince "ilerleme çubuğu görünüyor" ... grrr ... tarayıcı penceresini yaklaşık 10 kez kapattığım için, her seferinde onu öldürdüğünü varsayıyorum . Şimdi çalıştırıyorum - oldukça hızlı - 120.000 görsel için belki 20 dakika
Scott

13

Cli kullanarak:

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
Tüm files.txt ile diske yazmak yerine grep için boru kullanamaz mıydınız? Bu olabiliraws 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

@sakurashinken yanıtı mükemmel çalışıyor. Eğer bunu görürsen. Kullanılacak olan bu.
ajpieri

3

Buna ihtiyacım vardı ama dosya sayısı seri olarak yapmayı yavaşlatıyor. Yazdı Ben So bir senaryo üzerinde yapar iron.io s' demir işçisi hizmeti. Aylık 500 ücretsiz işlem saati, büyük paketleri bile işlemek için yeterlidir (ve bunu aşarsanız, fiyatı makuldür). Paralel olarak yapıldığından, sahip olduğum 32.000 nesne için bir dakikadan daha kısa sürede tamamlanıyor. Ayrıca sunucularının EC2 üzerinde çalıştığına inanıyorum, bu nedenle iş ve S3 arasındaki iletişim hızlı.

Herhangi biri senaryomu kendi ihtiyaçları için kullanabilir.


2

BucketExplorer'a bir göz atın , toplu işlemleri çok iyi yönetiyor ve sağlam bir S3 İstemcisi.


3
Ayrıca Cyberduck'ta (ücretsiz) izinleri Bilgi paleti aracılığıyla toplu olarak değiştirmek de artık mümkün.
Taylor Edmiston

BucketExplorer, yalnızca tüm paketleri listeleme izniniz varsa kullanışlıdır. Bu işlem için CLI veya SDK kullanmak ve kullanıcılarınıza kısıtlı izinler bırakmak çok daha iyi.
perilandmishap

0

Varsayılan davranışı halka okutacaklarını düşünürsünüz, değil mi? :) Bir C # çözümünden S3 ile arabirim oluşturmak için özel bir API oluştururken hayal kırıklığınızı paylaştım. İşte bir S3 nesnesini yüklemeyi ve onu varsayılan olarak herkese açık erişime ayarlamayı başaran snippet:

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) işlevi döner halka okunması , BASE_SERVICE_URL olan s3.amazonaws.com ve AWS_ACL_HEADER sabit x amz-ACL . Eklenti ve DreamMessage öğeleri, http iletişimimizi kolaylaştırmak için Dream çerçevesini kullandığımız için muhtemelen size garip görünecektir. Esasen, belirtilen başlıklar ve aws belirtimlerine göre özel bir başlık imzasıyla bir http PUT yapıyoruz ( aws belgelerinde bu sayfaya bakın) yetkilendirme başlığının nasıl oluşturulacağına ilişkin örnekler ).

Mevcut 1000 nesne ACL'sini değiştirmek için bir komut dosyası yazabilirsiniz, ancak acil sorunu çözmek için bir GUI aracı kullanmak muhtemelen daha kolaydır. Şimdiye kadar kullandığım en iyisi S3 için cloudberry adlı bir şirketten ; Görünüşe göre ürünlerinden en az biri için 15 günlük ücretsiz deneme süreleri var. Bir kerede birden fazla nesneyi seçmenize ve içerik menüsü aracılığıyla ACL'lerini herkese açık olarak ayarlamanıza izin vereceğini doğruladım. Bulutun tadını çıkarın!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.