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を実行せずに処理を終了させます。