s3cmd를 사용하여 한 S3 버킷에서 다른 버킷으로 모든 파일을 복사 할 수 있습니까?
s3cmd에 만족하지만 한 가지 문제가 있습니다. 하나의 S3 버킷에서 다른 버킷으로 모든 파일을 복사하는 방법은 무엇입니까? 가능할까요?
편집 : boto와 함께 Python을 사용하여 버킷간에 파일을 복사하는 방법을 찾았습니다.
from boto.s3.connection import S3Connection
def copyBucket(srcBucketName, dstBucketName, maxKeys = 100):
conn = S3Connection(awsAccessKey, awsSecretKey)
srcBucket = conn.get_bucket(srcBucketName);
dstBucket = conn.get_bucket(dstBucketName);
resultMarker = ''
while True:
keys = srcBucket.get_all_keys(max_keys = maxKeys, marker = resultMarker)
for k in keys:
print 'Copying ' + k.key + ' from ' + srcBucketName + ' to ' + dstBucketName
t0 = time.clock()
dstBucket.copy_key(k.key, srcBucketName, k.key)
print time.clock() - t0, ' seconds'
if len(keys) < maxKeys:
print 'Done'
break
resultMarker = keys[maxKeys - 1].key
동기화는 복사만큼 간단합니다. 키에 사용할 수있는 ETag, 크기 및 마지막 수정 필드가 있습니다.
아마도 이것은 다른 사람들에게도 도움이 될 것입니다.
s3cmd sync s3://from/this/bucket/ s3://to/this/bucket/
사용 가능한 옵션은 다음을 사용하십시오. $s3cmd --help
AWS CLI는 작업을 완벽하게 수행하는 것으로 보이며 공식적으로 지원되는 도구라는 보너스가 있습니다.
aws s3 sync s3://mybucket s3://backup-mybucket
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
내가이 글을 쓸 때 가장 많이 찬성 한 답은 다음과 같습니다.
s3cmd sync s3://from/this/bucket s3://to/this/bucket
유용한 답변입니다. 그러나 때로는 동기화가 필요한 것이 아닙니다 (파일 삭제 등). 단순히 버킷간에 여러 파일을 복사하는이 비 스크립팅 대안을 알아내는 데 오랜 시간이 걸렸습니다. (아래에 표시된 경우에는 버킷 사이가 아닙니다. 실제 폴더가 아닌 폴더 사이에 있지만 버킷 사이에서 똑같이 잘 작동합니다.)
# Slightly verbose, slightly unintuitive, very useful:
s3cmd cp --recursive --exclude=* --include=file_prefix* s3://semarchy-inc/source1/ s3://semarchy-inc/target/
위 명령에 대한 설명 :
- –recursive
내 마음에 내 요구 사항은 재귀 적이 지 않습니다. 나는 단순히 여러 파일을 원합니다. 그러나이 컨텍스트에서 재귀는 s3cmd cp에게 여러 파일을 처리하도록 지시합니다. 큰. - –exclude
문제를 생각하는 것은 이상한 방법입니다. 모든 파일을 반복적으로 선택하여 시작합니다. 다음으로 모든 파일을 제외합니다. 무엇을 기다립니다? - –include
이제 우리는 이야기하고 있습니다. 포함 할 파일 접두사 (또는 접미사 또는 패턴)를 지정합니다.s3://sourceBucket/ s3://targetBucket/
이 부분은 충분히 직관적입니다. 기술적으로는 소스 객체를 지정해야 함을 나타내는 s3cmd 도움말의 문서화 된 예제를 위반하는 것 같습니다.s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
매우 큰 버킷을 복사해야했기 때문에 질문의 코드를 다중 스레드 버전으로 조정하고 GitHub에 올렸습니다.
https://github.com/paultuckey/s3-bucket-to-bucket-copy-py
웹 인터페이스를 사용하여 수행 할 수도 있습니다.
- 웹 인터페이스에서 소스 버킷으로 이동합니다.
- 복사하려는 파일을 표시하십시오 (여러 개를 표시하려면 Shift와 마우스 클릭을 사용하십시오).
- 조치-> 복사를 누르십시오.
- 대상 버킷으로 이동합니다.
- 작업-> 붙여 넣기를 누릅니다.
그게 다야.
실제로 가능합니다. 이것은 나를 위해 일했습니다.
import boto
AWS_ACCESS_KEY = 'Your access key'
AWS_SECRET_KEY = 'Your secret key'
conn = boto.s3.connection.S3Connection(AWS_ACCESS_KEY, AWS_SECRET_KEY)
bucket = boto.s3.bucket.Bucket(conn, SRC_BUCKET_NAME)
for item in bucket:
# Note: here you can put also a path inside the DEST_BUCKET_NAME,
# if you want your item to be stored inside a folder, like this:
# bucket.copy(DEST_BUCKET_NAME, '%s/%s' % (folder_name, item.key))
bucket.copy(DEST_BUCKET_NAME, item.key)
감사합니다. 존재하지 않거나 크기가 다른 파일 만 복사하는 약간 수정 된 버전을 사용하고 소스에 키가 있는지 대상을 확인합니다. 테스트 환경을 준비하기 위해 이것이 조금 더 빠르다는 것을 알았습니다.
def botoSyncPath(path):
"""
Sync keys in specified path from source bucket to target bucket.
"""
try:
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
srcBucket = conn.get_bucket(AWS_SRC_BUCKET)
destBucket = conn.get_bucket(AWS_DEST_BUCKET)
for key in srcBucket.list(path):
destKey = destBucket.get_key(key.name)
if not destKey or destKey.size != key.size:
key.copy(AWS_DEST_BUCKET, key.name)
for key in destBucket.list(path):
srcKey = srcBucket.get_key(key.name)
if not srcKey:
key.delete()
except:
return False
return True
S3 버킷을 백업하는 스크립트를 작성했습니다. https://github.com/roseperrone/aws-backup-rake-task
#!/usr/bin/env python
from boto.s3.connection import S3Connection
import re
import datetime
import sys
import time
def main():
s3_ID = sys.argv[1]
s3_key = sys.argv[2]
src_bucket_name = sys.argv[3]
num_backup_buckets = sys.argv[4]
connection = S3Connection(s3_ID, s3_key)
delete_oldest_backup_buckets(connection, num_backup_buckets)
backup(connection, src_bucket_name)
def delete_oldest_backup_buckets(connection, num_backup_buckets):
"""Deletes the oldest backup buckets such that only the newest NUM_BACKUP_BUCKETS - 1 buckets remain."""
buckets = connection.get_all_buckets() # returns a list of bucket objects
num_buckets = len(buckets)
backup_bucket_names = []
for bucket in buckets:
if (re.search('backup-' + r'\d{4}-\d{2}-\d{2}' , bucket.name)):
backup_bucket_names.append(bucket.name)
backup_bucket_names.sort(key=lambda x: datetime.datetime.strptime(x[len('backup-'):17], '%Y-%m-%d').date())
# The buckets are sorted latest to earliest, so we want to keep the last NUM_BACKUP_BUCKETS - 1
delete = len(backup_bucket_names) - (int(num_backup_buckets) - 1)
if delete <= 0:
return
for i in range(0, delete):
print 'Deleting the backup bucket, ' + backup_bucket_names[i]
connection.delete_bucket(backup_bucket_names[i])
def backup(connection, src_bucket_name):
now = datetime.datetime.now()
# the month and day must be zero-filled
new_backup_bucket_name = 'backup-' + str('%02d' % now.year) + '-' + str('%02d' % now.month) + '-' + str(now.day);
print "Creating new bucket " + new_backup_bucket_name
new_backup_bucket = connection.create_bucket(new_backup_bucket_name)
copy_bucket(src_bucket_name, new_backup_bucket_name, connection)
def copy_bucket(src_bucket_name, dst_bucket_name, connection, maximum_keys = 100):
src_bucket = connection.get_bucket(src_bucket_name);
dst_bucket = connection.get_bucket(dst_bucket_name);
result_marker = ''
while True:
keys = src_bucket.get_all_keys(max_keys = maximum_keys, marker = result_marker)
for k in keys:
print 'Copying ' + k.key + ' from ' + src_bucket_name + ' to ' + dst_bucket_name
t0 = time.clock()
dst_bucket.copy_key(k.key, src_bucket_name, k.key)
print time.clock() - t0, ' seconds'
if len(keys) < maximum_keys:
print 'Done backing up.'
break
result_marker = keys[maximum_keys - 1].key
if __name__ =='__main__':main()
레이크 작업에서 이것을 사용합니다 (Rails 앱의 경우).
desc "Back up a file onto S3"
task :backup do
S3ID = "*****"
S3KEY = "*****"
SRCBUCKET = "primary-mzgd"
NUM_BACKUP_BUCKETS = 2
Dir.chdir("#{Rails.root}/lib/tasks")
system "./do_backup.py #{S3ID} #{S3KEY} #{SRCBUCKET} #{NUM_BACKUP_BUCKETS}"
end
mdahlman의 코드가 저에게 작동하지 않았지만이 명령은 bucket1의 모든 파일을 버킷 2의 새 폴더 (명령도이 새 폴더 생성)로 복사합니다.
cp --recursive --include=file_prefix* s3://bucket1/ s3://bucket2/new_folder_name/
s3cmd는 접두사 또는 와일드 카드만으로 cp를 수행하지 않지만 's3cmd ls sourceBucket'및 awk를 사용하여 동작을 스크립팅하여 객체 이름을 추출 할 수 있습니다. 그런 다음 's3cmd cp sourceBucket / name destBucket'을 사용하여 목록의 각 개체 이름을 복사합니다.
I use these batch files in a DOS box on Windows:
s3list.bat
s3cmd ls %1 | gawk "/s3/{ print \"\\"\"\"substr($0,index($0,\"s3://\"))\"\\"\"\"; }"
s3copy.bat
@for /F "delims=" %%s in ('s3list %1') do @s3cmd cp %%s %2
You can also use s3funnel which uses multi-threading:
https://github.com/neelakanta/s3funnel
example (without the access key or secret key parameters shown):
s3funnel source-bucket-name list | s3funnel dest-bucket-name copy --source-bucket source-bucket-name --threads=10
'Development Tip' 카테고리의 다른 글
자바의 문자열 비교 (0) | 2020.10.20 |
---|---|
Git 로그에 오늘의 모든 커밋을 표시하는 방법은 무엇입니까? (0) | 2020.10.20 |
UIImage를 축소하고 흐릿하게 만드는 대신 동시에 파삭 파삭하고 선명하게 만드는 방법은 무엇입니까? (0) | 2020.10.20 |
클래스 변수 인 클로저를 호출하는 방법은 무엇입니까? (0) | 2020.10.20 |
실행 시간이없는 루프 (0) | 2020.10.20 |