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にアップロードしてくれます。
今回はここまでです。