あのときのログ

思ったこと、経験したことを忘れないようにするためのメモ。

s3fs と s3cmd

EC2からS3に大量のログファイルを保存するために
・s3fs(正確にはs3fs-c)
・s3cmd
の2種類を使っていたがどちらも一長一短という感じで、悩みが。
【それぞれの特徴】
 ・s3fs
  (長所)ファイルシステムとしてマウントしローカルファイルのようにcpなどの操作が可能
  (短所)メモリリーク(swapが激しい)←ホントにイタイ
 ・s3cmd
  (長所)S3の操作の多くがコマンドラインで出来る
  (短所)pythonのメモリ消費量多め、数GBサイズの大きいファイルの操作(後述)
長所としてはどちらも良い所があるのだが、s3fsの短所:メモリリークがどうにも許容できず、
s3cmd一本で行こうと思い始めたところ、数GB級のファイルをS3にputしようとして下記エラー。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
  Please report the following lines to:
   s3tools-bugs@lists.sourceforge.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Problem: KeyError: 'size'
S3cmd:   1.1.0-beta2
Traceback (most recent call last):
  File "/usr/local/s3cmd/s3cmd", line 1804, in 
    main()
  File "/usr/local/s3cmd/s3cmd", line 1745, in main
    cmd_func(args)
  File "/usr/local/s3cmd/s3cmd", line 969, in cmd_sync
    return cmd_sync_local2remote(args)
  File "/usr/local/s3cmd/s3cmd", line 936, in cmd_sync_local2remote
    (item['full_name_unicode'], uri, response["size"], response["elapsed"],
KeyError: 'size'

’size’と出ていたものの何が悪いのかはっきりとは分からなかっただが、
幾つかのファイルを試して、ファイルサイズが問題だということに。
どうにもならないのかぁぁと諦めかけたものの、よーくヘルプを見てみると、
以下のようなオプションが。

--multipart-chunk-size-mb=xx(MB) 

どうやら、5GB以上の大きいファイルをアップする場合、このオプションが無いとエラーになるらしい。
↓ こちらにわかりやすい解説があった。

cloudpackブログ: s3cmdでmultipartオプションを利用してs3へアップロード


ということで、以下のように指定。

s3cmd put --multipart-chunk-size-mb=5120 転送するファイル s3://バケット名/オブジェクトパス 

これでうまくアップ出来るようになった。
良かった。
以下も分かりやすく、参考になった。
s3cmdで5GB以上のファイルをS3にアップロードする方法 - 雑多なインフラエンジニア日記