田中ブログ

さいたまに住んでいるアラサーの男です。仕事はSESでプログラムを書いてることが多いです。聖地巡礼、日々の生活、たまに技術的なことを書いていこうと思います。

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並列で実行してくれるようでなおいい感じですね。

 
以上