Dosyaları S3 paketleri arasında taşımanın en iyi yolu?


91

Bazı dosyaları bir üretim paketinden bir geliştirme paketine günlük olarak kopyalamak istiyorum.

Örneğin: productionbucket / feed / feedname / date'ı developmentbucket / feed / feedname / date konumuna kopyalayın

İstediğim dosyalar klasör yapısında çok derin olduğundan, her klasöre gidip kopyalayıp yapıştırmak çok zaman alıyor.

Her bir gruba sürücü takmak ve bir Windows toplu komut dosyası yazmakla uğraştım, ancak bu çok yavaş ve tüm dosyaları / klasörleri gereksiz yere yerel sunucuya indiriyor ve tekrar yedekliyor.

Yanıtlar:


111

Güncelleme

As Alberge tarafından işaret (+1), günümüzde mükemmel AWS Komut Satırı Arabirimi (neredeyse) her şeyi AWS ile etkileşim için çok yönlü bir yaklaşım sağlar - bu arada en hizmetlerin API'leri kapsar ve ayrıca özellikleri üst düzey S3 komutları ile başa çıkmak için senin özel olarak kullanın, S3 için AWS CLI referansına bakın :

  • sync - Dizinleri ve S3 öneklerini senkronize eder. Kullanım durumunuz Örnek 2 kapsamındadır (daha ayrıntılı kullanım --exclude,--include vb taşıma önek de kullanılabilir):

    Aşağıdaki sync komutu, s3 nesnelerini kopyalayarak, belirli bir önek ve paket altındaki nesneleri, belirtilen başka bir önek ve paket altındaki nesnelere senkronize eder. [...]

    aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
    

Tamlık için, daha düşük seviyeli S3 komutlarının s3api alt komutu aracılığıyla hala mevcut olduğundan bahsedeceğim ; bu, herhangi bir SDK tabanlı çözümü, daha yüksek seviye işlevselliğini nihayetinde benimsemeden önce doğrudan AWS CLI'ye çevirmeye izin verecektir.


İlk Cevap

Dosyaları S3 paketleri arasında taşımak, PUT Object - Copy API (ardından DELETE Object ) aracılığıyla gerçekleştirilebilir:

PUT işleminin bu uygulaması, Amazon S3'te zaten depolanan bir nesnenin bir kopyasını oluşturur. Bir PUT kopyalama işlemi, bir GET ve ardından bir PUT gerçekleştirmekle aynıdır. İstek başlığı x-amz-copy-source eklenmesi, PUT işleminin kaynak nesneyi hedef pakete kopyalamasını sağlar. Kaynak

Mevcut tüm AWS SDK'ları için ilgili örnekler vardır, bkz . Tek Bir İşlemde Nesneleri Kopyalama . Doğal olarak, komut dosyası tabanlı bir çözüm burada bariz ilk tercih olacaktır, bu nedenle Ruby için AWS SDK Kullanarak Bir Nesneyi Kopyalayın iyi bir başlangıç ​​noktası olabilir; Bunun yerine Python'u tercih ederseniz, aynısı boto ile de elde edilebilir, tabii ki copy_key()boto'nun S3 API dokümantasyonundaki yönteme bakın .

PUT Objectyalnızca dosyaları kopyalar; bu nedenle, DELETE Objectbaşarılı bir kopyalama işleminden sonra bir dosyayı hareketsiz olarak açıkça silmeniz gerekir , ancak bu, grubu ve dosya adlarını işleyen genel komut dosyası yerine geldiğinde yalnızca birkaç satır daha olacaktır (ilgili örnekler de vardır) bkz. örneğin İstek Başına Bir Nesneyi Silme ).


İşlemi .NET'te AWS SDK ile komut dosyası oluşturmaya son verdim
Matt Dell

1
@MattDell, bu soruya .NET cevabını ekleyebilir misiniz?
balexandre

1
Bu konuda berbat olan şey, Amazon'un copy komutunun başarılı olup olmadığı konusunda çok net olmaması, bu nedenle işlemden sonra silme işlemi tehlikeli görünüyor.
James McMahon

Daha açık olmak gerekirse, özellikle Java API'sinden bahsediyordum. Ayrı bir soru açtım stackoverflow.com/questions/17581582
James McMahon

Hala tek bir kimlik ve anahtar yapmanın basit bir yoluna ihtiyacımız var. Özellikle kovalar hesaplar arasındaysa.
CMCDragonkai

66

Yeni resmi AWS CLI, .NET Framework'ün işlevselliğinin çoğunu yerel olarak destekler s3cmd. Daha önce s3cmdböyle şeyler yapmak için Ruby AWS SDK'yı kullanıyordum , ancak resmi CLI bunun için harika çalışıyor.

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

aws s3 sync s3://oldbucket s3://newbucket

4
Bu, listenin en üstüne çıkarılmalıdır. Paketleri senkronize etmenin uygun yolu ve tüm bu yanıtlarda en güncel olanı budur.
dft

403 erişim reddedildi hatalarıyla ilgili sorununuz varsa, bu blog gönderisine bakın. Yardımcı oldu. alfielapeter.com/posts/…
crlane

3
bölgeler arası kopyaaws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
eşdeğer 8

Bu ower gecesini sunucuda çalıştırmanız gerekiyorsa nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 & thegeekstuff.com/2010/12/5-ways-to-execute-linux-command'ı
eşdeğeri8

@alberge Komut satırı bağımsız değişkenini kullanarak erişim anahtarı ve sırrı sağlamanın herhangi bir yolu var mı?
EmptyData

30

Bunun için gerekli kopyaları paralel hale getirmek için kendi özel aracımı yazmak için günler harcadım, ancak daha sonra paketleri büyük paralelleştirme ile senkronize etmek için AWS S3 CLI senkronizasyon komutunu nasıl edineceğime dair belgelerle karşılaştım . Aşağıdaki komutlar, AWS CLI'ye işleri yürütmek için (her biri küçük bir dosya veya çok parçalı bir kopyanın bir parçası) 1.000 iş parçacığı kullanmasını ve 100.000 işi ileriye bakmasını söyleyecektir:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Bunları çalıştırdıktan sonra, aşağıdaki gibi basit senkronizasyon komutunu kullanabilirsiniz:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Bir m4.xlarge makinesinde (AWS'de - 4 çekirdekli, 16 GB RAM), benim durumum için (3-50 GB dosya) senkronizasyon / kopyalama hızı yaklaşık 9,5 MiB / sn'den 700 + MiB / sn'ye çıktı, Varsayılan yapılandırmaya göre 70x.

Güncelleme: S3CMD'nin yıllar içinde güncellendiğini ve bu değişikliklerin artık yalnızca çok sayıda küçük dosyayla çalışırken etkili olduğunu unutmayın. Ayrıca, Windows'ta (yalnızca Windows'ta) S3CMD'nin genel işlem hacmi açısından ciddi şekilde sınırlı olduğunu ve hangi bulut sunucusu boyutu veya ayarları kullanırsanız kullanın işlem başına yalnızca 3 Gb / sn'ye ulaşabileceğini unutmayın. S5CMD gibi diğer sistemlerde de aynı sorun var. Bunun hakkında S3 ekibiyle konuştum ve araştırıyorlar.


Teşekkürler, yapılandırmanızla 900+ MiB / sn'yi aşmayı başardınız, varsayılana göre çok yüksek hız.
kozyr

@James: API bizi bu kadar yüksek hızlı transferler elde etmemizi sınırlıyor mu? 2 GB dosya aktarmak için bir T2 EC2 makinesinden AWS Java SDK ve CLI tarafından sağlanan transfermanager api'sini kullanıyorum. Zaman farkı ~ 5,5 kat (CLI - 14 saniye) ile (SDK - 80 saniye) arasındadır. Ayrıca, SDK'da s3.max_queue_size için herhangi bir seçenek göremiyorum. Herhangi bir yorum?
Dwarrior

@Dwarrior, bu ayarların her ikisi de CLI içindir. Bir SDK kullanırken, sıradaki tüm istekleri kendiniz yönetmeniz gerekir. AWS desteği, Linux kullanan EC2 ve S3 arasındaki olası maksimum aktarım hızının (yani, ilan edilen EC2 bulut sunucusu aktarım hızı) yaklaşık% 80'ine ulaştığını iddia ediyor. Windows, AWS'de ikinci sınıf bir vatandaş ve Amazon tarafından sağlanan araçlarla bunun yarısını bile alamıyor ve görünüşe göre bunu düzeltmeyi planlamıyorlar. :-( Bir T2 makinesiyle AWS, tam olarak ne kadar bant genişliği alacağınızı belirtmez, ancak bir S3 VPC uç noktası ayarlarsanız işler biraz iyileşir.
James

@James Dosya listemi kıvılcımdaki kümeye paralel hale getirecek, her bölüm içinde paralelleştirmeyle birleştirecek ve ardından herhangi bir dosya için paralel yüklemeler için transfermanager'ı kullanana kadar gittim. Bunu yaptıktan sonra 80 saniyeden 45 saniyeye bir gelişme görüyorum, ancak CLI'nin EC2'den işleyişinde hala eksik. Yine de bu kurulum için teşekkürler. Pencerelere göre performansı da önemli ölçüde artırdı. SDK'da maksimum bağlantı ayarlayabiliriz ancak kuyruk boyutunu ayarlayamayız, bu yüzden bununla ayrılmak zorunda kalabileceğimizi düşünüyorum. :) Sıralamanın nasıl yönetileceğine dair herhangi bir işaret, temel olarak alabileceğim herhangi bir örnek kod.
Dwarrior

2
S5Cmd ( github.com/peakgames/s5cmd ), AWS tarafından desteklenen kişilerin maksimum aktarım hızı için kullandıkları yardımcı programdır. Örnek boyutu büyük bir fark yaratır. Yeni c5n serisi, ağ oluşturma için çok uygun maliyetli ve inanılmaz bir 100 Gb / sn'ye kadar çıkıyor.
James

29

Bir kovadan diğerine veya aynı kovaya taşımak / kopyalamak için s3cmd aracını kullanıyorum ve iyi çalışıyor. Örneğin:

s3cmd cp --recursive s3://bucket1/directory1 s3://bucket2/directory1
s3cmd mv --recursive s3://bucket1/directory1 s3://bucket2/directory1

14

.NET Örneği istendiği gibi:

using (client)
{
    var existingObject = client.ListObjects(requestForExisingFile).S3Objects; 
    if (existingObject.Count == 1)
    {
        var requestCopyObject = new CopyObjectRequest()
        {
            SourceBucket = BucketNameProd,
            SourceKey = objectToMerge.Key,
            DestinationBucket = BucketNameDev,
            DestinationKey = newKey
        };
        client.CopyObject(requestCopyObject);
    }
}

müşteri gibi

var config = new AmazonS3Config { CommunicationProtocol = Protocol.HTTP, ServiceURL = "s3-eu-west-1.amazonaws.com" };
var client = AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretAccessKey, config);

Daha iyi bir yol olabilir, ancak bazı dosyaların aktarılmasını sağlamak için yazdığım hızlı bir kod.


1
Bu iyi bir çözüm gibi görünüyor. ancak 2 paket için farklı kimlik bilgilerine sahipseniz ne olur?
Roee Gavirel

2
Kimlik bilgileri, kopyalama komutunun yürütülmesi içindir. Bu tek kimlik bilgileri, kaynak / hedef paketlerde uygun okuma / yazma izinlerini gerektirir. Hesaplar arasında kopyalamak için, diğer hesabın kimlik bilgilerinden pakete erişime izin vermek için bir paket politikası kullanmanız gerekir.
Matt Houser

9

AWS içinde bir unix ana makineniz varsa, s3tools.org'dan s3cmd'yi kullanın. Anahtarınızı geliştirme paketinize okuma erişimi sağlayacak şekilde izinleri ayarlayın. O zaman koş:

s3cmd cp -r s3://productionbucket/feed/feedname/date s3://developmentbucket/feed/feedname

Sunucu tarafı mı? S3 için sunucu tarafı yoktur. Tüm komutlar uzak bir istemciden gerçekleştirilir.
dk.

Bu arada, bu komut internet üzerinden gayet iyi çalışıyor gibi görünüyor!
Gabe Kopley

3
"Sunucu tarafı" sorusu geçerlidir. S3cmd aktarımı istemciye tüm verileri yönlendiriyor mu yoksa doğrudan S3'ten S3'e aktarım mı? İlki ise, harici WAN aktarımlarından kaçınmak için bunu AWS bulutunda çalıştırmak tercih edilir.
Bruce Edge

1
Kopyalama, S3'te uzaktan gerçekleşir.
dk.

Ayrıca, yanlışlıkla bu işlemi kesintiye s3cmd cp--skip-existings3cmd sync
uğratırsanız

9

Benim için şu komut çalıştı:

aws s3 mv s3://bucket/data s3://bucket/old_data --recursive

2
basit ve anlaşılır bir çözüm ... aws cli ile yapılabiliyorken, neden bu kadar basit bir görev için 3. parti araçları veya geçici çözümleri kullanasınız ki ?!
Fr0zenFyr

7

Bunu yapmak için bir yakut sınıfı: https://gist.github.com/4080793

Örnek kullanım:

$ gem install aws-sdk
$ irb -r ./bucket_sync_service.rb
> from_creds = {aws_access_key_id:"XXX",
                aws_secret_access_key:"YYY",
                bucket:"first-bucket"}
> to_creds = {aws_access_key_id:"ZZZ",
              aws_secret_access_key:"AAA",
              bucket:"first-bucket"}
> syncer = BucketSyncService.new(from_creds, to_creds)
> syncer.debug = true # log each object
> syncer.perform

6

Aslında son zamanlarda AWS s3 arayüzünde kopyala + yapıştır işlemini kullanıyorum. Kopyalamak istediğiniz dosyalara gidin, "İşlemler" -> "Kopyala" yı tıklayın ve ardından hedef gruba ve "İşlemler" -> "Yapıştır" a gidin

Dosyaları oldukça hızlı aktarır ve herhangi bir programlama gerektirmeyen daha az kıvrımlı bir çözüm veya bunun gibi en iyi çözümler gibi görünüyor.


Evet. Birkaç dakika önce aynı şeyi keşfettim. Oy verdim, böylece daha fazla insan zamandan tasarruf edecek :)
JCarlosR

Bunu 134.364 nesne ile bir kovada kopyalamaya denedim. Saatler sürdü. Ve hedef sadece 134.333 dosya ile sonuçlandı - kopya "Başarılı" olduğunu söylüyordu, ancak eksik dosyalar için bir açıklama yoktu.
2019

Buradaki diğer yazılarda açıklanan "aws s3 sync" tipi komutunu kullanarak, 134.364 nesnenin tümü yaklaşık 20 dakika içinde kopyalandı.
2019

4

Snowplow'daki ETL işlerimizde tam olarak bu sorunu yaşadık, bu yüzden paralel dosya kopyalama kodumuzu (Ruby, Fog'un üzerine inşa edilmiştir ), Sluice adlı kendi Ruby mücevherine çıkardık:

https://github.com/snowplow/sluice

Sluice ayrıca S3 dosyası silme, taşıma ve indirme işlemlerini de gerçekleştirir; tümü paralelleştirilmiş ve bir işlem başarısız olursa otomatik yeniden deneme ile (ki bu şaşırtıcı bir şekilde sık sık yapar). Umarım yararlıdır!



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.