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

2024/08/15

Python
AWS
S3

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

S3とは

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

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

今回はサンプルとして、特定のWebサイトの画像ををS3にアップロードするコードを記述します。

.env
AWS_ACCESS_KEY_ID='XXXXXXXXXX'
AWS_SECRET_ACCESS_KEY='XXXXXXXXXX'
AWS_REGION_NAME='ap-northeast-1'
Upload2s3.py
import os
import requests
import boto3
from botocore.exceptions import NoCredentialsError
from dotenv import load_dotenv

# .envファイルから環境変数を読み込む
load_dotenv()

# アップロードする画像のURL
IMAGE_URL = "XXXXXXXXXX"
# アップロード先のS3バケット名
BUCKET_NAME = "tXXXXXXXXXX"
# S3バケット内での保存先ファイル名
S3_IMAGE_NAME = "XXXXXXXXXX"

def upload_to_s3(image_url: str, bucket_name: str, s3_file_name: str) -> None:
    """
    画像を指定したS3バケットにアップロードする関数

    :param image_url: ダウンロードする画像のURL
    :param bucket_name: アップロード先のS3バケット名
    :param s3_file_name: S3バケット内での保存先ファイル名
    """

    # 指定されたURLから画像をダウンロード
    image_content = download_image(image_url)

    # S3クライアントの初期化
    s3 = boto3.client('s3',
        aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),         # AWSのアクセスキーIDを環境変数から取得
        aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY'), # AWSのシークレットアクセスキーを環境変数から取得
        region_name=os.getenv('AWS_REGION_NAME')                  # AWSのリージョン名を環境変数から取得
    )

    try:
        # 画像を指定したS3バケットにアップロード
        s3.put_object(Bucket=bucket_name, Key=s3_file_name, Body=image_content)
        print(f"Image successfully uploaded to {bucket_name}/{s3_file_name}")
    except NoCredentialsError:
        # 認証情報がない場合のエラーハンドリング
        print("Credentials not available")

def download_image(url: str) -> bytes:
    """
    指定されたURLから画像をダウンロードする関数

    :param url: ダウンロードする画像のURL
    :return: 画像データ(バイナリ)
    """
    response = requests.get(url)  # URLにHTTP GETリクエストを送信
    if response.status_code == 200:  # リクエストが成功した場合
        return response.content  # 画像データを返す
    else:
        # リクエストが失敗した場合は例外を投げる
        raise Exception(f"Failed to download image from {url}")

def main():    
    # 画像をダウンロードし、指定したS3バケットにアップロードする
    upload_to_s3(IMAGE_URL, BUCKET_NAME, S3_IMAGE_NAME)

# スクリプトが直接実行された場合にmain関数を呼び出す
if __name__ == "__main__":
    main()

upload2s3.pyを実行すると特定のWebサイトの画像ををS3にアップロードしてくれます。

001.png

今回はここまでです。