PythonでS3に画像をアップロードしてみた

2024/08/15

Python
AWS
S3

PythonでS3に画像をアップロードしてみたので手順をまとめました。

S3とは

AWS S3(Amazon Simple Storage Service)は、Amazon Web Services(AWS)が提供するスケーラブルなオブジェクトストレージサービスです。
ファイルやデータを「オブジェクト」として保存します。各オブジェクトはファイルデータに加え、メタデータ(例えば、ファイルの作成日時やユーザー定義のタグ)を持つことができます。
オブジェクトは「バケット」と呼ばれるコンテナに保存されます。バケットは一意の名前を持ち、S3内でオブジェクトを整理するための最上位の階層です。

S3に画像をアップロードする

import requests
import boto3

# --------------------------------------------------
# S3クラス
# --------------------------------------------------
class S3:
    def __init__(self) -> None:
        self.s3 = boto3.client(
            's3',
            aws_access_key_id='aws-access-key-id',
            aws_secret_access_key='aws-secret-access-key',
            region_name='region-name'
        )

    def upload_image(self, bucket_name: str, image_name: str, image_url: str) -> dict:
        """
        S3に画像をアップロードする関数
        """
        bucket = bucket_name
        key = image_name

        try:
            response = requests.get(image_url, stream=True)
            response.raise_for_status()
        except requests.exceptions.RequestException as e:
            return {
                'statusCode': 400,
                'body': f'Failed to fetch image from URL: {e}'
            }

        body = response.content
        contenttype=response.headers.get('Content-Type', 'image/png')

        try:
            self.s3.put_object(Bucket=bucket, Key=key, Body=body, ContentType=contenttype)
            return {
                'statusCode': 200,
                'body': 'Image uploaded successfully.',
            }
        except Exception as e:
            return {
                'statusCode': 500,
                'body': f'Failed to upload image: {e}'
            }

# --------------------------------------------------
# メイン関数
# --------------------------------------------------
def main(): 
    bucket_name = 'your-bucket-name'
    image_name = 'your-image-name.png'
    image_url = 'https://example.com/path-to-image.png'

    instance = S3()
    result = instance.upload_image(bucket_name, image_name, image_url)
    print(result)

if __name__ == "__main__":
    main()

今回はここまでです。