2013年4月24日水曜日

s3cmdで、[Errno 32] Broken pipe と出た時の対処


s3cmd を使って、Jenkinsのジョブをs3に週次でバックアップしてるのですが、 ある時から、

$ s3cmd -f put /tmp/jenkins_bk.tar.gz s3://hogehoge/
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [1 of 1]
    7725056 of 5660650889     0% in    1s     7.02 MB/s  failed
WARNING: Upload failed: /jenkins_bk.tar.gz ([Errno 32] Broken pipe)
WARNING: Retrying on lower speed (throttle=0.00)
WARNING: Waiting 3 sec...

とか出て、アップロード出来なくなりました。その際の対処法のメモです。


S3のアップロードファイルサイズ制限が原因

色々調べてみたところ、どうもS3にはアップロードファイルサイズ制限(5GB)があるとのこと。
(公式のソースはちょっと見つけられませんでしたが…。)
確認すると、確かにバックアップファイルの容量が、5GB を超えてました。

$ ls -l
-rw-rw-r-- 1 jenkins jenkins 5660650889  4月 23 09:40 jenkins_bk.tar.gz

5GB超えのファイルをどうやってS3にアップロードするには

じゃあどうすればいいのってことになるのですが、かなり前の記事に記載がありました。

【AWS発表】 Amazon S3において大容量ファイルを分割アップロード可能にするマルチパートアップロード機能(Multipart Upload)の発表

ということらしいです。
小さいファイルに分割すればいいよ、と。


Multipart Upload を s3cmd で使う

それなら Multipart Upload オプションみたいなのを s3cmd で使用すればいいのか、
となるのですが、どうもパッケージでリリースされているものはそれに未対応とのこと。

ですが、beta版で対応しているらしいので、そちらを入れます。
公式ページにアクセスして、Download here をクリック。
α版のダウンロードページに行きますが、ちょっと不安なので Parent folder をクリックして、
1.1.0-beta2 をダウンロード

4/25訂正・追記: 1.1.0-beta3 で、Jenkinsからs3cmdを実行すると、
Problem: KeyError: 'elapsed'
S3cmd:   1.1.0-beta3
とかなって、この問題に当たるので、1.5.0-alpha3 を使用しました。

あとは下記のようにインストール。

~$ tar zxvf s3cmd-1.1.0-beta3.tar.gz

~$ cd s3cmd-1.1.0-beta3/
~/s3cmd-1.1.0-beta3$ ls -l
合計 144
-rw-r--r-- 1 hoge hoge  2707  8月  2  2011 INSTALL
-rw-r--r-- 1 hoge hoge  7651  1月 12  2012 NEWS
-rw-r--r-- 1 hoge hoge   661  1月 12  2012 PKG-INFO
-rw-r--r-- 1 hoge hoge 13130  8月  2  2011 README
drwxr-xr-x 2 hoge hoge  4096  1月 12  2012 S3
-rwxr-xr-x 1 hoge hoge 83178  1月 12  2012 s3cmd
-rw-r--r-- 1 hoge hoge 13655  1月 12  2012 s3cmd.1
-rw-r--r-- 1 hoge hoge    28  8月  2  2011 setup.cfg
-rw-r--r-- 1 hoge hoge  2399  1月  2  2012 setup.py

~/s3cmd-1.1.0-beta3$ sudo python setup.py install

~/s3cmd-1.1.0-beta3$ s3cmd --version
s3cmd version 1.1.0-beta3

で、設定ファイル作成。

~$ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: YOUR_ACCESS_KEY
Secret Key: YOUR_SECRET_KEY

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: YOUR_PASSWORD
Path to GPG program [/usr/bin/gpg]:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]: Yes

New settings:
  Access Key: YOUR_ACCESS_KEY
  Secret Key: YOUR_SECRET_KEY
  Encryption password: YOUR_PASSWORD
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: True
  HTTP Proxy server name:
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] n

Save settings? [y/N] y
Configuration saved to '/var/lib/jenkins/.s3cfg'

出来たファイルはこちら

~/.s3cfg

[default]
access_key = YOUR_ACCESS_KEY
bucket_location = US
cloudfront_host = cloudfront.amazonaws.com
default_mime_type = binary/octet-stream
delete_removed = False
dry_run = False
enable_multipart = True
encoding = UTF-8
encrypt = False
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase = YOUR_PASSPHRASE
guess_mime_type = True
host_base = s3.amazonaws.com
host_bucket = %(bucket)s.s3.amazonaws.com
human_readable_sizes = False
invalidate_on_cf = False
list_md5 = False
log_target_prefix =
mime_type =
multipart_chunk_size_mb = 1024
preserve_attrs = True
progress_meter = True
proxy_host =
proxy_port = 0
recursive = False
recv_chunk = 4096
reduced_redundancy = False
secret_key = YOUR_SECRET_KEY
send_chunk = 4096
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 300
urlencoding_mode = normal
use_https = True
verbosity = WARNING
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
website_error =
website_index = index.html

enable_multipart = True の項目を確認しました。

これでOKなのですが、デフォルトだと、

multipart_chunk_size_mb = 15

となっていて、15MBずつファイルをアップロードすることになるので、
ケチケチせず 1024 とかに変えておきます。


ようやくアップロード

これでようやく当初アップロードしたかったファイルをアップロード出来ます。
よーし…

~$ s3cmd -f put /tmp/jenkins_bk.tar.gz s3://hogehoge/
WARNING: Module python-magic is not available. Guessing MIME types based on file extensions.
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [part 1 of 6, 1024MB]
 1073741824 of 1073741824   100% in  116s     8.78 MB/s  done
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [part 2 of 6, 1024MB]
 1073741824 of 1073741824   100% in  133s     7.67 MB/s  done
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [part 3 of 6, 1024MB]
 1073741824 of 1073741824   100% in  240s     4.26 MB/s  done
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [part 4 of 6, 1024MB]
 1073741824 of 1073741824   100% in  123s     8.29 MB/s  done
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [part 5 of 6, 1024MB]
 1073741824 of 1073741824   100% in  239s     4.28 MB/s  done
/tmp/jenkins_bk.tar.gz -> s3://hogehoge/jenkins_bk.tar.gz  [part 6 of 6, 316MB]
 331925477 of 331925477   100% in   38s     8.18 MB/s  done

おー出来ました。良かった良かった。


おしまい。

0 件のコメント:

コメントを投稿