AWS署名付きURLについて

  • #開発
  • #AWS

こんにちは。CURUCURUエンジニアの長尾です。

最近ストレンジャーシングスのシーズン4が公開されました。もう待ちに待った続編なのでポップコーン片手に歓喜してます。

今日はAWSの署名付きURLについてお話したいと思います。

署名付きURLについて

AWSではS3へアクセス可能な一時的なURLを発行することができます。

何に使うのか

例えば、CURUCURUでは動画などの大容量データをS3へ保存したいと思ったときにバックエンドサーバに一度アップロードしてから、さらにバックエンドサーバからAWSへアップロードするとバックエンドサーバにとっては負荷が増えるのでバックエンドサーバを通さずにセキュアにS3へ保存したいと思ったときに使ったりします。

どんな感じで実装しているかシーケンスに起こしてみました。

  1. ユーザが画面に動画をアップロードする
  2. 動画を受け取ったクライアントがバックエンドサーバから署名付きURLを取得
  3. クライアントは署名付きURLを使ってS3へアップロードを実行 署名付きURL

具体的にどんなコードで署名付きURLを発行しているかは以下のコードをみて頂くと分かりやすいです。

import boto3
from botocore.client import Config

# put_object もしくは get_objectが指定できます。
operation = "put_object" 
# どのバケットに対して操作するのか
bucket_name = "hogebucket"
# どのオブジェクトに対して操作するのか
object_key_name = "hogeobject"
# 有効期限の設定(秒単位)
expire = 3600
 
s3 = boto3.client("s3", config=Config(signature_version="s3v4"))
signed_url = s3.generate_presigned_url(
  operation,
  Params={
      "Bucket": bucket_name,
      "Key": object_key_name,
  },
  ExpiresIn=expire,
)
print(signed_url)

boto3のセッション発行周りに関しては省略していますが上記のように実装していただくと特定のオブジェクトに対しての署名付きURLが取得できます。

あとはこれを利用してクライアントからアップロード処理を行えばS3にアップロードすることができます。

以下の実装はイメージです。

// 署名付きURL取得
const signedURL = await axios.post('/api/signed_url');
// 動画のblobを取得
const blob = await getBlob(blobUrl);
// 署名付きURLに対してファイルを送信
const res = await axios.put(preSignedUrl, blob, {
    headers: {
        'content-type': 'video/mp4',
    },
});

いかがでしたでしょうか?

今回はAWS S3の署名付きURLに関してお話しさせていただきました。

以上、長尾がお届けしました。

最近ハマっている海外ドラマはストレンジャーシングス

ストレンジャーシングス