PythonでAmazon S3の操作を行う方法(操作編)

PythonでAmazon S3の操作を行う方法(操作編)をご紹介します。

以下の記事の続きです。

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です