IBM Cloud Object Storage(ICOS)にファイルをアップロードする方法です。
今回はICOSに付属しているAsperaに対して、Python版のSDKを用いて操作を行います。
使用した環境
- macOS Mojave 10.14.6、Python2.7.10
- Windows7 Ultimate、Python2.7.16
3系でも良いのですが、現状SDKが3.6までしかサポートしていないので2系でチェックしました。
Python版SDKのセットアップ
こちらを参考にセットアップ下さい。
GitHub:IBM-Cloud/data-lake/upload/cos-upload
pipのセットアップの後に、install.shを実行しますが、
Windows版については、私はファイルの中身を直接コピーして、コマンドを実行しました。
pip install --upgrade pip
pip install --upgrade setuptools
pip install "requests>=2.22.0,<2.23.0" "ibm-cos-sdk>=2.5.4" "cos-aspera>=0.1.163682"
ICOSの情報確認
IBM Cloud コンソール(Web)にログインしてICOSのサービス資格情報を確認します。
サービス資格情報はICOSに作成したバケットの資格情報の中にあります。
実行
コマンド例は以下の通りです。
cos-upload.py <endpoint> <apikey> <bucket_name> <prefix> <file>
Macでの実行
$ python cos-upload.py s3.jp-tok.cloud-object-storage.appdomain.cloud "api-key" test-bucket "" test-upload-python-mac.txt
Initialize COS and Aspera Transfer Manager using endpoint: https://s3.jp-tok.cloud-object-storage.appdomain.cloud
Upload file to COS: /tmp/test-upload-python-mac.txt => test-upload-python-mac.txt
Upload file to COS completed.
Windowsでの実行
C:\tmp>py -2 D:\Workspace\cos-upload.py s3.jp-tok.cloud-object-storage.appdomain.cloud "api-key" test-bucket "" test-upload-python-win.txt
Initialize COS and Aspera Transfer Manager using endpoint: https://s3.jp-tok.cloud-object-storage.appdomain.cloud
Upload file to COS: C:\tmp\test-upload-python-win.txt => test-upload-python-win.txt
Upload file to COS completed.
到着確認
正常にアップロードされたことをibmcloudコマンドにて確認します。
// 正常にアップロードされたことを確認
$ ibmcloud cos list-objects --bucket test-bucket
OK
見つかりました 3 バケットにオブジェクトがあります 'test-bucket':
名前 最終変更日時 オブジェクト・サイズ
test.txt Feb 28, 2020 at 02:27:12 14 B
test-upload-python-mac.txt Mar 05, 2020 at 20:05:11 20 B
test-upload-python-win.txt Mar 05, 2020 at 21:21:50 20 B
あとがき
Python版のポイントは"実行環境の構築"と"実行時のパラメータ指定の概念理解"かと思います。
私はしばらくRequireに気が付かずに3.7系で実行していましたので、なかなかinstall.shがうまくいかずに困っていましたが、2.7系で実施したらものの見事に解決したので、時間をロスした!と感じました。
また、PythonをWindowsで動かすこともあまり無いかと思いますが、せっかくなのでチャレンジしてみたところ、うまくいったのでついでに載せた次第です。
実行時のパラメータの <prefix>
と <file>
は曲者で、やってみると分かるのですが、当初は意図した通りにファイルがアップロードされず、少々理解に苦しみました。
例えば <file>
にフルパスを指定すると、
/tmp/upload/test.txt Mar 03, 2020 at 21:21:50 20 B
みたいにパス名も付いたファイルがアップロードされます。
ですので、送りたいファイルのディレクトリまで移動し、そこから cos-upload.py
をCallする形でやるのが小細工しなくて良いので、やり易いのではないかな?と思います。