web-dev-qa-db-ja.com

すべてのバージョンを含む、バケットのs3コンテンツをコピーする

既存のホスティングクライアントを他の組織に引き継いでいるため、別の組織にアクセスを引き渡したいS3バケットがいくつかあります。

ドキュメントを確認した後、バケットの責任を負う必要がなくなった場合、最も簡単なオプションは、新しい組織の管理下にある新しいバケットに新しいバケットのコンテンツをコピーし、既存のアプリにファイルを書き込むことです。これから新しいバケットに。

バケットはそれほど大きくありません。

aws s3 ls --human-readable --recursive --summarize s3://some-client-bucket

 # (snip… lots of files listed, all less than 10mb)

 # Total Objects: 22764
 # Total Size: 2.4 GiB

しかし、いくつかのバケットはバージョン管理されており、昨年転送されたいくつかのファイルの毎日のスナップショットがあり、これも転送できるようにしたいと考えています。

これを行う簡単な方法はありますか?

次のようなものを使用してアクセスを許可した後、バケットの現在のコンテンツを別の組織によって制御されている新しいものにコピーする方法を理解しています:

aws s3 sync s3://some-client-bucket s3://new-client-bucket --recursive

ただし、これがバージョン間で移動することもないと思います。私は自分でファイルにタイムスタンプを付けるのではなく、S3のファイルごとのバージョン管理に依存してきました。

スクリプトをジェリーリグする必要がありますか?

  • 各バージョンのファイルをダウンロードする
  • タイムスタンプで名前を変更する
  • 新しいバケットにアップロードします

それとも、これを自動的に行うためにS3に気の利いた追加機能がありますか?

6
Chris Adams

これは古い質問ですが、たまたま同じ要件に直面しただけです。今日、すべてのファイルをバージョン管理されたバケットから別のバケットにコピーするかなり簡単な方法があります。それを行うために、次のPowerShellスクリプトを思いつきました。

$sourceBucket = <source bucket>
$destinationBucket = <destination bucket>
$nextKeyMarker = $null
$nextVersionIdMarker = $null
do {
    $objectVersions = Get-S3Version -BucketName $sourceBucket `
                                    -KeyMarker $nextKeyMarker `
                                    -VersionIdMarker $nextVersionIdMarker
    $nextKeyMarker = $objectVersions.NextKeyMarker
    $nextVersionIdMarker = $objectVersions.NextVersionIdMarker
    $objectVersions.Versions | foreach { 
        Copy-S3Object -BucketName $sourceBucket `
                      -DestinationBucket $destinationBucket `
                      -Key $_.Key `
                      -DestinationKey $_.Key `
                      -VersionId $_.VersionId `
                      -CannedACLName bucket-owner-full-control
    }
} while ($objectVersions.IsTruncated -eq "True")
  1. バケット内のオブジェクトの数に関係なく、これはオブジェクトバージョンを1000の一括でコピーするため、機能するはずです。
  2. CannedACLNameパラメータは、オブジェクトの所有権を宛先バケットが属する新しいAWSアカウントに転送するために使用されます。これがない場合でも、コピーされたオブジェクトの所有者はソースバケットのアカウントのままであり、コピーされたすべてのオブジェクトに新しい所有者アカウントからアクセスできなくなります。同じアカウント内のバケット間でオブジェクトをコピーする場合、これを指定する必要はありません。
2
Kons