Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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が用意されているのでそちらの利用を推奨します。

itkr
おひさま
http://itkr.github.io
colorful-board
「すべての人々に、人生が変わる出会いを」をビジョンとして、これまで出会えなかった情報と瞬時に出会うことで人々の生活をより豊かにする、新しい情報発見のためのプラットフォームを目指しています。
https://sensy.ai/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした