AWS Lambda(Node.js)でasync/awaitでS3の操作をする
技術ネタを。
AWS Lambda(Node.js)でasync/awaitする。です。
Node.jsのバージョンは、8.10です。
async/awaitを利用した目的ですが、lambdaで以下のような処理を行いたかったためです。
①s3にアップロードされたzipファイルを解凍(lambdaにトリガー設定)
②古いファイルを削除
まあ、async/awaitを使わなくても動きそうですが、①が終わってから②の処理を行う方が素敵な感じなので。。。
コードは以下のイメージです。手元で実行できないのでイメージですみません。。
s3の各関数をコールするときにawaitを付ける感じです。
var AWS = require('aws-sdk'); var s3 = new AWS.S3(); exports.handler = async (event, context) => { try { var s3Object = await s3.getObject(ここにパラメータ).promise(); // zip解凍処理。node-zipとかで解凍。 var arr = []; // foreachでs3.putObjectするpromiseを作り配列にpush // putObjectを実行 await Promises.all(arr); // 削除対象のリストを取得 await s3.listObjects(ここにパラメータ).promise(); var delArr = []; // foreachでs3.deleteObjectするpromiseを作り配列にpush await Promises.all(delArr); } catch(err) { console.log(err); } }
handlerのところで、asyncと書くことで処理中でawaitが利用できるとのこと。
awaitを付けると、awaitを付けた処理が終了するまで待ってくれる。ちなみに結果も普通に取得できる。
s3.getObject(~).promise()のところですが、引数にコールバックを書いた場合にgetObjectが2回実行されました。
なので引数のコールバックは不要。
s3へのputやdeleteですが、forEachなどでやろうと思ったのですがawaitは使えないとのことで、promiseの配列を作成して、Promises.allで実行という形としました。
これだとS並列で実行してくれるようでなおいい感じですね。
以上