確認した環境
node.js: 10.17.0
s3-client: 4.4.2
s3-clientのインストール
s3-clientをインストールします。
npm i s3-client
s3クライアントのインスタンスを作成
imports3from"s3-client";constclient=s3.createClient({s3Options:{accessKeyId:ここにS3のアクセスキーID,secretAccessKey:ここにs3のシークレットキー,}})
s3へアップロード
s3-clientのreadmeによるアップロードのサンプルは以下です。
varparams={localFile:"some/local/file",s3Params:{Bucket:"s3 bucket name",Key:"some/remote/file",// other options supported by putObject, except Body and ContentLength.// See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property},};varuploader=client.uploadFile(params);uploader.on('error',function(err){console.error("unable to upload:",err.stack);});uploader.on('progress',function(){console.log("progress",uploader.progressMd5Amount,uploader.progressAmount,uploader.progressTotal);});uploader.on('end',function(){console.log("done uploading");});
サンプルのままだと使いづらいんで、Promiseオブジェクトでラップし、async/awaitが使えるようにします。
constuploadFileToS3=(bucketName,remoteDir,localFilePath)=>{returnnewPromise(async(resolve,reject)=>{constfileName=localFilePath.split('/').pop()constparams={localFile:localFilePath,s3Params:{Bucket:bucketName,Key:remoteDir+'/'+fileName// S3はオブジェクトストレージなのでフォルダの概念はないが、オブジェクトキーにスラッシュ区切りのパス名をつけることで、それをフォルダと解釈する},};constuploader=awaitclient.uploadFile(params);uploader.on('error',(err)=>{reject(err.stack)});uploader.on('end',function(){resolve()});});}
これで、async/awaitを使えるようになりました。
(async()=>{awaituploadFileToS3(s3のbacket名,s3のフォルダ名,ローカルのファイルパス)})();
フォルダをまるごとアップロードしたい場合は、以下を使用します。
constuploadS3Dir=async(bucketName,localDir,remoteDir=null)=>{returnnewPromise(async(resolve,reject)=>{varparams={localDir,deleteRemoved:false,// default false, whether to remove s3 objects// that have no corresponding local file.s3Params:{Bucket:bucketName,Prefix:remoteDir,// See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property},};varuploader=client.uploadDir(params);uploader.on('error',err=>{reject(err.stack)});uploader.on('end',()=>{resolve()});});}
s3のファイルリスト取得
S3バケット名を指定し、そこにある全てのファイルリストを再帰的に取得します。
constlistS3Objects=async(bucketName,remoteDir=null)=>{returnnewPromise(async(resolve,reject)=>{varparams={recursive:true,// これをfalseにすると1階層のみの取得となるs3Params:{Bucket:bucketName,Prefix:remoteDir,// See: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjects-property},};constfinder=client.listObjects(params);letobjects=[]finder.on('data',function(data){objects=data});finder.on('error',err=>{reject(err.stack)});finder.on('end',()=>{resolve(objects)});});}
s3にあるファイルの削除
S3バケット名と、オブジェクトキー文字列の配列を指定し、ファイルを削除します。
// objectKeys: [ remoteFile1, remoteFile2, ...]constdeleteS3Objects=async(bucketName,objectKeys)=>{returnnewPromise(async(resolve,reject)=>{varparams={Bucket:bucketName,Delete:{Objects:objectKeys.map(k=>({Key:k}))}};constdeleter=client.deleteObjects(params);deleter.on('error',err=>{reject(err.stack)});deleter.on('end',()=>{resolve()});});}
サンプル
S3のバケットをいったん空にしてファイルをアップロードするサンプルです。
// ここに上記の各関数を記述(async()=>{constconfigs={acckey:S3のアクセスキーID,seckey:S3のシークレットキー,bucket:S3のバケット名,}constclient=s3.createClient({s3Options:{accessKeyId:configs.acckey,secretAccessKey:configs.seckey,}})// 既存のobjectを削除constlist=awaitlistS3Objects(configs.bucket)constkeys=list.Contents.map(i=>i.Key)//console.log(keys)if(keys.length>0)awaitdeleteS3Objects(configs.bucket,keys)awaituploadFileToS3(configs.bucket,'foo','./bar.txt')// このプログラムの実行フォルダ直下に、`bar.txt`ファイルが存在する前提})();