S3のデフォルトでは、すべてのオブジェクトおよびバケットはプライベートであるが、署名付き URL を使用して、オプションでオブジェクトを共有したり、顧客/ユーザーが AWS セキュリティ認証情報またはアクセス許可なしでオブジェクトをバケットにアップロードしたりすることができる。
S3のpresigned URLの生成コード例は以下になる。なおURLに含まれるRegionはaws cliのConfigから見られるため、必要に応じて、コード内のClientに明示的に指定する。
import boto3
from botocore.client import Config
# Lambda handler method
def handler(event, context):
s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
# s3_client = boto3.client('s3', config=Config(region_name = 'us-east-2'))
# AWS Bucket
s3_bucket = 'my-bucket'
# Generate presigned product image urls:
s3_image_path = 'test.txt' # S3 Object key
presigned_image_url = s3_client.generate_presigned_url('put_object',
Params={'Bucket': s3_bucket,
'Key': s3_image_path},
ExpiresIn=600)
return presigned_image_url
Postmanに生成したURLを入力すれば、Curlコマンドを生成してくれる。
VPC EndpointはGatewayとInterface、どちらのものでも使用できる。
なお、Interface型の場合、Route 53などにpresigned URLのドメインでPrivate Hosted Zoneを作成し、EndpointのIPかAliasを記載する必要がある。
Curlコマンドで実行する場合、URLのhttpsをhttpに変えるか、--insecure
で行う必要がある。
なお、S3のバケットをKMSのCMKで暗号化しても、presigned URLを利用する際は特に気にする必要はない。