1
1

More than 5 years have passed since last update.

Lambda+S3でどうしようもなく恥ずかしい失敗をしたので自戒の意味でメモを残してみる

Last updated at Posted at 2019-09-06

割と本当に恥ずかしいかつ、見ればすぐわかるレベルのエラーに結構な時間を費やした自分への自戒目的記事です

そもそも何をやろうとしていたのか?

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使えるのもしばらく気づかず自滅
かなしいです😢

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1