AWS Lambda(node.js)でmapとPromise.allで並列実行する

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()

view raw
gistfile1.txt
hosted with ❤ by GitHub

node.jsは非同期処理の為、大量にawaitすると同期してしまうので処理が遅くなってしまいます。

こういう同期する処理はPromise.allとmapを使って以下のように書くと並列処理を行ってくれるので、処理速度が速くなります。

const arr = ['aaa', 'bbb', 'ccc', 'ddd']
await Promise.all(
arr.map(async data => {
await S3.putObject(
{
'Bucket': 'bucketname',
'Key': 'var/db/apps/' + data + '.json',
'Body': JSON.stringify(data)
}
).promise()
})
)

view raw
gistfile1.txt
hosted with ❤ by GitHub

各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}」です`)
})
})
)

view raw
gistfile1.txt
hosted with ❤ by GitHub

bluebird.jsのPromise.mapというメソッドもあります。

http://bluebirdjs.com/docs/api/promise.map.html

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA