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操作の準備
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などを使っての読み込み・書き込み
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_file
やset_contents_from_file
などは他にも引数を指定できるのでドキュメントの確認をお勧めします。
実行例
bucket2bucket(s3_bucket, gs_bucket, 'spam')
bucket2bucket(gs_bucket, s3_bucket, 'egg')
このように、botoではS3とGCSを同じように扱うことができるので、お互いのデータのやり取りが簡単に出来ます。なお、同一bucket内でコピーを行うのはBucket.copy_key
が用意されているのでそちらの利用を推奨します。