技術

Pythonで Presigned URL を使ってみる

先日、とあるサーバサイドの業務でAWSの Presigned URL を使うことがありましたので、その時に調べたことをまとめます。

この記事が役に立つ人

Presigned URL って何っていう人?
Presigned URL をシステムに組み込もうかと考えている人

Presigned URL とは

Presigned URL とは S3 にあるファイルを、AWS 外のユーザと共有するときに発行する期限付の URL です。

業務でメールを使ってると、メールに添付できないサイズのファイルを送りたいシーンがあります。その時は外部のアップローダのサービスを使って、そのURLをメール本文に記載したりすると思います。Presigned URL は、その S3 版です。

Presigned URL は一般的な言葉ではありませんが、ファイルを渡す側は知っている前提で使ったりするので、急に業務で出てきたりして困ったりします。

ユースケース

Presigned URL の典型的なユースケースは、上記のように第三者にS3のファイルを共有したいときです。

が、今回はそのユースケースではなく、とあるWebシステムでファイルをダウンロード/アップロードさせる機能を実装する必要があり、その機能の実現のために Presigned URL を使いました。

サイズが小さいファイルはWebサーバ内に、サイズが大きいファイルはS3に格納しているシステムでした。しかし、このWebシステムのユーザは、AWSのユーザではないのでS3のファイルに直接アクセスするといったことはできません。

そこで、UIのダウンロード/アップロードボタンを押して、その格納先がS3の場合は、Presigned URL を返すという仕様でした。

Presigned URL の使い方

Presigned URL は、 AWS CLI で手軽に発行できるのですが、今回は Python を使いましたので、その方法を記載します。

Presigned URL を使うにあたり、以下の前提条件があります。

前提条件
  • プログラムを実行するAWSユーザは、S3のアクセス権限がある
  • S3にバケットとオブジェクト(ファイル)が存在している必要がある
  • バケット名とオブジェクトキー(ファイルパス)を知っている必要がある

注意が必要なのは、2つ目の条件のファイルが存在している必要があるという点です。ダウンロードを考えたら当たり前の条件ではあるんですが、問題なのはアップロードでも必要ということです。

なので、アップロードはS3に存在しない新規のファイルを Presigned URL でアップするということはできないんですね。アップロードは、S3にある既存のファイルを更新するという形になります。

GETメソッド ダウンロードリンクを生成

ダウンロード用の Presigned URL は、下記のコードで発行できます。

実行結果は以下のようになります。

生成されるURLに、アクセスキーが含まれるので、少しドキッとしてしまいますが、シークレットキーは漏れないので問題ありません。

生成されたURLのリンクをクリックしたり、ブラウザでアクセスするとダウンロードが始まります。

Presigned URL の期限について

外部のアップローダサービス同様、Presigned URL にも、期限を設定することができます。期限を設定できないと、延々とダウンロード可能状態になってしまいますからね。

有効期限は、コードの ExpiresIn=3600 の箇所で指定します。この場合は、3600秒、有効期間は発行から1時間です。1時間過ぎると、URLは無効になります。

ダウンロード中に有効期限が来た場合、そのダウンロードは最後まで行われます。

POSTメソッド アップロードリンクを生成

アップロードは、POSTメソッドになります。上記のコードの、HttpMethod=’GET‘ を HttpMethod=’PUT’ に変更すれば、アップロードリンクになります。以下のコードで発行できます。

実行すると、ダウンロードのときと同様、URLが生成されます。

今回は、POSTなのでダウンロードのようにリンクをクリックしたりブラウザでアクセスしたりはできません。

cURLなどで、ファイルをアップすることになります。

ちなみに、上記コードの KEY = ‘presignedurl-test/test1.txt’ の箇所に、存在しないキーを入れると、以下の例外が発生してURLは生成されません。

なのでS3上に新規ファイルをアップロードするいということは、 Presigned URL では、できないんですね。

どうしてもそうしたい場合は、プログラムの内部で、一度ダミーファイルをS3上に作成して、S3 KEY を確保しておいて、そのKEYに対して Presigned URL を発行するという作りになりそうです。

まとめ

今回の内容は下記になります。

まとめ

Presigned URL について
Presigned URL の簡単な仕様
Presigned URL を Python で生成する方法

Presigned URL 自体は昔からある(2015年ぐらいから?)サービスですが、私は最近まで使用する機会がありませんでした。知っておけば、以外と使う機会が多いのではと思います。

ABOUT ME
tara
tara
年収360万円でIT業界のキャリアスタート
SES -> Web業界 -> 大手メーカー -> フリーランス
と経験してきて、現在は年収1000万円を越えました。

エンジニアのキャリアアップに役立つ情報を発信していきます。