PythonでAmazon S3の操作を行う方法(操作編)をご紹介します。
以下の記事の続きです。
条件
- Amazon S3
- Python 3.7.0
バケットの操作
サンプルソース
以下の処理を行うサンプルです。
- バケット一覧の取得
- バケット作成
- バケット削除
# s3bucket.py from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler import boto3 from botocore.exceptions import ClientError ## ログ出力設定 logger = getLogger("S3操作") logger.setLevel(DEBUG) # コンソール出力設定 stream_handler = StreamHandler() formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # 接続パラメータ ACCESS_KEY_ID='AKIAIO5FODNN7EXAMPLE' SECRET_ACCESS_KEY='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE' REGION_NAME='ap-northeast-1' # アジアパシフィック(東京) def delete_bucket(s3_client, bucket_name): """ バケットを削除 """ try: s3_client.delete_bucket(Bucket=bucket_name) logger.info('バケット「%s」を削除しました。' % bucket_name) except ClientError as e: logger.error(e) logger.warning('バケット「%s」の削除に失敗しました。' % bucket_name) return False return True def create_bucket(s3_client, bucket_name): """ バケットを作成 """ try: location = {'LocationConstraint': REGION_NAME} s3_client.create_bucket(Bucket=bucket_name, CreateBucketConfiguration=location) logger.info('バケット「%s」を作成しました。' % bucket_name) except ClientError as e: logger.error(e) logger.warning('バケット「%s」の作成に失敗しました。' % bucket_name) return False return True def get_bucket_list(s3_client): """ バケット一覧を取得 """ try: response = s3_client.list_buckets() logger.info('バケット一覧:') for bucket in response['Buckets']: logger.info(f' {bucket["Name"]}') except ClientError as e: logger.error(e) logger.warning('バケット一覧取得エラーです。') def get_client(): """ S3のclient取得 """ s3_client = boto3.client( 's3', region_name=REGION_NAME, aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=SECRET_ACCESS_KEY, ) return s3_client def main(): """ 実処理(main) """ s3_client = get_client() # client取得 get_bucket_list(s3_client) # バケット一覧を取得 create_bucket(s3_client, '1sample2') # バケットを作成 get_bucket_list(s3_client) # バケット一覧を取得 delete_bucket(s3_client, '1sample2') # バケットを削除 get_bucket_list(s3_client) # バケット一覧を取得 if __name__ == '__main__': """ main関数を実行 """ main()
実行結果
以下のことがわかります。
- バケット「1sample2」を作成後、バケット一覧に当該バケット名が表示される。
- バケット「1sample2」を削除後、バケット一覧から当該バケット名が表示されなくなる。
C:\test>python s3bucket.py 2019-09-11 11:55:22,489 - S3操作 - INFO - バケット一覧: 2019-09-11 11:55:22,490 - S3操作 - INFO - 1sample1 2019-09-11 11:55:23,733 - S3操作 - INFO - バケット「1sample2」を作成しました。 2019-09-11 11:55:23,782 - S3操作 - INFO - バケット一覧: 2019-09-11 11:55:23,782 - S3操作 - INFO - 1sample1 2019-09-11 11:55:23,783 - S3操作 - INFO - 1sample2 2019-09-11 11:55:24,171 - S3操作 - INFO - バケット「1sample2」を削除しました。 2019-09-11 11:55:24,220 - S3操作 - INFO - バケット一覧: 2019-09-11 11:55:24,220 - S3操作 - INFO - 1sample1 C:\test>
オブジェクトの操作
サンプルソース
以下の処理を行うサンプルです。
- オブジェクト一覧の取得
- オブジェクトのアップロード
- オブジェクトのダウンロード
- オブジェクトの削除
# s3object.py from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler import boto3 from botocore.exceptions import ClientError ## ログ出力設定 logger = getLogger("S3操作") logger.setLevel(DEBUG) # コンソール出力設定 stream_handler = StreamHandler() formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # 接続パラメータ ACCESS_KEY_ID='AKIAIO5FODNN7EXAMPLE' SECRET_ACCESS_KEY='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE' REGION_NAME='ap-northeast-1' # アジアパシフィック(東京) def delete_object(s3_client, bucket_name, object_name): """ オブジェクトを削除 """ try: s3_client.delete_object(Bucket=bucket_name, Key=object_name) logger.info('オブジェクト「%s」を削除しました。' + bucket_name) except ClientError as e: logger.error(e) logger.warning('オブジェクト「%s」の削除に失敗しました。' % bucket_name) return False return True def download_object(s3_client, bucket_name, object_name): """ オブジェクトをダウンロード """ try: s3_client.download_file(Bucket=bucket_name, Key=object_name, Filename='./download.jpg') # 実行ディレクトリに「download.jpg」としてダウンロード logger.info('オブジェクト「%s」をダウンロードしました。' % object_name) except ClientError as e: logger.error(e) logger.warning('オブジェクト「%s」のダウンロードに失敗しました。' % object_name) return False return True def put_object(s3_client, bucket_name, object_name): """ オブジェクトをバケットに追加 """ try: with open(object_name, 'rb') as image: s3_client.put_object(Bucket=bucket_name, Body=image, Key=object_name) logger.info('オブジェクト「%s」をバケット「%s」に追加しました。' % (object_name, bucket_name)) except ClientError as e: logger.error(e) logger.warning('オブジェクト「%s」をバケット「%s」に追加する処理に失敗しました。' % (object_name, bucket_name)) return False return True def get_object_list(s3_client, bucket_name): """ オブジェクト一覧を取得 """ try: response = s3_client.list_objects_v2(Bucket=bucket_name) logger.info('オブジェクト一覧:') #logger.info(response) if response["KeyCount"] > 0: for object in response["Contents"]: logger.info(f' {object["Key"]}') else: logger.info('オブジェクトが存在しません。') except ClientError as e: logger.error(e) logger.warning('オブジェクト一覧取得エラーです。') def get_client(): """ S3のclient取得 """ s3_client = boto3.client( 's3', region_name=REGION_NAME, aws_access_key_id=ACCESS_KEY_ID, aws_secret_access_key=SECRET_ACCESS_KEY, ) return s3_client def main(): """ 実処理(main) """ s3_client = get_client() # client取得 get_object_list(s3_client, '1sample1') # オブジェクト一覧を取得 put_object(s3_client, '1sample1', '2.jpg') # オブジェクトをバケットに追加 get_object_list(s3_client, '1sample1') # オブジェクト一覧を取得 download_object(s3_client, '1sample1', '2.jpg') # オブジェクトをダウンロード delete_object(s3_client, '1sample1', '2.jpg') # オブジェクトを削除 get_object_list(s3_client, '1sample1') # オブジェクト一覧を取得 if __name__ == '__main__': """ main関数を実行 """ main()
実行結果
以下のことがわかります。
- オブジェクト「2.jpg」をアップロード後、オブジェクト一覧に当該オブジェクト名が表示される。
- オブジェクト「2.jpg」を削除後、オブジェクト一覧から当該オブジェクト名が表示されなくなる。
C:\test>python s3object.py 2019-09-11 11:56:49,110 - S3操作 - INFO - オブジェクト一覧: 2019-09-11 11:56:49,110 - S3操作 - INFO - オブジェクトが存在しません。 2019-09-11 11:56:49,427 - S3操作 - INFO - オブジェクト「2.jpg」をバケット「1sample1」に追加しました。 2019-09-11 11:56:49,480 - S3操作 - INFO - オブジェクト一覧: 2019-09-11 11:56:49,481 - S3操作 - INFO - 2.jpg 2019-09-11 11:56:49,695 - S3操作 - INFO - オブジェクト「2.jpg」をダウンロードしました。 2019-09-11 11:56:49,735 - S3操作 - INFO - オブジェクト「%s」を削除しました。1sample1 2019-09-11 11:56:49,779 - S3操作 - INFO - オブジェクト一覧: 2019-09-11 11:56:49,779 - S3操作 - INFO - オブジェクトが存在しません。 C:\test>
参考
その他、様々な操作は以下のAPIドキュメントをご参照ください。
Boto 3 Docs:Client
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#client