python3.4を使っていて、s3のファイルをゴニョゴニョする機会が最近多い。
s3からデータ取ってくる方法。s3にデータアップロードする方法。
簡単だけどよく忘れるよね。boto3のclientかresourceかで頻繁に迷ってしまいます。
書き溜めとしてs3から取ってくる周りのゴニョゴニョを残しておきます。
boto3.client と boto3.resourceでS3のファイルをダウンロードする
boto3を使用してS3から指定したファイルをダウンロードします。
boto3.clientとboto3.resourceの両方を使用します。
基本コード
ダウンロード部分はresourceで
ファイル存在チェックではclientを使う感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import boto3 import botocore bucket_name = "omohikane_bucket" s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') def download_file(file_from, save_to): try: s3_resource.Bucket(bucket_name).download_file(file_from, save_to) except botocore.exceptions.ClientError as e: print("[Error] something wrong with download: {}".format(e.response['Error'])) raise return { "status": True, "msg": "saved to {}".format(save_to)} |
でもこれだと
ファイルが存在しないものを引数で渡しちゃうとエラー起こす。
エラーハンドリング
先にファイルの存在チェックをしとこう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def file_exists(filename): try: result = s3_client.list_objects(Bucket=bucket_name, Prefix=filename )["Contents"] if len(result) > 0: True else: False except botocore.exceptions.ClientError as e: if e.response['Error']['Code'] == "404": print(e.response) False else: raise except KeyError as e: return False else: return True |
完成形
くっつけてこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import boto3 import botocore s3_client = boto3.client('s3') s3_resource = boto3.resource('s3') bucket_name = "omohikane_bucket" def file_exists(filename): try: result = s3_client.list_objects(Bucket=bucket_name, Prefix=filename )["Contents"] if len(result) > 0: True else: False except botocore.exceptions.ClientError as e: if e.response['Error']['Code'] == "404": print(e.response) False else: raise except KeyError as e: return False else: return True def download_file(file_from, save_to): if file_exists(file_from): try: s3_resource.Bucket(bucket_name).download_file(file_from, save_to) except botocore.exceptions.ClientError as e: print("[Error] something wrong with download: {} ".format(e.response['Error'])) raise return { "status": True, "msg": "saved to {}".format(save_to)} else: return { "status": False, "msg": "file: {} is not exist".format(file_from)} |
S3からファイルを取ってくる部分はこれでオッケー。
ファイル内のデータ一覧を取得するとかもあるけどまた今度で(s3_client.list_objectsだけど)
シェルスクリプトでファイルを取得したい人は過去記事をどうぞ
じゃあね〜〜〜〜。