2012-10-03 19 views
18

私は2つの別々のAWSアカウントを持つクライアントのためにいくつかの仕事をしています。 S3アカウントのバケット内のすべてのファイルを2番目のアカウントの新しいバケットに移動する必要があります。S3は異なるアカウントのバケット間でファイルを移動していますか?

我々は形式を使用して、s3cmdがこれを許すだろうと思った:

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

しかし、これは私だけが、1つのアカウントのキーを使用することができますし、私は第二のアカウントのアカウントを指定することはできません。

ファイルをダウンロードしてもう一度2番目のアカウントにアップロードする必要はありませんか?

+0

Ref:2つの異なるアカウント間でコピー/移動する:http://stackoverflow.com/questions/5518205/move-files-directly-from-one-s3-account-to-another –

答えて

33

すべてのユーザーにアクセス許可を開く必要はありません。 SourceBucketにコピーする

バケツを - - からコピーするIAMユーザー

バケツを使って別のアカウントでバケットからコピー元と送信先のバケット以下のポリシーを使用しDestinationBucket

ソースAWSアカウントID - XXXX-XXXX-XXXX

ソースIAMユーザー - SRC-IAMユーザーポリシー以下

ザ・は意味 - IAMユーザーを - XXXX-XXXX-XXXX:ListBucketとS3:SRC-IAMユーザーは、S3を持っています:GetObject priv SourceBucket/*とS3上ileges:ListBucketとS3:政策のあるべきDestinationBucketで

{ 
"Id": "Policy1357935677554", 
"Statement": [ 
    { 
     "Sid": "Stmt1357935647218", 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3:::SourceBucket", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    }, 
    { 
     "Sid": "Stmt1357935676138", 
     "Action": ["s3:GetObject"], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: SourceBucket/*", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    } 
] 
} 

{ 
"Id": "Policy1357935677554", 
"Statement": [ 
    { 
     "Sid": "Stmt1357935647218", 
     "Action": [ 
      "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: DestinationBucket", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    }, 
    { 
     "Sid": "Stmt1357935676138", 
     "Action": ["s3:PutObject"], 
     "Effect": "Allow", 
     "Resource": "arn:aws:s3::: DestinationBucket/*", 
     "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} 
    } 
] 
} 
のputObject権限DestinationBucket/*

上SourceBucketに関する方針は次のようにする必要があります実行される

コマンドはロールとポリシーが本当にエレガントな方法であったとしてもs3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

+0

美しく動作します。ありがとう! – Sergio

+1

このフォルダ/ファイルをローカルマシンにダウンロードしたいのですが? –

+0

これらのバケットが異なる地域にある場合はどうすればいいですか – David

3

AWS内の帯域幅はカウントされないため、バケットが同じ領域にある限り、AWS内のボックスからすべての処理を行うことで、お金と時間を節約できます。

ファイルをコンピュータのどこかに触れさせることなく、そのようにしていると思います。

例外:ハードドライブから一括アップロードするので、バケツをバケツに転送する場合も同じことがあります。

+1

ありがとうございます。それがそのようになっているようだ。インスタンスからそれを行うことは、あまりにも良い方法だと思われます。先端に感謝します。 – Geuis

0

私はクラウドベリーs3エクスプローラを使って、物事を素早く動かすための簡単な解決策を提案します。また、それはあなたが内部awsの帯域幅のない転送サービスを利用することができます。

また、cloudberry SDKツールを使用してアプリに統合することもできます。 [OK]を

幸運 ジョン

-6

は、答えを考え出しました。これを行う他の方法もありますが、これは非常に簡単です。

私はs3cmdユーティリティでこれを行うことができましたが、同様のツールでこれを行うことができます。

s3cmdを構成するときは、アカウントのアクセスキーとシークレットアクセスキーで構成します。

に転送しているバケットのアカウントを使用してS3 Webコンソールにログインします。

S3ウェブコンソールにアクセスしてください。

https://console.aws.amazon.com/s3/home 

バケットをクリックし、次に[操作]、[プロパティ]の順にクリックします。

[権限]タブの下にある[権限を追加]をクリックします。転送するには

Set "Grantee" to Everyone 

Check "List" and "Upload/Delete" 

Save 

は、転送が完了すると、あなたは再びすぐに訪問S3コンソールを、あなたがバケツのために追加の権限を削除する必要がありますあなたの端末から

s3cmd cp s3://from_account_bucket s3://to_account_bucket --recursive 

を実行します。

明らかにセキュリティ上の問題があります。私たちが移転するバケツは誰にでも開放されています。あなたのバケット名を見つける誰かのチャンスは小さいですが、存在します。

特定のアカウントへのアクセスのみを開く代わりにバケットポリシーを使用することはできますが、それはあまりにも難しいので、私はそれを把握する必要がある人には練習として任せます。

これが役に立ちます。

+1

申し訳ありませんが、セキュリティホールは-1です。間違いなくここで良い練習 - これは大きなハックです。 – swrobel

0

ですが、私は別の解決策をしました:

  1. 宛先バケット・アカウントに対して同じ
  2. ソース・バケット・アカウントのAWS-資格情報を取得します
  3. ローカルマシン(デスクトップまたはAWSの外のサーバ)上での新しいプロファイルを作成しますSource-Bucket-Accountsの資格情報。

    AWS --profile $ {YOUR_CUSTOM_PROFILE}(地域および出力あなたはスキップする場合があります)aws_access_key_idとaws_secret_access_keyに

  4. 塗りつぶしを設定

  5. 環境-変数としてのあなたのデスティネーション・バケット・資格情報を保存

    輸出AWS_ACCESS_KEY_ID = AKI ..​​.

    輸出AWS_SECRET_ACCESS_KEY = CN ...

  6. は今すぐ同期を行うが、

    AWS --profile $ {} YOUR_CUSTOM_PROFILE S3シンクS3 -parameter重要な "プロフィール" を追加します:// $ {} SOURCE_BUCKET_NAME S3:// $ {} DESTINATION_BUCKET_NAME

+1

とにかくソースバケットと送り先バケットの資格情報が異なる場合はS3同期を実行できますか? – HariShankar

関連する問題