boto3でS3の期限付きURLを発行する(ファイルの存在確認付き)


generate_presigned_urlで期限付きURLを発行できるのですが、オブジェクトが存在しないキーに対しても作れちゃう問題があります。
なのでget_objectでオブジェクトが実在するか否かを確認してから、期限付きURLを発行するようにしてみました。

import boto3
import botocore
import logging
logger = logging.getLogger()

def create_presigned_url( bucket_name, key ):
    s3 = boto3.client('s3')
    try:
        s3.get_object(
            Bucket = bucket_name,
            Key = key
        )
        url = s3.generate_presigned_url(
            ClientMethod = 'get_object',
            Params = {
                Bucket = bucket_name,
                Key = key
            },
            ExpiresIn = 3600,
            HttpMethod = 'GET'
        )
        return url
    except botocore.exceptions.ClientError as e:
        logger.warning(e)
        return 'File ' + bucket_name + '/' + key + 'not found'


bucket_name = 'BUCKET_NAME'
key = 'S3_OBJECT_KEY'
create_presigned_url( bucket_name, key )

存在しないオブジェクトに対してget_objectを実行すると、ClientErrorが返ってきます。
なのでそれを利用してtry ~ exceptでオブジェクトが存在しない場合は、generate_presigned_urlを実行せずに処理を終了させます。