aws sdk for python and cloudian hyperstore

70
Technical Tips on CLOUDIAN HyperStore #3 Technical Tips on CLOUDIAN HyperStore® AWS SDK for Python を使用した S3 API プログラミング (CLOUDIAN HyperStore v5.2.x 対応版) Version 1.0 Mar. 1, 2016

Upload: cloudian

Post on 08-Apr-2017

657 views

Category:

Technology


12 download

TRANSCRIPT

Page 1: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on CLOUDIAN HyperStore #3

Technical Tips on CLOUDIAN HyperStore®

AWS SDK for Python を使用した S3 API プログラミング (CLOUDIAN HyperStore v5.2.x 対応版)

Version 1.0

Mar. 1, 2016

Page 2: AWS SDK for Python and CLOUDIAN HyperStore

《 目 次 》

1. はじめに ........................................................................................................ 3

2. AMAZON SDK FOR PYTHON (BOTO3) のインストール ............................................ 5

3. クレデンシャル情報の設定 .................................................................................... 6

4. AWS SDK FOR PYTHON の利用例 .................................................................... 8

(1) BOTO3 モジュールのインポート .......................................................................... 9

(2) S3CLIENT(BOTO3.CLIENT)オブジェクトの作成 ................................................. 10

(3) 作成済みバケットの表示 / LIST_BUCKETS() .................................................... 15

1. 加工せずに表示 ...................................................................................... 16

2. バケットに関する情報を絞り込んで表示(各バケット名と作成日時) ............................ 17

3. バケットに関する情報に絞り込んで表示し、作成日時を整形(各バケット名と作成日時) .... 18

4. バケットに関する情報を見やすく表示(各バケット名と作成日時) ............................... 19

(4) バケットの新規作成 / CREATE_BUCKET() ....................................................... 20

1. シンプルなバケット作成例(属性は全てデフォルト) ............................................... 21

2. 属性を指定したバケット作成例① ................................................................... 22

3. 属性を指定したバケット作成例② ................................................................... 23

(5) S3 TRANSFERS によるファイル転送処理 (ファイルのアップロード/ダウンロード) ............... 24

1. S3Transfer オブジェクトの作成 ..................................................................... 26

2. ファイルのアップロード / S3Transfer.upload_file() ........................................... 27

3. ファイルのダウンロード / S3Transfer.download_file() ....................................... 32

(6) バケットに格納されているオブジェクトのリスト表示 / LIST_OBJECTS() .......................... 35

(7) バケットに格納されているオブジェクトの削除 / DELETE_OBJECT() .............................. 37

(8) バケットの削除 / DELETE_BUCKET() ............................................................. 38

(9) バケットに対するバージョニング設定 .................................................................. 40

1. バケットのバージョニングを有効化 / put_bucket_versioning() ............................ 40

2. バケットのバージョニング状態の確認 / get_bucket_versioning() ......................... 42

3. バージョニングが有効にされたバケットにファイルをアップロード ....................................... 43

4. バージョニングされたオブジェクトのリスト表示 / list_object_versions() ..................... 45

5. バケットのバージョニングを一時停止/ put_bucket_versioning() ........................... 49

(10) オブジェクトのメタデータ表示 / HEAD_OBJECT() .............................................. 50

1. 最新バージョンのオブジェクトのメタデータ ............................................................. 51

Page 3: AWS SDK for Python and CLOUDIAN HyperStore

2. 過去バージョンのオブジェクトのメタデータ ............................................................. 52

(11) 事前署名付き URL の生成 / GENERATE_PRESIGNED_URL () ............................ 55

1. デフォルトの有効期間(3,600 秒)で事前署名付き URL を生成 ............................. 56

2. 有効期限を 2 日間(7,200 秒)に設定して事前署名付き URL を生成 ..................... 57

3. 有効期限を 2 分(120 秒)に設定して事前署名付き URL を生成 ........................... 58

5. PYTHON プログラムサンプル ............................................................................... 60

(1) アップロードの進捗状況表示 ......................................................................... 60

(2) マルチスレッドによるファイルのアップロード ............................................................. 64

6. おわりに ...................................................................................................... 67

Page 4: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.2 Copyright © 2010-2016 Cloudian KK. All rights reserved.

本書では、AWS が無償で提供しているソフトウェア開発キット「AWS SDK for Python (boto3)」

を利用して CLOUDIAN HyperStore® を操作するための Python プログラミング環境の構築方

法と、簡単な使用例を掲載しその使い方を説明します。

本書では、AWS SDK for Python で使用可能な全てのメソッドの説明は記載しません。AWS SDK

for Python の環境構築および代表的なバケットの作成/削除やファイルのアップロード/ダウンロード、

バージョニングの設定等、一部のメソッドのみ掲載し説明しています。

また、Python 2/3 プログラム言語自体の構文説明や使用方法については、本書では説明しません。

Python 自体の使い方に関しては、インターネットや関連書籍でご確認ください。

本書では説明されていないその他多数のメソッドや、記載されているメソッドのより詳細な内容・説明を

確認したい場合には、AWS SDK for Python の公式ドキュメントページをご参照ください。

《注意事項》

本書に掲載するサンプルコードは、AWS SDK for Python の概要を説明するための非常に簡易なものです。そのため、

サンプルコードでは最低限の機能しか実装しておらず、エラーハンドリングも不十分な状態です。実環境で使用される場合

は本書を参考にして、必要な機能やエラーハンドル処理を実装してください。

本書に掲載するサンプルコードを使用したことにより発生したデータの損失またはお客様のコンピューター・システムへの損

傷などのいかなる損害についても、クラウディアン株式会社は一切の責任を負わないものとします。

サンプルコードをそのままご使用になられる場合は、自己判断・自己責任でお願いします。

Page 5: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.3 Copyright © 2010-2016 Cloudian KK. All rights reserved.

1. はじめに

CLOUDIAN HyperStore®(以下、「HyperStore」)は Amazon S3 完全互換のオブジェクトスト

レージですので、AWSが無償で提供している各種SDKやコマンドラインツールを利用することができます。

2016 年 1 月 26 日現在、AWS は下図のような、11 種類の SDK を提供しています。

URL: https://aws.amazon.com/jp/tools/

Page 6: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.4 Copyright © 2010-2016 Cloudian KK. All rights reserved.

前頁の SDK 以外にも下図のような IDE ツールキットやコマンドラインツールも提供しており、その全

てを HyperStore でも利用することができます。

上述のような AWS が提供している様々な SDK やツールを HyperStore でも利用することができます

が、これらのデフォルトの接続先は AWS のリージョン内の S3 エンドポイントが想定されています。これら

SDK やツールを HyperStore に対して使用する場合の大前提として、デフォルトである AWS が想定さ

れた接続先を HyperStore の S3 エンドポイントに上書きする必要があります。

AWS がインターネット上に公開している各種ドキュメントは、接続先として Amazon S3 を前提に作

成されているため、HyperStore を接続先として各種 SDK を使用するための設定に関する記載はありま

せん。「HyperStore で SDK を利用するためにはどうしたら良いのか?」というお問い合わせを頂くことも

多く、本書では HyperStore で AWS SDK をご活用頂くための設定方法について記載しています。

本書中のサンプルコードは著者が書いたものですが、著者自身には本格的な開発経験はありません。

稚拙なコードになっていると自覚していますが、あくまでも AWS SDK for Python をご活用頂くためのサ

ンプルとしてご参照頂ければ幸いです。

Page 7: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.5 Copyright © 2010-2016 Cloudian KK. All rights reserved.

2. Amazon SDK for Python (boto3) のインストール

Amazon SDK for Python(以下、「boto3」と表記)のインストールは、非常に簡単です。

boto3 は、Python バージョン 2.6.5+、2.7、3.3、3.4 をサポートします。これらのバージョンの

Python がインストールされている環境で、かつ pip1 がインストール済みであれば、以下のコマンドを実

行するだけです。

# pip install boto3

お使いの Python バージョンが、2.7.9以降あるいは 3.4以降であれば、pip は標準でインストールさ

れています。これらよりも以前のバージョンをご使用の場合は、Linux/Windows/Mac それぞれの環境

に合わせた方法で pip をインストールしてください。例として、以下のような Linux 環境で、pip をインスト

ールする方法を例示します。

(1) Pythonのバージョン確認

# python --version

Python 2.7.5

(2) pipのインストール

# curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 100 1379k 100 1379k 0 0 115k 0 0:00:11 0:00:11 --:--:-- 358k Collecting pip /tmp/tmpUns2I_/pip.zip/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. Downloading pip-7.1.2-py2.py3-none-any.whl (1.1MB) 100% |????????????????????????????????| 1.1MB 222kB/s Collecting wheel Downloading wheel-0.26.0-py2.py3-none-any.whl (63kB) 100% |????????????????????????????????| 65kB 7.0MB/s Installing collected packages: pip, wheel Successfully installed pip-7.1.2 wheel-0.26.0 /tmp/tmpUns2I_/pip.zip/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

1 pip は Python で書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムである。多くの Python パッケージは、Python

Package Index(PyPI)上にある。

pip は Python 2.7.9 以降、Python 3.4 以降からデフォルトで付属するようになった。(Wikipedia より引用)

Page 8: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.6 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(3) pipのバージョン確認

# pip --version

pip 7.1.2 from /usr/lib/python2.7/site-packages (python 2.7)

3. クレデンシャル情報の設定

Python から boto3 を利用するには、事前にクレデンシャル情報(アクセスキーとシークレットキー)を設定

しておく必要があります。

クレデンシャル情報の設定方法には下記 4 種類の方法があり、複数の方法でクレデンシャル情報が設

定されている際の参照優先順位は、記載順上位のものが高くなっています。

■クレデンシャル情報の設定方法(優先順位: 上から“高”)

① 環境変数

AWS_ACCESS_KEY_ID

AWS_SECRET_ACCESS_KEY

AWS_DEFAULT_REGION

② AWS認証情報 (~/.aws/credentials)

③ CLI構成ファイル (~/.aws/config)

④ インスタンスプロファイルの認証情報

①「環境変数」は、HyperStore の管理 Web UI である Cloudian Management Console(以

下 、 「 CMC 」 ) で 確 認 し た ア ク セ ス キ ー と シ ー ク レ ッ ト キ ー を 、 OS 上 の 環 境 変 数 で あ る

AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY に設定する方法です。

export AWS_ACCESS_KEY_ID="17b06232a5c5aa14c191"

export AWS_SECRET_ACCESS_KEY="1qEjM/Q+mtudeMtgKfm0dG/D7IQgExEwHtVbgMYf"

export AWS_DEFAULT_REGION="region1"

Page 9: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.7 Copyright © 2010-2016 Cloudian KK. All rights reserved.

②「AWS認証情報」あるいは③「CLI構成ファイル」は、各ユーザーのホームディレクトリ直下の隠しデ

ィレクトリ「.aws」に存在する設定ファイル「credentialls」あるいは「config」に、アクセスキーとシークレッ

トキーを記入しておく方法です。

# cat ~/.aws/credentials

[default]

aws_access_key_id = 17b06232a5c5aa14c191

aws_secret_access_key = 1qEjM/Q+mtudeMtgKfm0dG/D7IQgExEwHtVbgMYf

# cat ~/.aws/config

[default]

region = region1

この「credentialls」と「config」は、上述の場所に手作業で作成することも可能ですが、AWS CLI を

導入し、「aws configure」コマンドを実行し必要な情報を入力することにより、ユーザーのホームディレク

トリ直下に自動的に作成されます。

その他、Python プログラム中に直接、クレデンシャル情報を埋め込む方法もありますが、この方法は後

述します。

Page 10: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.8 Copyright © 2010-2016 Cloudian KK. All rights reserved.

4. AWS SDK for Python の利用例

クレデンシャル情報の設定が完了し、必要な boto3 関連

パッケージ/モジュールを Python プログラム内でインポートす

れば、Python プログラムから boto3 の各種メソッドを使用す

ることができます。

本書ではサンプル例示のために Python 2.7.9 for

Windows をインストールし、標準で一緒にインストールされ

る「IDLE (Python GUI)」を使用しています。

Python では CLI を使用したインタラクティブな実行による出力と、スクリプト化されたプログラムの実行

による出力では、出力される内容が異なります。CLI の場合はリストやタプル、辞書やセットの変数の内容

を画面に出力したり、また、プログラムの戻り値を画面に出力させたりすることができるため、プログラムの挙

動を確認するのに便利です。

Python 自体および boto3 の構文は、もちろん CLI/モジュールともに同じですので、CLI で確認した

内容をファイルに保存(*****.py)し実行することができます。

また、本書で boto3 の検証に使用した HyperStore は、

リージョン名 region1

S3 エンドポイント(サービス URL) s3-region1.shibuya.local

S3 サービスの SSL使用の有無 無し(80/HTTP 通信)

という環境設定になっています。

Page 11: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.9 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(1) boto3 モジュールのインポート

pip で boto3 がインストールされると、site-packages ディレクトリに boto3 と botocore

の 2 つのサブディレクトリが作成され、boto3 関連のパッケージ/モジュールが格納されます。

本書での説明のために必要なモジュールを、いくつかインポートしておきます。

>>> import boto3

>>> from boto3.s3.transfer import S3Transfer

>>> from datetime import datetime

boto3 に関連したパッケージ/モジュールのインポートを、1~2 行目で行っています。3行目

の datetime は、Python 標準モジュールです。

Page 12: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.10 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(2) S3Client(boto3.client)オブジェクトの作成

boto3 を含む AWS SDK では S3 API に 1:1 で対応する「低水準 API」と、より高度な操

作を行うことができるオブジェクト指向の「高水準 API」が提供されています。

以降の例では主に、低水準で動作するメソッドや関数を提供する S3Client(boto3.client)

オブジェクトを作成/使用し、boto3 の基本的な使用方法を説明します。

boto3.client()の引数として、以下のものを設定します。

第一引数には、AWS のサービス種別を設定します。ここには、「's3’」を設定します。

※boto3 自体は、AWS の S3 以外のサービスのためのメソッドも提供しています。

第二引数には、AWS のエンドポイントではなく HyperStoreの S3 エンドポイントを指

定するために、「endopoint_url=’{HyperStore の S3 エンドポイント}’」を設

定します。

>>> client = boto3.client('s3', endpoint_url='http://s3-region1.shibuya.local')

Page 13: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.11 Copyright © 2010-2016 Cloudian KK. All rights reserved.

前頁の例では、AWS のサービス種別として「’s3’」を、S3 エンドポイントの URL として

「’http://s3-region1.shibuya.local’」を設定しています。endpoint_url の設定によ

り、デフォルトの参照先である AWS の S3 エンドポイントを、HyperStore の S3 エンドポイントに

上書きしています。

なお、クレデンシャル情報(アクセスキーとシークレットキー)は、上述「3. クレデンシャル情報の設

定」に記載のいずれかの方法で設定済みであることを前提にしています。

Page 14: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.12 Copyright © 2010-2016 Cloudian KK. All rights reserved.

Python プログラム内でクレデンシャル情報を設定したい場合には、以下のように

boto3.session モジュールの Session をインポートし、アクセスキーとシークレットキーを設定し

た Session オブジェクトを作成します。この Session オブジェクトから S3 リソースオブジェクトを作

成し、このリソースオブジェクトを使用して S3Client オブジェクトを作成します。

>>> from boto3.session import Session ← Session 関数をインポート。

引数にアクセスキー/シークレットキーとリージョン名を渡して Session オブジェクトを生成する。

>>> session = Session(aws_access_key_id='17b06232a5c5aa14c191',

aws_secret_access_key='1qEjM/Q+mtudeMtgKfm0dG/D7IQgExEwHtVbgMYf',

region_name='region1')

>>> s3 = session.resource('s3') ← S3 リソースを利用する Session オブジェクトに設定。

>>> client = session.client('s3',

endpoint_url='http://s3-region1.shibuya.local')

この Session オブジェクトから、S3Client オブジェクトを生成する。

Page 15: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.13 Copyright © 2010-2016 Cloudian KK. All rights reserved.

ここまでの Python プログラムで作成した S3Client オブジェクトには、HyperStore に対して

様々な操作(バケットの作成/削除やデータのアップロード/ダウンロード等々)を行うことができる多くのメ

ソッドが既に用意されています。

以下は、S3Client(boto3.client)で使用可能なメソッドの一覧です。

abort_multipart_upload() can_paginate() complete_multipart_upload() copy_object() create_bucket() create_multipart_upload() delete_bucket() delete_bucket_cors() delete_bucket_lifecycle() delete_bucket_policy() delete_bucket_replication() delete_bucket_tagging() delete_bucket_website() delete_object() delete_objects() download_file() generate_presigned_post() generate_presigned_url() get_bucket_acl() get_bucket_cors() get_bucket_lifecycle() get_bucket_lifecycle_configuration() get_bucket_location() get_bucket_logging() get_bucket_notification() get_bucket_notification_configuration() get_bucket_policy() get_bucket_replication() get_bucket_request_payment() get_bucket_tagging() get_bucket_versioning() get_bucket_website() get_object() get_object_acl() get_object_torrent() get_paginator() get_waiter() head_bucket() head_object() list_buckets() list_multipart_uploads() list_object_versions() list_objects() list_parts()

Page 16: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.14 Copyright © 2010-2016 Cloudian KK. All rights reserved.

put_bucket_acl() put_bucket_cors() put_bucket_lifecycle() put_bucket_lifecycle_configuration() put_bucket_logging() put_bucket_notification() put_bucket_notification_configuration() put_bucket_policy() put_bucket_replication() put_bucket_request_payment() put_bucket_tagging() put_bucket_versioning() put_bucket_website() put_object() put_object_acl() restore_object() upload_file() upload_part() upload_part_copy()

これらメソッドの詳しい使用方法を確認したい場合は、下記 URL を参照してください。

Boto 3 Documentation

https://boto3.readthedocs.org/en/latest/index.html#

次節以降では、この S3Client オブジェクトを使用した各種操作の簡単なサンプルを掲載し、

boto3 の具体的な使い方を紹介します。

Page 17: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.15 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(3) 作成済みバケットの表示 / list_buckets()

アクセスキーとシークレットキーで認証されたユーザーが所有する、全てのバケットの情報を返しま

す。戻り値は、Python の辞書(dict)型として返されます。

response = client.list_buckets()

辞書(dict)型

{ 'Buckets': [ { 'Name': 'string', 'CreationDate': datetime(2015, 1, 1) }, ], 'Owner': { 'DisplayName': 'string', 'ID': 'string' } }

【構成】

(dict) -- Buckets (list) -- (dict) --

Name (string) -- バケット名

CreationDate (datetime) -- バケットの作成日付

Owner (dict) -- DisplayName (string) -- ID (string) --

構 文

戻り値型

戻り値

Page 18: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.16 Copyright © 2010-2016 Cloudian KK. All rights reserved.

1. 加工せずに表示

以下の例では、list_buckets()を単純に呼び出して、全ての戻り値を表示しています。

>>> client.list_buckets()

list_buckets()からは非常に多くの情報が返されるため、以降の例では出力を絞り込んで

表示させます。

Page 19: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.17 Copyright © 2010-2016 Cloudian KK. All rights reserved.

2. バケットに関する情報を絞り込んで表示(各バケット名と作成日時)

list_buckets()で返された辞書型の戻り値から、辞書キー「Buckets」の値を抽出し、さら

に「Name」(バケット名)と「CreationDate」(作成日付)に絞り込んで表示させています。

>>> for bucket in client.list_buckets()['Buckets']:

... print(bucket['Name'], bucket['CreationDate'])

...

上述の戻り値の解説にあるように、list_buckets()は辞書(dict)型で作成済みバケット

に関する情報を戻しますので、プログラムで必要となるデータのみを Python プログラムで抽出す

ることができます。

('auto-tiering', datetime.datetime(2015, 10, 19, 8, 38, 3, 904000,

tzinfo=tzutc()))

上記の出力は string 型のバケット名と、datetime 型の作成日付のみを抽出し、Python

のタプル(tuple)型で受け取っています。

Page 20: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.18 Copyright © 2010-2016 Cloudian KK. All rights reserved.

3. バケットに関する情報に絞り込んで表示し、作成日時を整形(各バケット名と作成日時)

バケット名とその作成日付に絞り込み、表示される作成日付を整形しています。

>>> for bucket in client.list_buckets()['Buckets']:

... print(bucket['Name'],

bucket['CreationDate'].strftime("%Y/%m/%d %H:%M:%S"))

...

以下の出力のように、datetime 型で戻される作成日付(CreationDate)を、Python

標準モジュールに含まれる strftime()を使って見やすいように整形して出力しています。

('mybucket001', '2015/11/02 02:27:35') ('owncloud-finance', '2015/10/19 05:25:04') ('owncloud-it', '2015/10/19 05:09:23') ('owncloud-marketing', '2015/10/19 05:09:57') ('owncloud-sales', '2015/10/19 05:09:31') ('s3-clients', '2015/11/08 08:35:05')

Page 21: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.19 Copyright © 2010-2016 Cloudian KK. All rights reserved.

4. バケットに関する情報を見やすく表示(各バケット名と作成日時)

出力されるバケット作成日付に+9時間して、日本時間で表示しています。

>>> for bucket in client.list_buckets()['Buckets']:

print('%s (%s)' % (bucket['Name'],

(bucket['CreationDate'] +

datetime.timedelta(hours=9)).strftime("%Y/%m/%d %H:%M:%S")))

Page 22: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.20 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(4) バケットの新規作成 / create_bucket()

HyperStore にバケットを新規作成します。

response = client.create_bucket( ACL='private'|'public-read'|'public-read-write'|'authenticated-read', Bucket='string', CreateBucketConfiguration={ 'LocationConstraint': 'EU'|'eu-west-1'|'us-west-1'|'us-west-2'|'ap-southeast-1'|'ap-southeast-2'|'ap-northeast-1'|'sa-east-1'|'cn-north-1'|'eu-central-1' }, GrantFullControl='string', GrantRead='string', GrantReadACP='string', GrantWrite='string', GrantWriteACP='string' )

【パラメータ】

ACL (string) -- バケットに適用する ACL

Bucket (string) -- バケット名 [必須]

CreateBucketConfiguration (dict) --

LocationConstraint (string) -- バケットが作成されるリージョンを指定する。

GrantFullControl (string) -- バケットに対して読み取り、書き込み、

読み取り ACP、書き込み ACP 権限を付与するユーザー。

GrantRead (string) -- バケット内のオブジェクトのリスト権限を付与するユーザー。

GrantReadACP (string) -- バケット ACL の読取り権限を付与するユーザー。

GrantWrite (string) -- バケット内のオブジェクト作成、上書きおよび削除権限を付与するユーザー。

GrantWriteACP (string) -- バケット ACL の書込み権限を付与するユーザー。

辞書(dict)型

{ 'Location': 'string' }

【構成】

(dict) -- Location (string) --

構 文

戻り値型

戻り値

Page 23: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.21 Copyright © 2010-2016 Cloudian KK. All rights reserved.

1. シンプルなバケット作成例(属性は全てデフォルト)

以 下 の 例 で は 、 create_bucket() の 引 数 に 作 成 す る バ ケ ッ ト 名 ( Bucket=’

pythonbucket1’)のみを設定し、属性値は全てデフォルトを使用してバケットを作成しています。

>>> client.create_bucket(Bucket='pythonbucket1')

Page 24: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.22 Copyright © 2010-2016 Cloudian KK. All rights reserved.

2. 属性を指定したバケット作成例①

以 下 の 例 で は 、 create_bucket() の 引 数 に 作 成 す る バ ケ ッ ト 名 ( Bucket=’

pythonbucket1’)とそのバケットの ACL(ACL=’public-read’)を設定して、バケットを作成し

ています。

>>> client.create_bucket(

... ACL='public-read',

... Bucket='pythonbucket1'

... )

Page 25: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.23 Copyright © 2010-2016 Cloudian KK. All rights reserved.

3. 属性を指定したバケット作成例②

以 下 の 例 で は 、 create_bucket() の 引 数 に 作 成 す る バ ケ ッ ト 名 ( Bucket=’

pythonbucket1’)とバケットの ACL(ACL=’private’)、およびロケーションコンストレイント

(CreateBucketConfiguration={‘LocationConstraint’: ‘region1’})を設定してバケットを作

成しています。

>>> client.create_bucket(

... ACL='private',

... Bucket='pythonbucket1',

... CreateBucketConfiguration={

... 'LocationConstraint': 'region1'

... }

... )

Page 26: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.24 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(5) S3 Transfersによるファイル転送処理 (ファイルのアップロード/ダウンロード)

boto3 には、より簡易に/より効率的にアップロード/ダウンロード操作を行うことができる S3

Transfers というモジュールが用意されています。

S3 Transfers は、以下のような機能を提供しています。

指定したファイルサイズを上回った際に、自動的にマルチパート転送に切り替わります。

並列処理でファイルのアップロード/ダウンロードを実行します。

ネットワークの最大帯域幅に応じて、ファイルを転送します。

転送状況をモニタリングするために、転送の進捗状況をコールバックできます。

ファイルのアップロード時に、リトライを実行します。

S3 Transfers のパラメータのデフォルト値には最適な値が設定されていますが、以下のパラメ

ータ設定を変更することもできます。

マルチパート閾値サイズ

並行ダウンロード処理の最大数

使用するネットワーク最大帯域幅

ソケット・タイムアウト値

リトライ回数

S3 Transfers のパラメータを変更するには、変更対象のパラメータの設定値を引数に積み、

TransferConfig オブジェクトを作成します(事前に”boto3.s3.transfer.TransferConfig”をインポ

ートする必要があります)。

>>> import boto3

>>> from boto3.s3.transfer import S3Transfer

>>> from boto3.s3.transfer import TransferConfig

Page 27: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.25 Copyright © 2010-2016 Cloudian KK. All rights reserved.

S3Transfer()の引数に、既に作成済みの S3Client オブジェクトとこの TransferConfig オ

ブジェクトを渡して S3Transfer オブジェクトを作成します。

>>> client = boto3.client('s3',

endpoint_url='http://s3-region1.shibuya.local'

)

>>> config = TransferConfig(

multipart_threshold = 8 * 1024 * 1024,

max_concurrency = 10,

multipart_chunksize = 8388608,

num_download_attempts = 10,

max_io_queue = 100

)

>>> transfer = S3Transfer(client, config)

Page 28: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.26 Copyright © 2010-2016 Cloudian KK. All rights reserved.

1. S3Transferオブジェクトの作成

S3 Transfers の機能を利用するためには、まず S3Transfer オブジェクトを作成します。

事前に、「boto3.s3.transfer.S3Transfer」をインポートしておく必要があります。本書

の例では、既に S3Transfer はインポート済みの状態になっています。

S3Transfer()の引数に、既に作成済みの S3Client オブジェクトを渡して S3Transfer オ

ブジェクトを作成します。S3Client オブジェクトのみを引数として渡し S3 Transfers オブジェク

トを作成した場合には、S3 Transfers のパラメータは全てデフォルト値が使用されます。

>>> transfer = S3Transfer(client)

Page 29: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.27 Copyright © 2010-2016 Cloudian KK. All rights reserved.

2. ファイルのアップロード / S3Transfer.upload_file()

S3 Transfers を 使 用 し て HyperStore に フ ァ イ ル を ア ッ プ ロ ー ド す る に は 、

upload_file()を使用します。extra_args 引数を設定して upload_file()を呼び出すこと

により、アップロード時にオブジェクト(ファイル)の ACL を設定したり、メタデータを付加したり、

暗号化を行ったりできます。

~ Windows環境の場合 ~

● シンプルなファイルのアップロード

以下の例では、ローカルの「C:\TEMP」フォルダにあるファイル「200mb.dat」を、

HyperStoreのバケット「pythonbucket1」にキー「200mb.dat」を設定してアップロードして

います。

>>> transfer.upload_file('C:¥¥Temp¥¥200mb.dat', 'pythonbucket1', '200mb.dat')

upload_file(filename, bucket, key, callback=None, extra_args=None)

【パラメータ】

filename (string) -- アップロードするファイル名 [必須]

bucket (string) -- アップロードするファイルの格納先バケット [必須]

key (string) -- アップロードするオブジェクトのキー(ファイル)名 [必須]

callback (func) -- コールバック関数。デフォルトは設定無し。

extra_args (dict) -- アップロード時に指定する追加の引数。

構 文

Page 30: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.28 Copyright © 2010-2016 Cloudian KK. All rights reserved.

下図は、前頁の upload_file()の使用例で HyperStore にアップロードしたファイルを CMC の

オブジェクト画面から参照したものです。

アップロードされた

ファイル

Page 31: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.29 Copyright © 2010-2016 Cloudian KK. All rights reserved.

● アップロード時に ACL、メタデータ、暗号化を指定

以下の例では、ローカルの「C:\TEMP」フォルダにあるファイル「200mb.dat」を、HyperStore

のバケット「pythonbucket1」にキー「200mb.dat」を指定し、extra_args を設定してオブジェク

トの ACL には「public-read」、3 つのメタデータを付加して「AES256」でサーバーサイド暗号化す

るように指定してアップロードしています。

>>> transfer.upload_file('C:¥¥Temp¥¥200mb.dat', 'pythonbucket1', '200mb.dat',

... extra_args={'ACL': 'public-read',

... 'Metadata': {'Purpose': 'boto3 demo',

... 'Engineer': 'Ryosuke Matsui',

... 'Company': 'Cloudian K.K.'},

... 'ServerSideEncryption': 'AES256'

... }

... )

Page 32: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.30 Copyright © 2010-2016 Cloudian KK. All rights reserved.

下図は、前頁の upload_file()の使用例で HyperStore にアップロードしたファイルを CMC の

オブジェクト画面から参照したものです。

upload_file()の extra_args パラメータ「ServerSideEncryption」を使用し、AES256 で

サーバーサイド暗号化を行うように設定したので、ファイル名の先頭に「 」マークが表示され、このファ

イルが暗号化されていることが分かります。

また、下図のようにこのファイルのプロパティを開いてみると、extra_args パラメータの ACL で設定

したように、このファイルのアクセス権に「パブリック:読み出し可能('ACL': 'public-read')」にチェッ

クが入っていることが分かります。

Page 33: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.31 Copyright © 2010-2016 Cloudian KK. All rights reserved.

~ Linux/Mac環境の場合 ~

boto3 はもちろん Linux/Mac 環境でも使用可能なので、上述の S3 Transfers によるファイルアッ

プロード操作は同様に行えます(パスの形式が異なるだけです)。

(1) シンプルなファイルのアップロード >>> transfer.upload_file('/root/200mb.dat', 'pythonbucket1', '200mb.dat')

(2) アップロード時に ACL、メタデータ、暗号化を指定 >>> transfer.upload_file('/root/200mb.dat', 'pythonbucket1', '200mb.dat', ... extra_args={'ACL': 'public-read', ... 'Metadata': {'Purpose': 'boto3 demo', ... 'Engineer': 'Ryosuke Matsui', ... 'Company': 'Cloudian K.K.'}, ... 'ServerSideEncryption': 'AES256' ... }

... )

補 足

Page 34: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.32 Copyright © 2010-2016 Cloudian KK. All rights reserved.

3. ファイルのダウンロード / S3Transfer.download_file()

S3 Transfers を 使 用し て HyperStore か ら フ ァ イ ル を ダ ウン ロ ー ドす る には 、

download_file()を使用します。extra_args 引数を設定して download_file()を呼び

出すことにより、ダウンロード時にオブジェクトのバージョン ID を指定したりすることができます。

以下の例では、バケット「pythonbucket1」に保存されているキー「200mb.dat」の最新

バージョンのオブジェクトをダウンロードしています。

バケット「pythonbucket1」のバージョニング機能が有効にされていた場合、この例ではバー

ジョン ID を指定していないので“最新バージョンのオブジェクト”がダウンロードされます(バージョニ

ング機能については、後述します)。

>>> transfer.download_file('pythonbucket1', '200mb.dat',

'C:¥¥TEMP¥¥download_200mb.dat')

download_file(bucket, key, filename, extra_args=None, callback=None)

【パラメータ】

bucket (string) -- ダウンロードするファイルの格納元バケット [必須]

key (string) -- ダウンロードするオブジェクトのキー(ファイル)名 [必須]

filename (string) -- ダウンロードするファイル名 [必須]

extra_args (dict) -- ダウンロード時に指定する追加の引数。

callback (func) -- コールバック関数。デフォルトは設定無し。

構 文

Page 35: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.33 Copyright © 2010-2016 Cloudian KK. All rights reserved.

以下の例では、バージョニング機能が有効化されているバケット「pythonbucket1」に保存

されているキー「200mb.dat」の、バージョン ID が「fe1a6cea-43ed-667f-ab13-

000c29058d53」のオブジェクトをダウンロードしています。

>>> transfer.download_file('pythonbucket1', '200mb.dat',

'C:¥¥TEMP¥¥download_200mb_2.dat',

... extra_args={'VersionId': 'fe1a6cea-43ed-667f-ab13-000c29058d53'}

... )

~ get_object() を使用したファイルのダウンロード ~

S3Transfers オブジェクトの download_file()を使用したファイルのダウンロード以外に、低レベル

API に対応する get_object() を使用してファイルのダウンロードを行うこともできます。

>>> with open('c:¥¥TEMP¥¥get_200mb.dat', 'wb') as f: ... f.write(client.get_object(

Bucket='pythonbucket1', Key='200mb.dat', VersionId='fe1a458c-e8b4-761f-9970-000c29146750')['Body'].read() )

... >>>

ただしこの場合、上記サンプルコードのように、S3Transfers オブジェクトを使用した方法よりも若干、

コードが複雑になります。同じ操作を実行するために複数の方法があることがありますので、適材適所で

どの方法を使用するか決めてください。

補 足

Page 36: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.34 Copyright © 2010-2016 Cloudian KK. All rights reserved.

S3 Transfers を使用したファイルのアップロード/ダウンロード時には、マルチパート閾値サイ

ズ(multipart_threshold)が設定されており、そのデフォルト値は「8,388,608 bytes(約

8MB)」になっています。

アップロード/ダウンロード対象のファイルサイズが 8MB よりも大きい場合、S3 Transfers は

自動的に複数のパーツにファイルを分割して同時並行で処理を実行します。

下図は大きなサイズのファイル(約 1GB)を S3 Transfers でアップロードを行っている最中

の、CMC オブジェクト画面のスクリーンショットです。8MB よりも大きなファイルは、自動的にマル

チパートアップロードが実行されていることが分かります。

Page 37: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.35 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(6) バケットに格納されているオブジェクトのリスト表示 / list_objects()

HyperStore にアップロードされたファイル(オブジェクト)の存在を、list_objects()を使って

確認します。

response = client.list_objects( Bucket='string', Delimiter='string', EncodingType='url', Marker='string', MaxKeys=123, Prefix='string' )

【パラメータ】

Bucket (string) -- バケット名 [必須]

Delimiter (string) -- グループキーに使用する区切り文字。

EncodingType (string) -- 戻り値のオブジェクトキーをエンコードするための方法を指定。

オブジェクトキーに Unicode が含まれている場合、XML 1.0 パーサーはそれらの文字を解

析できないため、そのような場合には戻り値のキーのエンコードをこのパラメータを使用して指

定する。

KeyMarker (string) -- バケット内の、このパラメータに指定した文字から始まるキーを持つオブジェクトをリストする。

MaxKeys (integer) -- 戻り値として返されるキーの最大数をセットする。

Prefix (string) -- 指定したプリフィックスから始まるキーに限定する。

辞書(dict)型

構 文

戻り値型

Page 38: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.36 Copyright © 2010-2016 Cloudian KK. All rights reserved.

上述の戻り値の説明のように、list_objects()は多くの情報をPythonのdict型で返します。

以下の例では、返された戻り値の中からオブジェクトのキーとサイズ、最終変更日時のみを表示し

ています。

>>> for obj in client.list_objects(Bucket='pythonbucket1')['Contents']:

... print(obj['Key'], obj['Size'],

obj['LastModified'].strftime("%Y/%m/%d %H:%M:%S"))

...

{ 'IsTruncated': True|False, 'Marker': 'string', 'NextMarker': 'string', 'Contents': [ { 'Key': 'string', 'LastModified': datetime(2015, 1, 1), 'ETag': 'string', 'Size': 123, 'StorageClass': 'STANDARD'|'REDUCED_REDUNDANCY'|'GLACIER', 'Owner': { 'DisplayName': 'string', 'ID': 'string' } }, ], 'Name': 'string', 'Prefix': 'string', 'Delimiter': 'string', 'MaxKeys': 123, 'CommonPrefixes': [ { 'Prefix': 'string' }, ], 'EncodingType': 'url' }

戻り値

Page 39: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.37 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(7) バケットに格納されているオブジェクトの削除 / delete_object()

HyperStore にアップロードされたファイル(オブジェクト)を、delete_object()を使って削除

します。

response = client.delete_object( Bucket='string', Key='string', MFA='string', VersionId='string', RequestPayer='requester' )

【パラメータ】

Bucket (string) -- バケット名 [必須]

Key (string) -- キー [必須]

MFA (string) -- 多要素認証使用時のシリアルナンバー(HyperStoreは未対応)。

VersionId (string) -- オブジェクトの特定のバージョンを指定する際に使用。

RequestPayer (string) -- このリクエストによって生じる課金を支払うユーザー。

辞書(dict)型

{ 'DeleteMarker': True|False, 'VersionId': 'string', 'RequestCharged': 'requester' }

【構成】

(dict) --

DeleteMarker (boolean) -- バージョニングされたオブジェクトが永続的に削除された(true)か、

削除されていない(false)かを示すフラグ。

VersionId (string) -- 削除操作の結果として生成された削除マーカーのバージョン ID。

RequestCharged (string) -- 表示された場合は、このリクエストの請求が正常に指定したリクエスターに

請求されたことを示す。

構 文

戻り値型

戻り値

Page 40: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.38 Copyright © 2010-2016 Cloudian KK. All rights reserved.

以下の例では、バケット「pythonbucket1」に保存されているキー「200mb.dat」の、最新バ

ージョンのオブジェクトを削除しています。

>>> client.delete_object(Bucket='pythonbucket1', Key='200mb.dat')

(8) バケットの削除 / delete_bucket()

HyperStore に作成されているバケットを削除します。

response = client.delete_bucket( Bucket='string' )

【パラメータ】

Bucket (string) -- バケット名 [必須]

無し

無し

構 文

戻り値型

戻り値

Page 41: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.39 Copyright © 2010-2016 Cloudian KK. All rights reserved.

以下の例では、バケット「pythonbucket1」を削除しています。

>>> client.delete_bucket(

... Bucket='pythonbucket1'

... )

バケットを削除するには、バケット内にオブジェクトが存在しない状態である必要があります。

バケット内にオブジェクトが存在する状態で delete_bucket()を実行すると、下図のような

BucketNotEmpty 例外が発生します。

注 意

Page 42: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.40 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(9) バケットに対するバージョニング設定

boto3 からバケットのバージョニング機能を有効にして、その動作を確認します。バケット

「pythonbucket1」は、既に作成されており存在しているものとします。

1. バケットのバージョニングを有効化 / put_bucket_versioning()

put_bucket_versioning()の引数に、バージョニングの状態を変更するバケット名と変

更する状態(ここでは’Enabled’)を渡して実行し、バージョニング機能を有効にします。

response = client.put_bucket_versioning( Bucket='string', MFA='string', VersioningConfiguration={ 'MFADelete': 'Enabled'|'Disabled', 'Status': 'Enabled'|'Suspended' } )

【パラメータ】

Bucket (string) -- バケット名 [必須]

MFA (string) -- 多要素認証使用時のシリアルナンバー(HyperStoreは未対応)。

VersioningConfiguration (dict) --

MFADelete (string) -- HyperStoreは未対応。

Status (string) -- バケットのバージョニング状態。

無し

無し

構 文

戻り値型

戻り値

Page 43: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.41 Copyright © 2010-2016 Cloudian KK. All rights reserved.

以下の例では、バケット「pythonbucket1」のバージョニング機能の状態を有効

(’Status’: ‘Enabled’)に変更しています。

>>> client.put_bucket_versioning(

... Bucket='pythonbucket1',

... VersioningConfiguration={'Status': 'Enabled'}

... )

バケットのバージョニング機能は、有効化するとその後、無効化することはできません。バージョニング機

能を一時停止させたい場合には、後述するように VersioningConfiguration の Status に

「Suspended」を渡して put_bucket_versioning()を実行します。

注 意

Page 44: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.42 Copyright © 2010-2016 Cloudian KK. All rights reserved.

2. バケットのバージョニング状態の確認 / get_bucket_versioning()

get_bucket_versioning()の引数に、バージョニングの状態を確認するバケット名を渡

して実行します。

response = client.get_bucket_versioning( Bucket='string' )

【パラメータ】

Bucket (string) -- バケット名 [必須]

辞書(dict)型

{ 'Status': 'Enabled'|'Suspended', 'MFADelete': 'Enabled'|'Disabled' }

【構成】

(dict) --

Status (string) -- バケットのバージョニング状態。

MFADelete (string) -- HyperStoreは未対応。

構 文

戻り値型

戻り値

Page 45: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.43 Copyright © 2010-2016 Cloudian KK. All rights reserved.

以下の例では、バケット「pythonbucket1」のバージョニング状態を取得しています。

>>> client.get_bucket_versioning(Bucket='pythonbucket1')

3. バージョニングが有効にされたバケットにファイルをアップロード

バージョニング機能が有効化されたバケットに対して、前述の S3 Transfers の

upload_file()を使用して、同じキーで複数回、ファイルをアップロードしてみます。

以下の例では、バージョニング機能が有効化されたバケット「pythonbucket1」に、キー

に「200mb.dat」を設定してファイルを計 4 回アップロードしています。

【1回目】 >>> transfer.upload_file('C:¥¥Temp¥¥200mb.dat', 'pythonbucket1', '200mb.dat')

【2回目】 >>> transfer.upload_file('C:¥¥Temp¥¥200mb.dat', 'pythonbucket1', '200mb.dat', ... extra_args={'ACL': 'public-read', ... 'Metadata': {'Purpose': 'boto3 demo 1', ... 'Engineer': 'Ryosuke Matsui', ... 'Company': 'Cloudian K.K.'}, ... 'ServerSideEncryption': 'AES256' ... } ... )

※ アップロード時にユーザー定義のメタデータを付加

extra_args={Metadata': {'名前': '値', .....}}

※ アップロード時に暗号化(AES256)を指定

'ServerSideEncryption': 'AES256'

Page 46: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.44 Copyright © 2010-2016 Cloudian KK. All rights reserved.

【3回目】 >>> transfer.upload_file('C:¥¥Temp¥¥200mb.dat', 'pythonbucket1', '200mb.dat', ... extra_args={'ACL': 'private', ... 'Metadata': {'Purpose': 'boto3 demo 2', ... 'Person': 'Toshiaki Tsurumi', ... 'Memo': 'Working for Cloudian K.K.'} ... } ... )

※ アップロード時にユーザー定義のメタデータを付加

extra_args={Metadata': {'名前': '値', .....}

※ 暗号化なし

【4回目】 >>> transfer.upload_file('C:¥¥Temp¥¥200mb.dat', 'pythonbucket1', '200mb.dat', ... extra_args={'ServerSideEncryption': 'AES256'} ... )

※ アップロード時に暗号化(AES256)を指定

'ServerSideEncryption': 'AES256'

Page 47: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.45 Copyright © 2010-2016 Cloudian KK. All rights reserved.

4. バージョニングされたオブジェクトのリスト表示 / list_object_versions()

バージョニングされた(今現在、最新バージョンではない)オブジェクト(ファイル)をリスト表示

するには、list_object_versions()を実行します。

response = client.list_object_versions( Bucket='string', Delimiter='string', EncodingType='url', KeyMarker='string', MaxKeys=123, Prefix='string', VersionIdMarker='string' )

【パラメータ】

Bucket (string) -- バケット名 [必須]

Delimiter (string) -- グループキーに使用する区切り文字。

EncodingType (string) -- 戻り値のオブジェクトキーをエンコードするための方法を指定。

オブジェクトキーに Unicode が含まれている場合、XML 1.0 パーサーはそれらの文字を解

析できないため、そのような場合には戻り値のキーのエンコードをこのパラメータを使用して指

定する。

KeyMarker (string) -- バケット内の、このパラメータに指定した文字から始まるキーを持つオブジェクトをリストする。

MaxKeys (integer) -- 戻り値として返されるキーの最大数をセットする。

Prefix (string) -- 指定したプリフィックスから始まるキーに限定する。

VersionIdMarker (string) -- 指定したバージョン以降のオブジェクトをリストする。

辞書(dict)型

構 文

戻り値型

Page 48: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.46 Copyright © 2010-2016 Cloudian KK. All rights reserved.

{ 'IsTruncated': True|False, 'KeyMarker': 'string', 'VersionIdMarker': 'string', 'NextKeyMarker': 'string', 'NextVersionIdMarker': 'string', 'Versions': [ { 'ETag': 'string', 'Size': 123, 'StorageClass': 'STANDARD', 'Key': 'string', 'VersionId': 'string', 'IsLatest': True|False, 'LastModified': datetime(2015, 1, 1), 'Owner': { 'DisplayName': 'string', 'ID': 'string' } }, ], 'DeleteMarkers': [ { 'Owner': { 'DisplayName': 'string', 'ID': 'string' }, 'Key': 'string', 'VersionId': 'string', 'IsLatest': True|False, 'LastModified': datetime(2015, 1, 1) }, ], 'Name': 'string', 'Prefix': 'string', 'Delimiter': 'string', 'MaxKeys': 123, 'CommonPrefixes': [ { 'Prefix': 'string' }, ], 'EncodingType': 'url' }

【構成】

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_object_versions

を参照のこと。

戻り値

Page 49: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.47 Copyright © 2010-2016 Cloudian KK. All rights reserved.

加工せずに表示

以 下 の 例 で は 、 list_object_versions() の 引 数 に バ ケ ッ ト 名

(Bucket='pythonbucket1’)のみを設定し、全ての戻り値を表示しています。

>>> client.list_object_versions(Bucket='pythonbucket1')

list_object_versions()からは非常に多くの情報が返されるため、以降の例で

は出力を絞り込んで表示させます。

Page 50: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.48 Copyright © 2010-2016 Cloudian KK. All rights reserved.

バージョニングされたオブジェクトに関する情報に絞り込んで表示

以 下 の 例 で は 、 list_object_versions() の 引 数 に バ ケ ッ ト 名

(Bucket='pythonbucket1’)のみを設定し、出力をキーとバージョン ID、最終変更

日時に絞って表示しています。

>>> for version in client.list_object_versions(Bucket='pythonbucket1')['Versions']: print(version['Key'], version['VersionId'], version['LastModified'].strftime("%Y/%m/%d %H:%M:%S"))

Page 51: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.49 Copyright © 2010-2016 Cloudian KK. All rights reserved.

5. バケットのバージョニングを一時停止/ put_bucket_versioning()

put_bucket_versioning()の引数に、バージョニングの状態を変更するバケット名と変

更する状態(ここでは’Suspended’)を渡して実行し、バージョニング機能を一時停止します。

※ 「構文」、「戻り値型」および「戻り値」の詳細説明は、

上述「1. バケットのバージョニングを有効化 / put_bucket_versioning()」を参照のこと。

以下の例では、バケット「pythonbucket1 」のバージョニング機能を一時停止

(VersioningConfiguration={'Status': 'Suspended'})させています。

>>> client.put_bucket_versioning(

Bucket='pythonbucket1',

VersioningConfiguration={'Status': 'Suspended'}

)

上記の put_bucket_versioning()実行後、バケット「pythonbucket1」のバージョニ

ング機能の状態を表示させ、バージョニング機能が一時停止していることを確認しています。

>>> client.get_bucket_versioning(Bucket='pythonbucket1')

Page 52: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.50 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(10) オブジェクトのメタデータ表示 / head_object()

アップロード時にオブジェクトに付与したメタデータを、head_object()で表示します。

response = client.head_object( Bucket='string', IfMatch='string', IfModifiedSince=datetime(2015, 1, 1), IfNoneMatch='string', IfUnmodifiedSince=datetime(2015, 1, 1), Key='string', Range='string', VersionId='string', SSECustomerAlgorithm='string', SSECustomerKey='string', RequestPayer='requester' )

【パラメータ】

Bucket (string) -- [必須]

IfMatch (string) -- 指定した ETag 要素と同じオブジェクトの情報のみを返す。

マッチしない場合は、エラーコード:412 を返す。

IfModifiedSince (datetime) -- 指定した時刻以降に変更されたオブジェクトの情報のみ返す。

マッチしない場合は、エラーコード:304 を返す。

IfNoneMatch (string) -- 指定した ETag 要素とは異なるオブジェクトの情報のみを返す。

マッチしない場合は、エラーコード:304 を返す。

IfUnmodifiedSince (datetime) -- 指定した時刻以降、変更されていないオブジェクトの情報のみを返す。

マッチしない場合は、エラーコード:412 を返す。

Key (string) -- [必須]

Range (string) -- オブジェクトの一部をダウンロードする際に指定するバイト範囲。

VersionId (string) -- オブジェクトの指定したバージョンを参照する際に指定する。

SSECustomerAlgorithm (string) -- HyperStore V6から対応予定。

SSECustomerKey (string) -- HyperStore V6から対応予定。

SSECustomerKeyMD5 (string) -- HyperStore V6 から対応予定。

RequestPayer (string) -- このリクエストによって生じる課金を支払うユーザー。

辞書(dict)型

構 文

戻り値型

Page 53: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.51 Copyright © 2010-2016 Cloudian KK. All rights reserved.

1. 最新バージョンのオブジェクトのメタデータ

以下の例では、バケット「pythonbucket1」に保存されているキー「200mb.dat」の最

新バージョンのオブジェクトに付与されているメタデータを表示させています。

>>> client.head_object(Bucket='pythonbucket1', Key='200mb.dat')

{ 'DeleteMarker': True|False, 'AcceptRanges': 'string', 'Expiration': 'string', 'Restore': 'string', 'LastModified': datetime(2015, 1, 1), 'ContentLength': 123, 'ETag': 'string', 'MissingMeta': 123, 'VersionId': 'string', 'CacheControl': 'string', 'ContentDisposition': 'string', 'ContentEncoding': 'string', 'ContentLanguage': 'string', 'ContentType': 'string', 'Expires': datetime(2015, 1, 1), 'WebsiteRedirectLocation': 'string', 'ServerSideEncryption': 'AES256'|'aws:kms', 'Metadata': { 'string': 'string' }, 'SSECustomerAlgorithm': 'string', 'SSECustomerKeyMD5': 'string', 'SSEKMSKeyId': 'string', 'StorageClass': 'STANDARD'|'REDUCED_REDUNDANCY'|'STANDARD_IA', 'RequestCharged': 'requester', 'ReplicationStatus': 'COMPLETE'|'PENDING'|'FAILED'|'REPLICA' }

【構成】

https://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.head_object

を参照のこと。

戻り値

Page 54: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.52 Copyright © 2010-2016 Cloudian KK. All rights reserved.

格納されているバケットのバージョニング機能が有効にされており、かつバージョン ID を指

定しないでhead_object()を実行した場合には、そのバケットに保存されている最新バージ

ョンのオブジェクトに付与されているメタデータを返します。

2. 過去バージョンのオブジェクトのメタデータ

以下の例では、バージョニング機能が有効になっているバケット「pythonbucket1」に保

存されているキー「200mb.dat」の、バージョン ID「fe1a458c-7be3-dd0f-9970-

000c29146750」のオブジェクトに付与されているメタデータを表示させています。

>>> client.head_object(Bucket='pythonbucket1',

Key='200mb.dat',

VersionId='fe1a458c-7be3-dd0f-9970-000c29146750'

)

Page 55: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.53 Copyright © 2010-2016 Cloudian KK. All rights reserved.

~ メタデータのみ選択して表示 ~

以下の例は、バージョン ID を指定してオブジェクトのメタデータのみを表示させています。

>>> client.head_object(Bucket='pythonbucket1', Key='200mb.dat', VersionId='fe1a458c-5607-53ff-9970-000c29146750' )['Metadata'] >>> client.head_object(Bucket='pythonbucket1', Key='200mb.dat', VersionId='fe1a458c-7be3-dd0f-9970-000c29146750' )['Metadata'] >>> client.head_object(Bucket='pythonbucket1', Key='200mb.dat', VersionId='fe1a458c-e8b4-761f-9970-000c29146750' )['Metadata'] >>> client.head_object(Bucket='pythonbucket1', Key='200mb.dat', VersionId='fe1a458d-57c7-851f-9970-000c29146750' )['Metadata']

補 足

Page 56: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.54 Copyright © 2010-2016 Cloudian KK. All rights reserved.

~ get_object と head_object の違い ~

以下のように”get_object”メソッドでも同様の情報を取得できますが、”head_object”はオブジェク

ト自体を戻さずにメタデータのみを読み取ることができます。

メタデータのみ読み取りたい場合は、”head_object”を使用するほうがお薦めです。

補 足

Page 57: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.55 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(11) 事前署名付き URLの生成 / generate_presigned_url ()

HyperStore に格納 さ れた オ ブ ジェ ク ト の 共有 に使 用で きる パ ブ リ ッ ク URL を 、

generate_presigned_url()を呼び出して生成することができます。

generate_presigned_url(ClientMethod, Params=None, ExpiresIn=3600, HttpMethod=None)

【パラメータ】

ClientMethod (string) -- この URL で使用されるクライアントメソッド。

Params (dict) -- 通常はクライアントメソッドに渡されるパラメータ。

ExpiresIn (int) -- 事前署名付き URL が有効である秒数。デフォルトでは 1 時間(3,600 秒)で失効する。

HttpMethod (string) -- 署名付き URL で使用される HTTP メソッド。

事前署名付き URL

構 文

戻り値

Page 58: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.56 Copyright © 2010-2016 Cloudian KK. All rights reserved.

1. デフォルトの有効期間(3,600秒)で事前署名付き URLを生成

以下の例では、generate_presigned_url()のクライアントメソッドに「get_object」

を設定し、バケット「pythonbucket2」に保存されているキー「User Interface of

CLOUDIAN HyperStore(v5.2)_v1.1.pdf」のオブジェクトを取得できる事前署名

付き URL を生成しています。

有効期間を指定せずに URL を生成した場合、その URL の有効期間はデフォルトで

3,600 秒(1 時間)に設定されます。

>>> client.generate_presigned_url(

'get_object',

Params={

'Bucket': 'pythonbucket2',

'Key': 'User Interface of CLOUDIAN HyperStore(v5.2)_v1.1.pdf'

}

)

この例で生成された URL を開くと、下図のように指定したオブジェクトを取得することが

できます(ブラウザで表示可能な PDF であるため、ブラウザで開いています)。

Page 59: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.57 Copyright © 2010-2016 Cloudian KK. All rights reserved.

2. 有効期限を 2日間(7,200秒)に設定して事前署名付き URLを生成

以下の例では、generate_presigned_url()の引数に 2 日間の有効期限

(ExpiresIn=7200)を設定し、事前署名付き URL を生成しています。

Page 60: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.58 Copyright © 2010-2016 Cloudian KK. All rights reserved.

3. 有効期限を 2分(120秒)に設定して事前署名付き URLを生成

以下の例では、generate_presigned_url()の引数に非常に短時間の有効期限

(この例の場合、「ExpiresIn=120」)を設定し、事前署名付き URL を生成してその挙動

を確認しています。

有効期限 2分の事前署名付き URL を生成 >>> client.generate_presigned_url(

'get_object', Params={

'Bucket': 'pythonbucket2', 'Key': 'User Interface of CLOUDIAN HyperStore(v5.2)_v1.1.pdf' },

ExpiresIn=120 )

生成された URL に、2分以内にアクセス

事前署名付き URL が指しているオブジェクトが Web ブラウザで参照できる PDF 形

式であるため、Web ブラウザで PDF が開かれています。

Page 61: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.59 Copyright © 2010-2016 Cloudian KK. All rights reserved.

生成された URL に、2分以上経過した後にアクセス

以下のようなエラーが返されて、オブジェクトへのアクセスが拒否されます。事前署名付

き URL を生成した際に「ExpiresIn=120」を指定しているため、2 分以上経過したア

クセスは以下のように拒否されます。

AccessDeniedRequest has expired 27eff834-9ce9-1369-b7be-000c29146750sQXb7SVdUadaP05RqGIo0JilRVqbrsp3IZ7fUU7ALB4

Page 62: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.60 Copyright © 2010-2016 Cloudian KK. All rights reserved.

5. Pythonプログラムサンプル

boto3 を使用した Python プログラムのサンプルを掲載します。

AWS SDK の動作を確認する目的で掲載しているもので、サンプルプログラムには例外処理やエラーハ

ンドル処理は考慮・記載されていません。あくまでも、boto3 の動作を確認する目的でご覧ください。

(1) アップロードの進捗状況表示

以下の「MultipartUpload.py」は Linux 上にある 200MB のファイル「200mb.dat」を、

HyperStore 上のバケット「boto3」にアップロードする Python プログラムです。

このプログラムでは、HyperStore のクレデンシャル情報をコード内に直書きしています

(Session オブジェクト作成部分)。

アップロード先のバケット「boto3」が存在しなければ、アップロード前にバケットを作成します。マ

ルチパートアップロード時のオプションを変更するために、TransferConfig オブジェクトを作成して

オプション値を設定しています。

S3Transfer の upload_file()では、8MB(multipart_threshold = 8 * 1024 * 1024)以

上のファイルであればマルチパートでのアップロードを行います。マルチパートに分割されるチャンクの

サイズは、8MB(multipart_chunksize = 8388608)になるように設定されています。

upload_file()ではアップロードされるファイルの ACL を「public-read」に設定し、幾つかのメ

タデータを付与し、AES256 のサーバーサイド暗号化を有効にしています。また、upload_file()

のコールバック関数に「ProgressPercentage(upfile)」を設定しており、同じディレクトリに格納

されている「ProgressPercentage.py」の ProgressPercentage 関数を実行して、アップロー

ドの進捗状況を表示しています。

Page 63: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.61 Copyright © 2010-2016 Cloudian KK. All rights reserved.

■ 本体(MultipartUpload.py)

import os.path, boto3, botocore from boto3.s3.transfer import S3Transfer from boto3.s3.transfer import TransferConfig from boto3.session import Session from botocore.client import Config from ProgressPercentage import ProgressPercentage bucket = 'boto3' upfile = '/root/AWS_SDK/Python/200mb.dat' fname, ext = os.path.splitext(os.path.basename(upfile)) key = fname + '_mpu' + ext session = Session(aws_access_key_id='<Your Access Key>', aws_secret_access_key='<Your Secret Access Key>', region_name='<Your Region>') s3 = session.resource('s3',endpoint_url='http://s3-region1.shibuya.local') client = session.client('s3',endpoint_url='http://s3-region1.shibuya.local') try: client.head_bucket(Bucket = bucket) except botocore.exceptions.ClientError: client.create_bucket( ACL='private', Bucket=bucket, CreateBucketConfiguration={ 'LocationConstraint': 'region1' } ) # Configuration for Multipart Upload config = TransferConfig( multipart_threshold = 8 * 1024 * 1024, max_concurrency = 10, multipart_chunksize = 8388608, num_download_attempts = 10, max_io_queue = 100 ) # transfer = S3Transfer(client) transfer = S3Transfer(client, config) transfer.upload_file(upfile, bucket, key, extra_args={'ACL': 'public-read', 'Metadata': {'Purpose': 'Upload test', 'Engineer': 'Ryosuke Matsui', 'Company': 'Cloudian K.K.'}, 'ServerSideEncryption': 'AES256' }, callback=ProgressPercentage(upfile) )

Page 64: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.62 Copyright © 2010-2016 Cloudian KK. All rights reserved.

■コールバック関数(ProgressPercentage.py)

この「MultipartUpload.py」を、

# python MultipartUpload.py

のように実行すると、以下のような出力が画面に表示されます。

: : :

/root/AWS_SDK/Python/200mb.dat 199787008 / 200000000.0 (99.89%) /root/AWS_SDK/Python/200mb.dat 199795200 / 200000000.0 (99.90%) /root/AWS_SDK/Python/200mb.dat 199803392 / 200000000.0 (99.90%) /root/AWS_SDK/Python/200mb.dat 199811584 / 200000000.0 (99.91%) /root/AWS_SDK/Python/200mb.dat 199819776 / 200000000.0 (99.91%) /root/AWS_SDK/Python/200mb.dat 199827968 / 200000000.0 (99.91%) /root/AWS_SDK/Python/200mb.dat 199836160 / 200000000.0 (99.92%) /root/AWS_SDK/Python/200mb.dat 199844352 / 200000000.0 (99.92%) /root/AWS_SDK/Python/200mb.dat 199852544 / 200000000.0 (99.93%) /root/AWS_SDK/Python/200mb.dat 199860736 / 200000000.0 (99.93%) /root/AWS_SDK/Python/200mb.dat 199868928 / 200000000.0 (99.93%) /root/AWS_SDK/Python/200mb.dat 199877120 / 200000000.0 (99.94%) /root/AWS_SDK/Python/200mb.dat 199885312 / 200000000.0 (99.94%) /root/AWS_SDK/Python/200mb.dat 199893504 / 200000000.0 (99.95%) /root/AWS_SDK/Python/200mb.dat 199901696 / 200000000.0 (99.95%) /root/AWS_SDK/Python/200mb.dat 199909888 / 200000000.0 (99.95%) /root/AWS_SDK/Python/200mb.dat 199918080 / 200000000.0 (99.96%) /root/AWS_SDK/Python/200mb.dat 199926272 / 200000000.0 (99.96%) /root/AWS_SDK/Python/200mb.dat 199934464 / 200000000.0 (99.97%) /root/AWS_SDK/Python/200mb.dat 199942656 / 200000000.0 (99.97%) /root/AWS_SDK/Python/200mb.dat 199950848 / 200000000.0 (99.98%) /root/AWS_SDK/Python/200mb.dat 199959040 / 200000000.0 (99.98%) /root/AWS_SDK/Python/200mb.dat 199967232 / 200000000.0 (99.98%) /root/AWS_SDK/Python/200mb.dat 199975424 / 200000000.0 (99.99%) /root/AWS_SDK/Python/200mb.dat 199983616 / 200000000.0 (99.99%) /root/AWS_SDK/Python/200mb.dat 199991808 / 200000000.0 (100.00%) /root/AWS_SDK/Python/200mb.dat 200000000 / 200000000.0 (100.00%) /root/AWS_SDK/Python/200mb.dat 200000000 / 200000000.0 (100.00%) [root@workshop Python]#

import os.path import threading import sys class ProgressPercentage(object): def __init__(self, filename): self._filename = filename self._size = float(os.path.getsize(filename)) self._seen_so_far = 0 self._lock = threading.Lock() def __call__(self, bytes_amount): # To simplify we'll assume this is hooked up # to a single filename. with self._lock: self._seen_so_far += bytes_amount percentage = (self._seen_so_far / self._size) * 100 sys.stdout.write("%s %s / %s (%.2f%%)¥n" % (self._filename, self._seen_so_far,self._size, percentage)) sys.stdout.flush()

Page 65: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.63 Copyright © 2010-2016 Cloudian KK. All rights reserved.

CMC 上では、マルチパートアップロード中のファイルが存在する場合には、下図のように「マルチ

パートアップロード実行中」が表示されます。

マルチパートアップロードによるアップロードが完了すると、アップロード時に AES256 のサーバー

サイド暗号化を有効にしたので、ファイル名の先頭に「 」が表示されます。

Page 66: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.64 Copyright © 2010-2016 Cloudian KK. All rights reserved.

(2) マルチスレッドによるファイルのアップロード

以下の「MultithreadsUpload.py」は Linux 上の指定したディレクトリ(このサンプルでは

「/var/log」)にある全てのファイルを、HyperStore 上のバケット「logs」の中の実行日のフォルダ

(YYYY-MM-DD)にアップロードする Python プログラムです。

アップロードするファイル毎にスレッドを作成して、マルチスレッドで HyperStore にファイルをアッ

プロードします。アップロード時にファイルに対して、ACL に「private」を設定し、メタデータとしてアッ

プロードした日付を付与し、AES256 のサーバーサイド暗号化を有効にしています。

■ 本体(MultithreadsUpload.py)

import os, glob, threading from datetime import datetime import boto3, botocore from boto3.s3.transfer import S3Transfer def multithreads_upload(upfile): print("Thread %s is uploading file: %s" % (threading.current_thread(), upfile)) transfer.upload_file(upfile, bucket, today + '/' + os.path.basename(upfile), extra_args={'ACL': 'private', 'Metadata': {'Stored': today}, 'ServerSideEncryption': 'AES256' } ) print("Thread %s done uploading file: %s" % (threading.current_thread(), upfile)) if __name__ == "__main__": dir = '/var/log/' bucket = 'logs' region = 'region1' today = datetime.now().strftime('%Y-%m-%d') client = boto3.client('s3',endpoint_url='http://s3-region1.shibuya.local') transfer = S3Transfer(client) try: client.head_bucket(Bucket = bucket) except botocore.exceptions.ClientError: client.create_bucket( ACL='private', Bucket=bucket ) upfiles = [dir + file for file in os.listdir(dir) if os.path.isfile(dir + file)] threads = [] for upfile in upfiles: t = threading.Thread(target=multithreads_upload, args=(upfile,)) t.start() threads.append(t) for t in threads: t.join()

Page 67: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.65 Copyright © 2010-2016 Cloudian KK. All rights reserved.

この「MultithreadsUpload.py」を、

# python MultithreadsUpload.py

のように実行すると、以下のような出力が画面に表示されます。

Thread <Thread(Thread-1, started 139953785276160)> is uploading file: /var/log/tallylog Thread <Thread(Thread-2, started 139953776883456)> is uploading file: /var/log/lastlog Thread <Thread(Thread-3, started 139953768490752)> is uploading file: /var/log/wtmp Thread <Thread(Thread-4, started 139953760098048)> is uploading file: /var/log/vmware-install.log Thread <Thread(Thread-1, started 139953785276160)> done uploading file: /var/log/tallylog Thread <Thread(Thread-5, started 139953751705344)> is uploading file: /var/log/vmware-vmsvc.log Thread <Thread(Thread-6, started 139953785276160)> is uploading file: /var/log/grubby Thread <Thread(Thread-7, started 139953743312640)> is uploading file: /var/log/dmesg.old Thread <Thread(Thread-8, started 139953734919936)> is uploading file: /var/log/secure-20160209 Thread <Thread(Thread-9, started 139953254168320)> is uploading file: /var/log/spooler-20160209 Thread <Thread(Thread-10, started 139953245775616)> is uploading file: /var/log/btmp-20160209 Thread <Thread(Thread-11, started 139953237382912)> is uploading file: /var/log/btmp Thread <Thread(Thread-12, started 139953228990208)> is uploading file: /var/log/boot.log Thread <Thread(Thread-13, started 139953220597504)> is uploading file: /var/log/dmesg Thread <Thread(Thread-14, started 139953212204800)> is uploading file: /var/log/cron-20151130 Thread <Thread(Thread-15, started 139953203812096)> is uploading file: /var/log/maillog-20151130 Thread <Thread(Thread-16, started 139953119950592)> is uploading file: /var/log/messages-20151130 Thread <Thread(Thread-17, started 139953111557888)> is uploading file: /var/log/secure-20151130 Thread <Thread(Thread-3, started 139953768490752)> done uploading file: /var/log/wtmp Thread <Thread(Thread-18, started 139953103165184)> is uploading file: /var/log/spooler-20151130 Thread <Thread(Thread-4, started 139953760098048)> done uploading file: /var/log/vmware-install.log Thread <Thread(Thread-10, started 139953245775616)> done uploading file: /var/log/btmp-20160209 Thread <Thread(Thread-19, started 139953768490752)> is uploading file: /var/log/cron-20160106 Thread <Thread(Thread-20, started 139953245775616)> is uploading file: /var/log/maillog-20160106 Thread <Thread(Thread-21, started 139953760098048)> is uploading file: /var/log/messages-20160106 Thread <Thread(Thread-22, started 139953094772480)> is uploading file: /var/log/secure-20160106 Thread <Thread(Thread-23, started 139953086379776)> is uploading file: /var/log/spooler-20160106 Thread <Thread(Thread-24, started 139953077987072)> is uploading file: /var/log/yum.log-20160106 Thread <Thread(Thread-9, started 139953254168320)> done uploading file: /var/log/spooler-20160209 Thread <Thread(Thread-25, started 139953069594368)> is uploading file: /var/log/yum.log Thread <Thread(Thread-26, started 139953254168320)> is uploading file: /var/log/cron-20160113 Thread <Thread(Thread-27, started 139953061201664)> is uploading file: /var/log/maillog-20160113 Thread <Thread(Thread-8, started 139953734919936)> done uploading file: /var/log/secure-20160209 Thread <Thread(Thread-11, started 139953237382912)> done uploading file: /var/log/btmp Thread <Thread(Thread-6, started 139953785276160)> done uploading file: /var/log/grubby Thread <Thread(Thread-28, started 139953052808960)> is uploading file: /var/log/messages-20160113 Thread <Thread(Thread-29, started 139953785276160)> is uploading file: /var/log/secure-20160113 Thread <Thread(Thread-30, started 139953237382912)> is uploading file: /var/log/spooler-20160113 Thread <Thread(Thread-31, started 139953734919936)> is uploading file: /var/log/cron-20160209 Thread <Thread(Thread-32, started 139953044416256)> is uploading file: /var/log/cron Thread <Thread(Thread-33, started 139953036023552)> is uploading file: /var/log/maillog-20160209 Thread <Thread(Thread-7, started 139953743312640)> done uploading file: /var/log/dmesg.old Thread <Thread(Thread-18, started 139953103165184)> done uploading file: /var/log/spooler-20151130 Thread <Thread(Thread-2, started 139953776883456)> done uploading file: /var/log/lastlog Thread <Thread(Thread-13, started 139953220597504)> done uploading file: /var/log/dmesg Thread <Thread(Thread-12, started 139953228990208)> done uploading file: /var/log/boot.log Thread <Thread(Thread-22, started 139953094772480)> done uploading file: /var/log/secure-20160106 Thread <Thread(Thread-20, started 139953245775616)> done uploading file: /var/log/maillog-20160106 Thread <Thread(Thread-17, started 139953111557888)> done uploading file: /var/log/secure-20151130 Thread <Thread(Thread-15, started 139953203812096)> done uploading file: /var/log/maillog-20151130 Thread <Thread(Thread-19, started 139953768490752)> done uploading file: /var/log/cron-20160106 Thread <Thread(Thread-23, started 139953086379776)> done uploading file: /var/log/spooler-20160106 Thread <Thread(Thread-24, started 139953077987072)> done uploading file: /var/log/yum.log-20160106 Thread <Thread(Thread-14, started 139953212204800)> done uploading file: /var/log/cron-20151130 Thread <Thread(Thread-34, started 139953027630848)> is uploading file: /var/log/maillog Thread <Thread(Thread-30, started 139953237382912)> done uploading file: /var/log/spooler-20160113 Thread <Thread(Thread-25, started 139953069594368)> done uploading file: /var/log/yum.log Thread <Thread(Thread-5, started 139953751705344)> done uploading file: /var/log/vmware-vmsvc.log Thread <Thread(Thread-27, started 139953061201664)> done uploading file: /var/log/maillog-20160113 Thread <Thread(Thread-26, started 139953254168320)> done uploading file: /var/log/cron-20160113 Thread <Thread(Thread-35, started 139953061201664)> is uploading file: /var/log/messages-20160209 Thread <Thread(Thread-36, started 139953254168320)> is uploading file: /var/log/messages Thread <Thread(Thread-29, started 139953785276160)> done uploading file: /var/log/secure-20160113 Thread <Thread(Thread-31, started 139953734919936)> done uploading file: /var/log/cron-20160209 Thread <Thread(Thread-32, started 139953044416256)> done uploading file: /var/log/cron

Page 68: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.66 Copyright © 2010-2016 Cloudian KK. All rights reserved.

Thread <Thread(Thread-33, started 139953036023552)> done uploading file: /var/log/maillog-20160209 Thread <Thread(Thread-34, started 139953027630848)> done uploading file: /var/log/maillog Thread <Thread(Thread-37, started 139953751705344)> is uploading file: /var/log/secure Thread <Thread(Thread-38, started 139953027630848)> is uploading file: /var/log/spooler Thread <Thread(Thread-38, started 139953027630848)> done uploading file: /var/log/spooler Thread <Thread(Thread-21, started 139953760098048)> done uploading file: /var/log/messages-20160106 Thread <Thread(Thread-37, started 139953751705344)> done uploading file: /var/log/secure Thread <Thread(Thread-28, started 139953052808960)> done uploading file: /var/log/messages-20160113 Thread <Thread(Thread-16, started 139953119950592)> done uploading file: /var/log/messages-20151130 Thread <Thread(Thread-36, started 139953254168320)> done uploading file: /var/log/messages Thread <Thread(Thread-35, started 139953061201664)> done uploading file: /var/log/messages-20160209 [root@workshop Python]#

上記出力を確認してみると、アップロードするファイルサイズにより各スレッドの開始と終了に差が

あることが分かります。このサンプルでは各スレッドの終了を threading.join()を使って、全てのフ

ァイルのアップロードが終了するのを待機します。

下図はこのサンプルプログラムによりアップロードされたファイルを、CMC から確認した画面です。

Page 69: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

P.67 Copyright © 2010-2016 Cloudian KK. All rights reserved.

6. おわりに

本書では AWS SDK for Python(boto3)の使用方法を説明し、boto3 の関数を呼び出すサン

プルプログラムを掲載し、boto3 を使って具体的にどのように S3 API を使用するかを見て頂きました。

AWS SDK には Python 以外にも、Java や PHP、.NET 等の様々な言語に対応したものが用意さ

れています。

本書の解説で、AWS SDK を HyperStore で使用しプログラミングすることに興味をお持ち頂けたな

ら幸いです。S3 API を使用したプログラミングを活用することにより、DevOps や Infrastructure as

Code を実現し、業務システムのプログラムから直接、HyperStore にデータをアップロード/ダウンロード

して頂くことも可能になります。

本書掲載のサンプルコードは AWS SDK for Python を解説するための非常にシンプルなもので、解

説に必要な最低限の機能しか実装しておらず、またエラーハンドルもかなり省いていますので、現場でご使

用の場合は本書サンプルプログラムを参考にして頂き、より良いプログラムを作成してください。

著者 松井 良祐

役職 テクニカル プリセールス マネージャー

メールアドレス [email protected]

以上

Page 70: AWS SDK for Python and CLOUDIAN HyperStore

Technical Tips on

CLOUDIAN HyperStore #3

ホームページ:http://cloudian.jp/

Facebook:https://www.facebook.com/cloudian.cloudstorage.S3

Twitter:https://twitter.com/Cloudian_KK

ブログ:http://www.cloudian-blog.com/

評価版お申込み:http://www.cloudian.jp/cloud-storage-products/cloudian_eval_agr.php

クラウディアン株式会社

THANK YOU ! www.cloudian.jp

Cloud Storage for Everyone