SlideShare a Scribd company logo
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
《 目 次 》
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
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
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 の概要を説明するための非常に簡易なものです。そのため、
サンプルコードでは最低限の機能しか実装しておらず、エラーハンドリングも不十分な状態です。実環境で使用される場合
は本書を参考にして、必要な機能やエラーハンドル処理を実装してください。
本書に掲載するサンプルコードを使用したことにより発生したデータの損失またはお客様のコンピューター・システムへの損
傷などのいかなる損害についても、クラウディアン株式会社は一切の責任を負わないものとします。
サンプルコードをそのままご使用になられる場合は、自己判断・自己責任でお願いします。
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/
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 をご活用頂くためのサ
ンプルとしてご参照頂ければ幸いです。
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 より引用)
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"
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 プログラム中に直接、クレデンシャル情報を埋め込む方法もありますが、この方法は後
述します。
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 通信)
という環境設定になっています。
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 標準モジュールです。
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')
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. クレデンシャル情報の設
定」に記載のいずれかの方法で設定済みであることを前提にしています。
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 オブジェクトを生成する。
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()
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 の具体的な使い方を紹介します。
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) --
構 文
戻り値型
戻り値
Technical Tips on
CLOUDIAN HyperStore #3
P.16
Copyright © 2010-2016 Cloudian KK. All rights reserved.
1. 加工せずに表示
以下の例では、list_buckets()を単純に呼び出して、全ての戻り値を表示しています。
>>> client.list_buckets()
list_buckets()からは非常に多くの情報が返されるため、以降の例では出力を絞り込んで
表示させます。
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)型で受け取っています。
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')
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")))
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) --
構 文
戻り値型
戻り値
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')
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'
... )
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'
... }
... )
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
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)
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)
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) -- アップロード時に指定する追加の引数。
構 文
Technical Tips on
CLOUDIAN HyperStore #3
P.28
Copyright © 2010-2016 Cloudian KK. All rights reserved.
下図は、前頁の upload_file()の使用例で HyperStore にアップロードしたファイルを CMC の
オブジェクト画面から参照したものです。
アップロードされた
ファイル
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'
... }
... )
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')」にチェッ
クが入っていることが分かります。
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'
... }
... )
補 足
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) -- コールバック関数。デフォルトは設定無し。
構 文
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 オブジェクトを使用した方法よりも若干、
コードが複雑になります。同じ操作を実行するために複数の方法があることがありますので、適材適所で
どの方法を使用するか決めてください。
補 足
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 よりも大きなファイルは、自動的にマル
チパートアップロードが実行されていることが分かります。
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)型
構 文
戻り値型
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'
}
戻り値
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) -- 表示された場合は、このリクエストの請求が正常に指定したリクエスターに
請求されたことを示す。
構 文
戻り値型
戻り値
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) -- バケット名 [必須]
無し
無し
構 文
戻り値型
戻り値
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 例外が発生します。
注 意
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) -- バケットのバージョニング状態。
無し
無し
構 文
戻り値型
戻り値
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()を実行します。
注 意
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 は未対応。
構 文
戻り値型
戻り値
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'
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'
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)型
構 文
戻り値型
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
を参照のこと。
戻り値
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()からは非常に多くの情報が返されるため、以降の例で
は出力を絞り込んで表示させます。
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"))
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')
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)型
構 文
戻り値型
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
を参照のこと。
戻り値
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'
)
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']
補 足
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”を使用するほうがお薦めです。
補 足
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
構 文
戻り値
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 であるため、ブラウザで開いています)。
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 を生成しています。
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 が開かれています。
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
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 関数を実行して、アップロー
ドの進捗状況を表示しています。
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)
)
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()
Technical Tips on
CLOUDIAN HyperStore #3
P.63
Copyright © 2010-2016 Cloudian KK. All rights reserved.
CMC 上では、マルチパートアップロード中のファイルが存在する場合には、下図のように「マルチ
パートアップロード実行中」が表示されます。
マルチパートアップロードによるアップロードが完了すると、アップロード時に AES256 のサーバー
サイド暗号化を有効にしたので、ファイル名の先頭に「 」が表示されます。
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()
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
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 から確認した画面です。
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 を解説するための非常にシンプルなもので、解
説に必要な最低限の機能しか実装しておらず、またエラーハンドルもかなり省いていますので、現場でご使
用の場合は本書サンプルプログラムを参考にして頂き、より良いプログラムを作成してください。
著者 松井 良祐
役職 テクニカル プリセールス マネージャー
メールアドレス rmatsui@cloudian.com
以上
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

More Related Content

What's hot

Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
Toru Makabe
 
Recap: PowerShell Core
Recap: PowerShell CoreRecap: PowerShell Core
Recap: PowerShell Core
Kazuki Takai
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
Kotaro Noyama
 
Azure Stack 受け入れ準備_20180630
Azure Stack 受け入れ準備_20180630Azure Stack 受け入れ準備_20180630
Azure Stack 受け入れ準備_20180630
Hiroshi Matsumoto
 
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
Toru Makabe
 
20180630 interact2018 rev1
20180630 interact2018 rev120180630 interact2018 rev1
20180630 interact2018 rev1
Takano Masaru
 
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料][G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
Trainocate Japan, Ltd.
 
G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界
G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界
G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界
Trainocate Japan, Ltd.
 
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Yuki Hattori
 
S3 API接続検証プログラムのご紹介
S3 API接続検証プログラムのご紹介S3 API接続検証プログラムのご紹介
S3 API接続検証プログラムのご紹介
CLOUDIAN KK
 
Interact2019 - Windows Admin Center 2019年6月のお話
Interact2019 - Windows Admin Center 2019年6月のお話Interact2019 - Windows Admin Center 2019年6月のお話
Interact2019 - Windows Admin Center 2019年6月のお話
Norio Sashizaki
 
Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊
Toru Makabe
 
NetApp SteelStore with CLOUDIAN HyperStore
NetApp SteelStore with CLOUDIAN HyperStoreNetApp SteelStore with CLOUDIAN HyperStore
NetApp SteelStore with CLOUDIAN HyperStore
CLOUDIAN KK
 
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編irix_jp
 
S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理
Microsoft Azure Japan
 
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
VirtualTech Japan Inc.
 
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
ShuheiUda
 
Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズSORACOM, INC
 
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Suguru Ito
 
Interact2019 ws2019 s2d_IN05
Interact2019 ws2019 s2d_IN05Interact2019 ws2019 s2d_IN05
Interact2019 ws2019 s2d_IN05
Hiroshi Matsumoto
 

What's hot (20)

Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
 
Recap: PowerShell Core
Recap: PowerShell CoreRecap: PowerShell Core
Recap: PowerShell Core
 
CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1CloudFoundry 2 on Apache CloudStack 4.2.1
CloudFoundry 2 on Apache CloudStack 4.2.1
 
Azure Stack 受け入れ準備_20180630
Azure Stack 受け入れ準備_20180630Azure Stack 受け入れ準備_20180630
Azure Stack 受け入れ準備_20180630
 
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
帰ってきた インフラ野郎 Azureチーム ~Azure データセンターテクノロジー解体新書2018春~ - de:code2018
 
20180630 interact2018 rev1
20180630 interact2018 rev120180630 interact2018 rev1
20180630 interact2018 rev1
 
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料][G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
[G-Tech2015]Microsoft Azureを使った災害復旧の基礎[講演資料]
 
G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界
G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界
G tech2016 シスコのハイパーコンバージドインフラCisco Hyper-Flexと、その先にあるIoE/BigDataインフラの世界
 
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
 
S3 API接続検証プログラムのご紹介
S3 API接続検証プログラムのご紹介S3 API接続検証プログラムのご紹介
S3 API接続検証プログラムのご紹介
 
Interact2019 - Windows Admin Center 2019年6月のお話
Interact2019 - Windows Admin Center 2019年6月のお話Interact2019 - Windows Admin Center 2019年6月のお話
Interact2019 - Windows Admin Center 2019年6月のお話
 
Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊Terraform Bootcamp - Azure Infrastructure as Code隊
Terraform Bootcamp - Azure Infrastructure as Code隊
 
NetApp SteelStore with CLOUDIAN HyperStore
NetApp SteelStore with CLOUDIAN HyperStoreNetApp SteelStore with CLOUDIAN HyperStore
NetApp SteelStore with CLOUDIAN HyperStore
 
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack 基礎操作編
 
S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理S15 コマンドラインおよび API による Microsoft Azure の管理
S15 コマンドラインおよび API による Microsoft Azure の管理
 
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
Canonicalが支える、さくっと使えるUbuntu OpenStack - OpenStack Day in ITpro EXPO 2014
 
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
 
Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズ
 
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
Azure Database for MySQL PostgreSQLを使って運用の手間を省きませんか?
 
Interact2019 ws2019 s2d_IN05
Interact2019 ws2019 s2d_IN05Interact2019 ws2019 s2d_IN05
Interact2019 ws2019 s2d_IN05
 

Viewers also liked

Texas
TexasTexas
Texas
Jim Werner
 
Final presentation pearson
Final presentation pearsonFinal presentation pearson
Final presentation pearson
nycylith
 
Importanza delle competenze digitali
Importanza delle competenze digitaliImportanza delle competenze digitali
Importanza delle competenze digitali
Paolo Coppola
 
NTT Com at Cloudian seminar 2012
NTT Com at Cloudian seminar 2012NTT Com at Cloudian seminar 2012
NTT Com at Cloudian seminar 2012
CLOUDIAN KK
 
Trollisi mumini aicina ciemos
Trollisi mumini aicina ciemosTrollisi mumini aicina ciemos
Trollisi mumini aicina ciemosValmibibl
 
รายงาน โครงงานคอมพิวเตอร์
รายงาน โครงงานคอมพิวเตอร์รายงาน โครงงานคอมพิวเตอร์
รายงาน โครงงานคอมพิวเตอร์Pim Jazz
 
Idaho
IdahoIdaho
Idaho
Jim Werner
 
Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014CLOUDIAN KK
 
珍惜緣份
珍惜緣份珍惜緣份
珍惜緣份suminch
 
Nevada
NevadaNevada
Nevada
Jim Werner
 
A Brandcalled | Fredy Utama | Update
A Brandcalled | Fredy Utama | UpdateA Brandcalled | Fredy Utama | Update
A Brandcalled | Fredy Utama | Update
fredyutama
 
Bernu žūrija
Bernu žūrijaBernu žūrija
Bernu žūrijaValmibibl
 
File server by CLOUDIAN HyperStore
File server by CLOUDIAN HyperStoreFile server by CLOUDIAN HyperStore
File server by CLOUDIAN HyperStore
CLOUDIAN KK
 
Missouri
MissouriMissouri
Missouri
Jim Werner
 
South carolina
South carolinaSouth carolina
South carolina
Jim Werner
 
Digital collaborative accounting
Digital collaborative accounting Digital collaborative accounting
Digital collaborative accounting
Nirmal Ghorawat
 
Xbrl dimension a primer nirmal ghorawat
Xbrl dimension a primer nirmal ghorawatXbrl dimension a primer nirmal ghorawat
Xbrl dimension a primer nirmal ghorawat
Nirmal Ghorawat
 
Melokalisasi dan mengisolasi daerah permasalahan
Melokalisasi dan mengisolasi daerah permasalahanMelokalisasi dan mengisolasi daerah permasalahan
Melokalisasi dan mengisolasi daerah permasalahan
Suryono Adi
 

Viewers also liked (18)

Texas
TexasTexas
Texas
 
Final presentation pearson
Final presentation pearsonFinal presentation pearson
Final presentation pearson
 
Importanza delle competenze digitali
Importanza delle competenze digitaliImportanza delle competenze digitali
Importanza delle competenze digitali
 
NTT Com at Cloudian seminar 2012
NTT Com at Cloudian seminar 2012NTT Com at Cloudian seminar 2012
NTT Com at Cloudian seminar 2012
 
Trollisi mumini aicina ciemos
Trollisi mumini aicina ciemosTrollisi mumini aicina ciemos
Trollisi mumini aicina ciemos
 
รายงาน โครงงานคอมพิวเตอร์
รายงาน โครงงานคอมพิวเตอร์รายงาน โครงงานคอมพิวเตอร์
รายงาน โครงงานคอมพิวเตอร์
 
Idaho
IdahoIdaho
Idaho
 
Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014Cloudian for cloud stack days japan 2014
Cloudian for cloud stack days japan 2014
 
珍惜緣份
珍惜緣份珍惜緣份
珍惜緣份
 
Nevada
NevadaNevada
Nevada
 
A Brandcalled | Fredy Utama | Update
A Brandcalled | Fredy Utama | UpdateA Brandcalled | Fredy Utama | Update
A Brandcalled | Fredy Utama | Update
 
Bernu žūrija
Bernu žūrijaBernu žūrija
Bernu žūrija
 
File server by CLOUDIAN HyperStore
File server by CLOUDIAN HyperStoreFile server by CLOUDIAN HyperStore
File server by CLOUDIAN HyperStore
 
Missouri
MissouriMissouri
Missouri
 
South carolina
South carolinaSouth carolina
South carolina
 
Digital collaborative accounting
Digital collaborative accounting Digital collaborative accounting
Digital collaborative accounting
 
Xbrl dimension a primer nirmal ghorawat
Xbrl dimension a primer nirmal ghorawatXbrl dimension a primer nirmal ghorawat
Xbrl dimension a primer nirmal ghorawat
 
Melokalisasi dan mengisolasi daerah permasalahan
Melokalisasi dan mengisolasi daerah permasalahanMelokalisasi dan mengisolasi daerah permasalahan
Melokalisasi dan mengisolasi daerah permasalahan
 

Similar to AWS SDK for Python and CLOUDIAN HyperStore

Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用までPacketbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Satoyuki Tsukano
 
The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)
Kimihiko Kitase
 
Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)
Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)
Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)
Takeshi Fukuhara
 
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
日本マイクロソフト株式会社
 
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメTokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tsubasa Yoshino
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
Minoru Naito
 
Microsoft Intelligent Edge Technologies
Microsoft Intelligent Edge TechnologiesMicrosoft Intelligent Edge Technologies
Microsoft Intelligent Edge Technologies
Takeshi Fukuhara
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3openrtm
 
Microsoft Intelligent Edge Technologies
Microsoft Intelligent Edge TechnologiesMicrosoft Intelligent Edge Technologies
Microsoft Intelligent Edge Technologies
Takeshi Fukuhara
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
真治 米田
 
00_O365_SecureConfigurationAlignment_JP_v1.0.pdf
00_O365_SecureConfigurationAlignment_JP_v1.0.pdf00_O365_SecureConfigurationAlignment_JP_v1.0.pdf
00_O365_SecureConfigurationAlignment_JP_v1.0.pdf
Hisaho Nakata
 
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Daiyu Hatakeyama
 
Microsoft AI Platform
Microsoft AI PlatformMicrosoft AI Platform
Microsoft AI Platform
Daiyu Hatakeyama
 
IoT World Conference 2017 - Microsoft AI Platform
IoT World Conference 2017 - Microsoft AI PlatformIoT World Conference 2017 - Microsoft AI Platform
IoT World Conference 2017 - Microsoft AI Platform
Daiyu Hatakeyama
 
Azure Data Studio
Azure Data StudioAzure Data Studio
Azure Data Studio
Microsoft
 
20140924イグレックcioセミナーpublic
20140924イグレックcioセミナーpublic20140924イグレックcioセミナーpublic
20140924イグレックcioセミナーpublic
junkoy66
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
Daiyu Hatakeyama
 
pgCafeMitaka20090723
pgCafeMitaka20090723pgCafeMitaka20090723
pgCafeMitaka20090723
Noriyuki Nonomura
 
ぐるなびが活用するElastic Cloud
ぐるなびが活用するElastic Cloudぐるなびが活用するElastic Cloud
ぐるなびが活用するElastic Cloud
Elasticsearch
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
Mr. Vengineer
 

Similar to AWS SDK for Python and CLOUDIAN HyperStore (20)

Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用までPacketbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用まで
 
The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)
 
Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)
Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)
Part 3: サーバーレスとシステム間連携基盤 (製造リファレンス・アーキテクチャ勉強会)
 
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
 
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメTokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
Tokyo Jazug Night 2020-01 Azure Monitor を使った運用監視コトハジメ
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
 
Microsoft Intelligent Edge Technologies
Microsoft Intelligent Edge TechnologiesMicrosoft Intelligent Edge Technologies
Microsoft Intelligent Edge Technologies
 
20130329 rtm3
20130329 rtm320130329 rtm3
20130329 rtm3
 
Microsoft Intelligent Edge Technologies
Microsoft Intelligent Edge TechnologiesMicrosoft Intelligent Edge Technologies
Microsoft Intelligent Edge Technologies
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
 
00_O365_SecureConfigurationAlignment_JP_v1.0.pdf
00_O365_SecureConfigurationAlignment_JP_v1.0.pdf00_O365_SecureConfigurationAlignment_JP_v1.0.pdf
00_O365_SecureConfigurationAlignment_JP_v1.0.pdf
 
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
Deep Learning Lab - Microsoft Machine Learning meetup 2018/06/27 - 推論編
 
Microsoft AI Platform
Microsoft AI PlatformMicrosoft AI Platform
Microsoft AI Platform
 
IoT World Conference 2017 - Microsoft AI Platform
IoT World Conference 2017 - Microsoft AI PlatformIoT World Conference 2017 - Microsoft AI Platform
IoT World Conference 2017 - Microsoft AI Platform
 
Azure Data Studio
Azure Data StudioAzure Data Studio
Azure Data Studio
 
20140924イグレックcioセミナーpublic
20140924イグレックcioセミナーpublic20140924イグレックcioセミナーpublic
20140924イグレックcioセミナーpublic
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
 
pgCafeMitaka20090723
pgCafeMitaka20090723pgCafeMitaka20090723
pgCafeMitaka20090723
 
ぐるなびが活用するElastic Cloud
ぐるなびが活用するElastic Cloudぐるなびが活用するElastic Cloud
ぐるなびが活用するElastic Cloud
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 

More from CLOUDIAN KK

CLOUDIAN HYPERSTORE - 風林火山ストレージ
CLOUDIAN HYPERSTORE - 風林火山ストレージCLOUDIAN HYPERSTORE - 風林火山ストレージ
CLOUDIAN HYPERSTORE - 風林火山ストレージ
CLOUDIAN KK
 
クラウディアンのご紹介
クラウディアンのご紹介クラウディアンのご紹介
クラウディアンのご紹介
CLOUDIAN KK
 
IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革
IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革
IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革
CLOUDIAN KK
 
CLOUDIAN Presentation at VERITAS VISION in Tokyo
CLOUDIAN Presentation at VERITAS VISION in TokyoCLOUDIAN Presentation at VERITAS VISION in Tokyo
CLOUDIAN Presentation at VERITAS VISION in Tokyo
CLOUDIAN KK
 
ZiDOMA data and CLOUDIAN HyperStore
ZiDOMA data and CLOUDIAN HyperStoreZiDOMA data and CLOUDIAN HyperStore
ZiDOMA data and CLOUDIAN HyperStore
CLOUDIAN KK
 
FOBAS CSC and CLOUDIAN HyperStore
FOBAS CSC and CLOUDIAN HyperStoreFOBAS CSC and CLOUDIAN HyperStore
FOBAS CSC and CLOUDIAN HyperStore
CLOUDIAN KK
 
ARCserve backup and CLOUDIAN HyperStore
ARCserve backup and CLOUDIAN HyperStoreARCserve backup and CLOUDIAN HyperStore
ARCserve backup and CLOUDIAN HyperStore
CLOUDIAN KK
 
Cloudian presentation at idc japan sv2016
Cloudian presentation at idc japan sv2016Cloudian presentation at idc japan sv2016
Cloudian presentation at idc japan sv2016
CLOUDIAN KK
 
ITコアを刷新するハイブリッドクラウド型ITシステム
ITコアを刷新するハイブリッドクラウド型ITシステムITコアを刷新するハイブリッドクラウド型ITシステム
ITコアを刷新するハイブリッドクラウド型ITシステム
CLOUDIAN KK
 
【FOBAS】Data is money. ストレージ分散投資のススメ
【FOBAS】Data is money. ストレージ分散投資のススメ【FOBAS】Data is money. ストレージ分散投資のススメ
【FOBAS】Data is money. ストレージ分散投資のススメ
CLOUDIAN KK
 
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
CLOUDIAN KK
 
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
CLOUDIAN KK
 
【CLOUDIAN】コード化されたインフラの実装
【CLOUDIAN】コード化されたインフラの実装【CLOUDIAN】コード化されたインフラの実装
【CLOUDIAN】コード化されたインフラの実装
CLOUDIAN KK
 
【CLOUDIAN】自動階層化による現有ストレージ活用術
【CLOUDIAN】自動階層化による現有ストレージ活用術【CLOUDIAN】自動階層化による現有ストレージ活用術
【CLOUDIAN】自動階層化による現有ストレージ活用術
CLOUDIAN KK
 
【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現
【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現
【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現
CLOUDIAN KK
 
【Cloudian】FIT2015における会社製品紹介
【Cloudian】FIT2015における会社製品紹介【Cloudian】FIT2015における会社製品紹介
【Cloudian】FIT2015における会社製品紹介
CLOUDIAN KK
 
CLOUDIAN at Support Engineer Night
CLOUDIAN at Support Engineer NightCLOUDIAN at Support Engineer Night
CLOUDIAN at Support Engineer Night
CLOUDIAN KK
 
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
CLOUDIAN KK
 
User interface of CLOUDIAN HyperStore
User interface of CLOUDIAN HyperStoreUser interface of CLOUDIAN HyperStore
User interface of CLOUDIAN HyperStore
CLOUDIAN KK
 
ownCloud and CLOUDIAN HyperStore
ownCloud and CLOUDIAN HyperStoreownCloud and CLOUDIAN HyperStore
ownCloud and CLOUDIAN HyperStore
CLOUDIAN KK
 

More from CLOUDIAN KK (20)

CLOUDIAN HYPERSTORE - 風林火山ストレージ
CLOUDIAN HYPERSTORE - 風林火山ストレージCLOUDIAN HYPERSTORE - 風林火山ストレージ
CLOUDIAN HYPERSTORE - 風林火山ストレージ
 
クラウディアンのご紹介
クラウディアンのご紹介クラウディアンのご紹介
クラウディアンのご紹介
 
IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革
IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革
IoT/ビッグデータ/AI連携により次世代ストレージが促進するビジネス変革
 
CLOUDIAN Presentation at VERITAS VISION in Tokyo
CLOUDIAN Presentation at VERITAS VISION in TokyoCLOUDIAN Presentation at VERITAS VISION in Tokyo
CLOUDIAN Presentation at VERITAS VISION in Tokyo
 
ZiDOMA data and CLOUDIAN HyperStore
ZiDOMA data and CLOUDIAN HyperStoreZiDOMA data and CLOUDIAN HyperStore
ZiDOMA data and CLOUDIAN HyperStore
 
FOBAS CSC and CLOUDIAN HyperStore
FOBAS CSC and CLOUDIAN HyperStoreFOBAS CSC and CLOUDIAN HyperStore
FOBAS CSC and CLOUDIAN HyperStore
 
ARCserve backup and CLOUDIAN HyperStore
ARCserve backup and CLOUDIAN HyperStoreARCserve backup and CLOUDIAN HyperStore
ARCserve backup and CLOUDIAN HyperStore
 
Cloudian presentation at idc japan sv2016
Cloudian presentation at idc japan sv2016Cloudian presentation at idc japan sv2016
Cloudian presentation at idc japan sv2016
 
ITコアを刷新するハイブリッドクラウド型ITシステム
ITコアを刷新するハイブリッドクラウド型ITシステムITコアを刷新するハイブリッドクラウド型ITシステム
ITコアを刷新するハイブリッドクラウド型ITシステム
 
【FOBAS】Data is money. ストレージ分散投資のススメ
【FOBAS】Data is money. ストレージ分散投資のススメ【FOBAS】Data is money. ストレージ分散投資のススメ
【FOBAS】Data is money. ストレージ分散投資のススメ
 
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
【ARI】ストレージのコスト・利便性・非機能要求項目を徹底比較
 
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
【SIS】オブジェクトストレージを活用した増え続ける長期保管データの運用の効率化
 
【CLOUDIAN】コード化されたインフラの実装
【CLOUDIAN】コード化されたインフラの実装【CLOUDIAN】コード化されたインフラの実装
【CLOUDIAN】コード化されたインフラの実装
 
【CLOUDIAN】自動階層化による現有ストレージ活用術
【CLOUDIAN】自動階層化による現有ストレージ活用術【CLOUDIAN】自動階層化による現有ストレージ活用術
【CLOUDIAN】自動階層化による現有ストレージ活用術
 
【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現
【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現
【CLOUDIAN】秒間隔RPO(目標復旧時点)の実現
 
【Cloudian】FIT2015における会社製品紹介
【Cloudian】FIT2015における会社製品紹介【Cloudian】FIT2015における会社製品紹介
【Cloudian】FIT2015における会社製品紹介
 
CLOUDIAN at Support Engineer Night
CLOUDIAN at Support Engineer NightCLOUDIAN at Support Engineer Night
CLOUDIAN at Support Engineer Night
 
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
ビッグデータ分析基盤が直面する課題をオブジェクトストレージで解決
 
User interface of CLOUDIAN HyperStore
User interface of CLOUDIAN HyperStoreUser interface of CLOUDIAN HyperStore
User interface of CLOUDIAN HyperStore
 
ownCloud and CLOUDIAN HyperStore
ownCloud and CLOUDIAN HyperStoreownCloud and CLOUDIAN HyperStore
ownCloud and CLOUDIAN HyperStore
 

Recently uploaded

遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 

Recently uploaded (9)

遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 

AWS SDK for Python and CLOUDIAN HyperStore

  • 1. 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
  • 2. 《 目 次 》 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
  • 3. 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
  • 4. 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 の概要を説明するための非常に簡易なものです。そのため、 サンプルコードでは最低限の機能しか実装しておらず、エラーハンドリングも不十分な状態です。実環境で使用される場合 は本書を参考にして、必要な機能やエラーハンドル処理を実装してください。 本書に掲載するサンプルコードを使用したことにより発生したデータの損失またはお客様のコンピューター・システムへの損 傷などのいかなる損害についても、クラウディアン株式会社は一切の責任を負わないものとします。 サンプルコードをそのままご使用になられる場合は、自己判断・自己責任でお願いします。
  • 5. 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/
  • 6. 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 をご活用頂くためのサ ンプルとしてご参照頂ければ幸いです。
  • 7. 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 より引用)
  • 8. 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"
  • 9. 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 プログラム中に直接、クレデンシャル情報を埋め込む方法もありますが、この方法は後 述します。
  • 10. 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 通信) という環境設定になっています。
  • 11. 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 標準モジュールです。
  • 12. 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')
  • 13. 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. クレデンシャル情報の設 定」に記載のいずれかの方法で設定済みであることを前提にしています。
  • 14. 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 オブジェクトを生成する。
  • 15. 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()
  • 16. 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 の具体的な使い方を紹介します。
  • 17. 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) -- 構 文 戻り値型 戻り値
  • 18. Technical Tips on CLOUDIAN HyperStore #3 P.16 Copyright © 2010-2016 Cloudian KK. All rights reserved. 1. 加工せずに表示 以下の例では、list_buckets()を単純に呼び出して、全ての戻り値を表示しています。 >>> client.list_buckets() list_buckets()からは非常に多くの情報が返されるため、以降の例では出力を絞り込んで 表示させます。
  • 19. 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)型で受け取っています。
  • 20. 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')
  • 21. 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")))
  • 22. 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) -- 構 文 戻り値型 戻り値
  • 23. 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')
  • 24. 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' ... )
  • 25. 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' ... } ... )
  • 26. 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
  • 27. 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)
  • 28. 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)
  • 29. 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) -- アップロード時に指定する追加の引数。 構 文
  • 30. Technical Tips on CLOUDIAN HyperStore #3 P.28 Copyright © 2010-2016 Cloudian KK. All rights reserved. 下図は、前頁の upload_file()の使用例で HyperStore にアップロードしたファイルを CMC の オブジェクト画面から参照したものです。 アップロードされた ファイル
  • 31. 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' ... } ... )
  • 32. 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')」にチェッ クが入っていることが分かります。
  • 33. 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' ... } ... ) 補 足
  • 34. 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) -- コールバック関数。デフォルトは設定無し。 構 文
  • 35. 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 オブジェクトを使用した方法よりも若干、 コードが複雑になります。同じ操作を実行するために複数の方法があることがありますので、適材適所で どの方法を使用するか決めてください。 補 足
  • 36. 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 よりも大きなファイルは、自動的にマル チパートアップロードが実行されていることが分かります。
  • 37. 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)型 構 文 戻り値型
  • 38. 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' } 戻り値
  • 39. 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) -- 表示された場合は、このリクエストの請求が正常に指定したリクエスターに 請求されたことを示す。 構 文 戻り値型 戻り値
  • 40. 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) -- バケット名 [必須] 無し 無し 構 文 戻り値型 戻り値
  • 41. 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 例外が発生します。 注 意
  • 42. 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) -- バケットのバージョニング状態。 無し 無し 構 文 戻り値型 戻り値
  • 43. 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()を実行します。 注 意
  • 44. 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 は未対応。 構 文 戻り値型 戻り値
  • 45. 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'
  • 46. 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'
  • 47. 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)型 構 文 戻り値型
  • 48. 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 を参照のこと。 戻り値
  • 49. 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()からは非常に多くの情報が返されるため、以降の例で は出力を絞り込んで表示させます。
  • 50. 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"))
  • 51. 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')
  • 52. 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)型 構 文 戻り値型
  • 53. 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 を参照のこと。 戻り値
  • 54. 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' )
  • 55. 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'] 補 足
  • 56. 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”を使用するほうがお薦めです。 補 足
  • 57. 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 構 文 戻り値
  • 58. 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 であるため、ブラウザで開いています)。
  • 59. 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 を生成しています。
  • 60. 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 が開かれています。
  • 61. 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
  • 62. 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 関数を実行して、アップロー ドの進捗状況を表示しています。
  • 63. 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) )
  • 64. 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()
  • 65. Technical Tips on CLOUDIAN HyperStore #3 P.63 Copyright © 2010-2016 Cloudian KK. All rights reserved. CMC 上では、マルチパートアップロード中のファイルが存在する場合には、下図のように「マルチ パートアップロード実行中」が表示されます。 マルチパートアップロードによるアップロードが完了すると、アップロード時に AES256 のサーバー サイド暗号化を有効にしたので、ファイル名の先頭に「 」が表示されます。
  • 66. 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()
  • 67. 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
  • 68. 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 から確認した画面です。
  • 69. 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 を解説するための非常にシンプルなもので、解 説に必要な最低限の機能しか実装しておらず、またエラーハンドルもかなり省いていますので、現場でご使 用の場合は本書サンプルプログラムを参考にして頂き、より良いプログラムを作成してください。 著者 松井 良祐 役職 テクニカル プリセールス マネージャー メールアドレス rmatsui@cloudian.com 以上
  • 70. 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