こんにちは。先日お仕事でS3の署名付きURLを使用しましたので内容をまとめておきたいと思います。
署名付きURLとは?
S3ではバケット単位やIAMユーザ単位でアクセス制御ができますが、署名付きURLは、有効期限内だけ使用できるURLになります。これによりバケットのポリシーは非公開のまま、中にあるファイルを一時的にユーザーに公開する、もしくはユーザーがファイルをアップロードするといったことができます。
プログラミング
S3でバケット作成し画像を配置します。今回はバケット名「test-signedurl」、ファイル「sample.jpg」で作成しました。
この段階でURLでアクセスしてみます。当然アクセス拒否されます。
Pythonのboto3を使用することで署名付きURLを作成するプログラムができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import boto3 BUCKET = "test-signedurl" KEY = "sample.jpg" def lambda_handler(event, context): s3 = boto3.client("s3") url = s3.generate_presigned_url( ClientMethod = "get_object", Params = {"Bucket" : BUCKET, "Key" : KEY}, ExpiresIn = 600, HttpMethod = "GET" ) return url |
Lambdaで実行します。署名付きURLが作成されました。
これをブラウザのURLに貼り付けて移動すると表示されました。
上記のプログラムでは有効期限を600秒に設定しました。その時間を過ぎてアクセスすると有効期限切れのエラーとなります。
おわりに
今回はS3の署名付きURLを使用してGETでファイルを表示する実装を行いました。ユーザーにファイルをダウンロードさせる時などに有効な手段だと思います。
参考URL:
https://dev.classmethod.jp/cloud/aws/generate-pre-signed-url-for-s3-with-boto3/