割と本当に恥ずかしいかつ、見ればすぐわかるレベルのエラーに結構な時間を費やした自分への自戒目的記事です
そもそも何をやろうとしていたのか?
kinesis streamから取ってきたrecordを中身のデータによってs3のkeyを作りこみながらputする(本当にそれだけ)
何が起こったか?
S3へputObjectするとネットワークエラーが頻発する
例1
"message": "write EPROTO :SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:\n",
"errno": "EPROTO",
"code": "NetworkingError",
例2
"message": "socket hang up",
"code": "NetworkingError",
例3
"message": "write EPROTO",
"errno": "EPROTO",
"code": "NetworkingError",
S3へputするロジックはどうだったのか?
sdkのfunctionを実行するのみ
※コールバックは割愛
s3.putObject({
Bucket: buket,
Key: Key,
Body: JSON.stringify(payload),
ContentType: 'application/json'
})
何が悪いのか?
putObject
がnon blockingだったため、S3へのputが終わる前にlambdaがcloseしようとしたため、エラーが発生した
対応どうしたか?
promise化し、awaitしました。
※より正確には1回の処理で10件程度のrecordを処理していたので、まとめてpromise.allで処理しました。
await s3.upload({
Bucket: buket,
Key: Key,
Body: JSON.stringify(payload),
ContentType: 'application/json'
}).promise()
まとめ
nodeのsdkがnon blockingなのも、promise使えるのもしばらく気づかず自滅
かなしいです😢