PythonからGSUtilを使ってS3のファイルをGCSにコピーする

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Pythonを使ってs3からGoogle Cloud Storageにデータを移す際、以前下記の二つの方法を書きましたが、やはりgsutilを使うとs3から自分のサーバーを経由せずに直接Google Cloud Storageにコピーできるので便利です。

gsutilの設定ファイル

ドキュメントを参考に、GSUtilの実行時に読み込む設定ファイルを作っておきます。最低限[Credentials]や[GSUtil]は必要ですね。

[Credentials]
gs_service_key_file = /path.to/sample-KEYFILE.p12
gs_service_client_id = sample-service-account@developer.gserviceaccount.com
aws_access_key_id = AXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = sampleawssecretaccesskey1234

[Boto]
https_validate_certificates = True

[GSUtil]
content_language = ja
default_api_version = 2
default_project_id = sampleproject-994

Pythonからコマンドを実行する

コマンドの実行にはos.systemcommandssubprocessがありますがsubprocessを使うことが推奨されています。

os.systemcommandsは非推奨

os.system

subprocess モジュールが、新しいプロセスを実行して結果を取得するための、より強力な機能を提供しています。この関数の代わりに、 subprocess モジュールを利用することが推奨されています。1

commands

バージョン 2.6 で撤廃: commands モジュールは Python 3.0 で削除されました。 代わりに subprocess モジュールを使ってください。2

subprocessを使う

import os
import subprocess
import shlex

BOTO_PATH = '/path.to/boto.ini'

cmd = 'gsutil cp s3://bucket/name gs://bucket/name'

popen = subprocess.Popen(
    shlex.split(cmd),
    stdout=subprocess.PIPE,
    env={'BOTO_PATH': BOTO_PATH, 'PATH': os.getenv('PATH')})

output = popen.communicate()[0]

print output

ポイントはBOTO_PATHの指定です。通常gsutilはデフォルトではホームディレクトリの.botoという設定ファイルを見て実行しますが、BOTO_PATHBOTO_CONFIGという環境変数を指定するとそこに指定されているファイルを見に行きます。

subprocess.Popenenvという引数に環境変数を指定できるのでdictのキーに'BOTO_PATH'を指定して、値に設定ファイルのパスを入れています。envを指定する場合は必要な環境変数を全て与えなければいけないため、'PATH'も指定しています。

env を特定の値として与える場合、プログラムを実行するのに必要な変数全てを与えなければなりません。 Windows で side-by-side assembly を実行するためには、 env は正しい SystemRoot を 含まなければいけません 。3