AWS Lambda(node.js)でmapとPromise.allで並列実行する
S3にputObjectする処理をする場合にコーディングによっては処理が遅くなってしまうケースがあります。
await S3.putObject(params1).promise() | |
await S3.putObject(params2).promise() | |
await S3.putObject(params3).promise() | |
await S3.putObject(params4).promise() |
node.jsは非同期処理の為、大量にawaitすると同期してしまうので処理が遅くなってしまいます。
こういう同期する処理はPromise.allとmapを使って以下のように書くと並列処理を行ってくれるので、処理速度が速くなります。
各Promise処理(重たい処理)でエラーが出たときにCloudWatchでログ出力したい、などという場合は、await-catchしておけばOKです。
const arr = ['aaa', 'bbb', 'ccc', 'ddd'] | |
await Promise.all( | |
arr.map(async data => { | |
await S3.putObject( | |
{ | |
'Bucket': 'saba6seimenjo', | |
'Key': 'var/db/apps/' + data + '.json', | |
'Body': JSON.stringify(data) | |
} | |
).promise() | |
.catch(e => { | |
throw new Error(`不正なデータ「${data}」です`) | |
}) | |
}) | |
) |
bluebird.jsのPromise.mapというメソッドもあります。
http://bluebirdjs.com/docs/api/promise.map.html
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^