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