1

ACCOUNT-AのあるバケットからACCOUNT-Bのバックアップバケットへの任意のオブジェクトのクロスアカウントバックアップを実行しようとしています。バックアップバケットのオブジェクトをAES256で暗号化したいとします。しかし、暗号化はバックアップバケツに入っているオブジェクトには適用されていないようです。s3.copyObjectは、対象バケット内のオブジェクトにServerSideEncryptionを適用しませんか?

セットアップ

  • ACCOUNT-Aassets.myapp.com
  • ACCOUNT-Bと呼ばれるソースバケットがassets.myapp.comバケツにs3.ObjectCreated:*バケットイベントは、新たにコピーするためにラムダ関数をトリガbackup-assets.myapp.com
  • と呼ばれるターゲットバケツを持っていますオブジェクトをbackup-assets.myapp.comバケツにACCOUNT-Bの下に作成します。
  • backup-assets.myapp.comバケットのオブジェクトにServerSideEncryption: 'AES256'を適用しようとしました。機能を実行すると

ラムダ関数のコードは

var async = require('async'); 
var aws = require('aws-sdk'); 
var s3 = new aws.S3({ apiVersion: '2006-03-01' }); 

exports.backupObject = function backupS3Object(event, context) { 

    if (event.Records === null) { 
     return context.fail('NOTICE:', 'No records to process.'); 
    } 

    async.each(event.Records, function(record, iterate) { 

     var sourceBucket = record.s3.bucket.name; 
     var targetBucket = 'backup-' + record.s3.bucket.name; 
     var key = record.s3.object.key; 

     s3.copyObject({ 
      Bucket : targetBucket, 
      CopySource : sourceBucket + '/' + key, 
      Key : key, 
      ACL : 'private', 
      ServerSideEncryption : 'AES256', 
      MetadataDirective : 'COPY', 
      StorageClass : 'STANDARD_IA' 
     }, function(error, data) { 

      if (error) return iterate(error); 
      console.log('SSE: ' + data.ServerSideEncryption); 
      console.log('SUCCESS: Backup of ' + sourceBucket + '/' + key); 
      return iterate(); 

     }); 

    }, function (error) { 

     if (error) { 
      return context.fail('ERROR:', 'One or more objects could not be copied.'); 
     } 

     return context.done(); 

    }); 

}; 

CloudWatchのログは、オブジェクトが正常にコピーされ、成功

を報告し、私のラムダ関数のCloudWatchのログレポートServerSideEncryptionAES256として使用されます。

しかし、S3コンソールは

をは不一致しかし、問題は、私はACCOUNT-Bbackup-assets.myapp.comバケツでコピーされたオブジェクトのProperties > Detailsを検査するとき、それはServer Side Encryption: Noneを報告していることです。

なぜSSEは、backup-assets.myapp.comバケットに着陸したときにオブジェクトに適用されないようですか?または、実際に適用されていますが、私はちょうどS3 Consoleのディスプレイのバグを発見しましたか?

BONUS QUESTION

When I attempt to apply SSE:AES256 to any given object manually using the console, I get the following error: The additional properties (RRS/SSE) were not enabled or disabled due to errors for the following objects in backup-assets.myapp.com: copied-object-one.txt.

ご協力いただきありがとうございます。

+1

この場合、すべてのオブジェクトがコピーされますか?オブジェクトの大きさはどれくらいですか? [この古いフォーラムの投稿](https://forums.aws.amazon.com/thread.jspa?threadID=93744)では、5GBを超える問題が発生する可能性があることが示唆されています。あなたは自動的に(バージョン管理が必要です)コピーを行うために[クロスリージョンレプリケーション](https://docs.aws.amazon.com/AmazonS3/latest/dev/crr.html)の使用を検討しましたか? –

+0

ちょっとジョン、オブジェクトの範囲は20kから1Gbです。クロスリージョンレプリケーションは私のタスク目標を満たしておらず、x-accountである必要があります。どちらのバケットもバージョン管理が有効になっています。私はそれがS3コンソールが与えられたオブジェクトの暗号化された状態をどのように提示するかに関する問題であることを90%確信しています。私はいくつかのテストを行いました。同じ問題が表示されています。バージョン管理なしにスタンドアロンバケットにオブジェクトをアップロードし、コンソールを使用して暗号化する場合もあります。これはバグか、まだ別のAWSの機能(バグ)で、どちらがまだ分かっていないかのいずれかです。 – AJB

+1

**異なるアカウント**に属するバケットの間でクロスリージョンレプリケーション*を行うことができます(正しいセキュリティ設定が必要です)。もう1つの選択肢は、[AWS Command-Line Interface(CLI)](http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)の 'aws s3 sync'コマンドを使用することです。定期的なスケジュール(例えば、5分ごと)で。これは、CloudWatch Eventsを介してスケジュールされたLambdaタスクや、どこかのcronジョブから実行できます。 –

答えて

1

これを実証しました。

copyObjectメソッドのACLパラメータで問題が発生しました。

あなたはbucket-owner-full-control、バックアップのバケットは、暗号化を適用することができるようにすることができますACLを提供しなければならない対象のバケツに上陸オブジェクトにServerSideEnryption: 'AES256'を使用したい場合。これはどこにも書かれていませんが、私は広範なテストを行っています(選択肢ではありません)。だから、作業ラムダ関数のコードは以下の通りです:

var async = require('async'); 
var aws = require('aws-sdk'); 
var s3 = new aws.S3({ apiVersion: '2006-03-01' }); 

exports.backupObject = function backupS3Object(event, context) { 

    if (event.Records === null) { 
     return context.done('NOTICE: No records to process.'); 
    } 

    async.each(event.Records, function(record, iterate) { 

     var sourceBucket = record.s3.bucket.name; 
     var targetBucket = 'backup-' + record.s3.bucket.name; 
     var key = record.s3.object.key; 

     s3.copyObject({ 
      Bucket : targetBucket, 
      CopySource : sourceBucket + '/' + key, 
      Key : key, 
      ACL : 'bucket-owner-full-control', 
      ServerSideEncryption : 'AES256', 
      MetadataDirective : 'COPY', 
      StorageClass : 'STANDARD_IA' 
     }, function(error, data) { 

      if (error) return iterate(error); 
      console.log('SUCCESS: Backup of ' + sourceBucket + '/' + key); 
      return iterate(); 

     }); 

    }, function (error) { 

     return context.done(error); 

    }); 

}; 

私は、これは上記の質問のコメントで述べたX-地域X-アカウントの複製方法を使用して可能であるかはわかりません。複製を実行するときにSSEを宣言する方法はないようです。

関連する問題