LoginSignup
24

More than 5 years have passed since last update.

boto を使って Amason S3 に指定のフォルダをアップロードするスクリプト

Last updated at Posted at 2014-01-16

※ 2015-01-07 追記

boto でなく awscli を使えば下記のように、s3 bucket アップロードスクリプトを書かずに済むことを教えてもらいました。awscli 便利そうなのでこちらを是非使いましょう。

インストール
$ pip install awscli

S3 情報を登録 (~/.aws/ に設定ファイルが生成される。)
$ aws configure

指定フォルダをアップロード
$ aws s3 sync <フォルダのパス> s3://<bucket 名>

アップロードを確認
$ aws s3 ls <bucket 名>

ダウンロードもできる
$ aws s3 sync s3://<bucket 名> <ダウンロード先のパス>

Amason S3 に指定のフォルダをアップロードするスクリプト

Gist に貼っていたのを Qiita に書いてみました.

boto を使って Amason S3 の bucket に指定のフォルダ(中のファイル全て)をアップロードします.

pip install boto などで boto をインストールしておきましょう.
ACCESS_KEY_ID, SECRET_ACCESS_KEY, BUCKET_NAME を追記しておきます. 例では 'Cache-Control: max-age=10' とヘッダを書いていますがお好みでヘッダも追記します.

deploys3.py
# -*- coding: utf-8 -*-
"""deploy script to upload the files to AWS S3 bucket

Usage:
    $ python deploy_s3.py <folder name for deploy>
"""

import os
import sys
from boto.s3.connection import S3Connection
from boto.s3.key import Key


ACCESS_KEY_ID = 'xxx'
SECRET_ACCESS_KEY = 'xxx'
BUCKET_NAME = 'xxx'


def main():
    # check arguments
    if len(sys.argv) is not 2:
        print '[ERROR] wrong number of arguments. (required 1, got %s)' % len(sys.argv)
        sys.exit(1)
    _file_name = str(sys.argv[1])

    # upload to S3
    try:
        upload_to_s3(_file_name)
    except Exception, e:
        raise e
        print '[ERROR] upload to S3 has been failed.'
    print '[OK] upload to S3 bucket has successfully completed. :)'


def upload_to_s3(file_name):
    # connect to S3
    s3 = S3Connection(ACCESS_KEY_ID, SECRET_ACCESS_KEY)
    bucket = s3.get_bucket(BUCKET_NAME)
    # upload with metadata and publish
    fc = 0
    for abspath, relpath in upload_files(file_name):
        k = Key(bucket)
        k.key = relpath
        k.set_metadata('Cache-Control', 'max-age=10')
        k.set_contents_from_filename(abspath)
        k.make_public()
        fc += 1
    print '[OK] %s files are uploaded.' % fc


def upload_files(basedir):
    parent_dir = os.path.dirname(os.path.realpath(basedir))
    for (path, dirs, files) in os.walk(basedir):
        for fn in files:
            if fn.startswith('.'):
                continue
            abspath = os.path.join(path, fn)
            yield (
                abspath,
                os.path.relpath(abspath, parent_dir).split(''.join([basedir, '/']))[1]
            )


if __name__ == '__main__':
    main()

このスクリプトを以下のように実行すると hoge フォルダ内の不可視ファイル(. から始まるファイル)以外がすべて S3 のルートディレクトリに指定のヘッダを付けてアップロードし publish されます.

$ python deploys3.py hoge

Qiita の投稿の使い方よくわからない...
boto のような機能の gem や npm がもしあったら誰か教えてくださいm()m

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
24