S3 で JavaScript の s3.copyObject() のパラメータ

AWS の Lambda の Node.js の JavaScript で S3 のオブジェクトをコピーする copyObject() メソッドのパラメータ指定でちょっとはまった。
S3においてあるファイル(オブジェクト)を S3内で(自分のアカウントの許す中で)コピーするのに、JavaScriptで、下記とでもするのだけど

s3.copyObject(params, (err, data) => {
  if (err) {       // an error occurred
    console.log(err, err.stack);
    callback(err);
  } else {         // successful response
    console.log(data);
    callback(null, data.ETag);           
  };
});

この params の指定、要するに下記、

var params = {
  CopySource: "<コピー元バケット名>/<コピー元のバケットの続きのキー名>(バケット名先頭に「/」はいらない一方キー名と繋げる「/」は忘れずに)",
  Bucket: "<コピー先バケット名>(前後に「/」はいらない)",
  Key: "<コピー先のバケットの続きのキー名>(先頭に「/」はいらない)"
};

CopySource はコピー元をバケット名から、Bucket はコピー先バケット名、Key はコピー先のその続きの記述、コピー元とコピー先で設定の対称が崩れてるの注意。

勿論他にもいろいろ指定できる、Class: AWS.S3 — AWS SDK for JavaScript

はまったのは、このマニュアルにもあるが、まず必須項目が Bucket, CopySource, Key と並んでて、はじめ Bucket はコピー元のバケットかと誤解してしまった。多分必須項目をアルファベット順に並べてるだけなんだと思う。まあ、S3 のはなしをずっとしてると、Bucket と Key でそのとき注目するファイル(オブジェクト)を指定するのは確かにそうなんだけど、ここではそれがコピー先のことのみとは、コピー元のバケットとか関係ないとは、はじめ思い及ばなかった。

で、CopySource がちゃんとしてないと(バケットのあたりがないとか)、「[AllAccessDisabled: All access to this object has been disabled]」とかいわれて、アクセス権限の指定とか確かめに行ってしまい、ちょっと(少し、もっと)回り道した。

それから、 copyObject() は個々のファイル(オブジェクト)のコピーで、フォルダまとめてのコピーは出来ないみたい、そんなメソッドもなさそうで、そういうときは苦労します。