본문 바로가기
카테고리 없음

AWS bucket object putがretry扱いになる

by yunexus 2024. 8. 8.

ソース実行

1つのFileをopenして、S3に2回putする

file = File.open('file.csv')
object(key1).put(body: file, **params)
object(key2).put(body: file, **params)

 

結果(ログ)

2回目のputする時に、retryしているため20秒かかってしまう。

[Aws::S3::Client 200 0.059539 0 retries] put_object(body: ... )
[Aws::S3::Client 200 20.484029 1 retries] put_object(body: ... )

 

 

理由

Fileを1回readすると、カーソルが末尾に移動するからです。

file = File.open('file.csv')
=> #<File:purchase.csv>
[93] pry(main)> file.read
=> "header1,header2,header3,header4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n"
[94] pry(main)> file.read
=> ""

 

Fileを1回利用した後に、seekを利用して、カーソルを先頭に移動すれば解消します。

[99] pry(main)> file = File.open('purchase.csv')
=> #<File:purchase.csv>
[100] pry(main)> file.read
=> "header1,header2,header3,header4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n"
[101] pry(main)> file.seek(0)
=> 0
[102] pry(main)> file.read
=> "header1,header2,header3,header4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n1,2,3,4\n"

 

修正後に2回putしてみると治っている

Aws::S3::Client 200 0.045818 0 retries] put_object(body:
Aws::S3::Client 200 0.044939 0 retries] put_object(body: