Python(boto)でAmazon S3にあるデータをGoogle Cloud Storageへコピーする

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

Amazon S3(以下S3)にあるデータをRedShiftに入れるときなどは、同じAWSということもあり簡単に行えますが、BigQueryで同様のことをするとなるとやはりGoogle Cloud Storage(以下GCS)を経由するのが便利です。GCSはS3と互換性を持たせることが可能なので、それを利用してS3からGCSへの移行、またはその逆を行うことができます。

この記事はPythonとbotoを使ってそれを実現する方法について書いています。

考慮すべき代替案

コマンドライン上でコピーを実行するといった用途の場合は以下のより優れた方法を採用できます。

gsutil

通常、最も簡単にS3・GCS間でデータをコピーできるのはgsutilコマンドを利用する方法です。
https://cloud.google.com/storage/docs/gsutil

$ gsutil cp s3://bucket/file gs://bucket/file

準備

互換運用アクセス

GCS管理コンソールからGCSを互換運用アクセスを有効にしておきます。
(参考にした記事:Google Cloud Storage に AWS CLI や AWS SDK for PHP でアップロード

必要な情報

S3・GCSについてそれぞれ次の情報が必要なので事前に取得しておきます。当然ですが書き込む側にはwrite権限が必要です。

  • bucket名
  • Accsess key ID
  • Secret accsess key ID

boto

botoを使うためインストールしておきます。

$ pip install boto

実装例

botoでは、ありがたいことにS3とGCSの両方に対して読み書きできます(GCS関連クラスはS3関連クラスを継承して実装されている)。それを利用してPython上で読み込み・書き込みを行います。

bucket操作の準備

bucket2bucket.py
from boto.gs.connection import GSConnection
from boto.s3.connection import S3Connection


gs_bucket = GSConnection(
    'GS_ACCSESS_KEY', 'GS_SECRET_ACCSESS_KEY').get_bucket('GS_BUCKET_NAME')

s3_bucket = S3Connection(
    'S3_ACCSESS_KEY', 'S3_SECRET_ACCSESS_KEY').get_bucket('S3_BUCKET_NAME')

ファイルやStringIOなどを使っての読み込み・書き込み

bucket2bucket.py
from StringIO import StringIO


def bucket2bucket(from_bucket, to_bucket, file_name):
    io = StringIO()
    try:
        from_bucket.get_key(file_name).get_file(io)
        io.seek(0)
        key = to_bucket.new_key(key_name=file_name)
        key.set_contents_from_file(io, replace=True)  # replaceは上書きの許可
    finally:
        io.close()

get_fileset_contents_from_fileなどは他にも引数を指定できるのでドキュメントの確認をお勧めします。

実行例

bucket2bucket.py
bucket2bucket(s3_bucket, gs_bucket, 'spam')
bucket2bucket(gs_bucket, s3_bucket, 'egg')

このように、botoではS3とGCSを同じように扱うことができるので、お互いのデータのやり取りが簡単に出来ます。なお、同一bucket内でコピーを行うのはBucket.copy_keyが用意されているのでそちらの利用を推奨します。