LoginSignup
15
9

More than 3 years have passed since last update.

Pre-Signed URLでS3に直接ファイルをアップロードする

Posted at

S3にファイルをアップロード

S3にファイルをアップロードするときLambdaやEC2経由にすることが多いかと思いますが、大容量のファイルだとS3に直接アップするほうが効率が良さそうです。
そういった場合はPre-Signed URLを取得して直接S3にファイルをPUTしてやると良さそうです。

Pre-Signed URLの取得

以下のコードでPre-Signed URLが取得できます。

Lambda
const s3 = new AWS.S3()
const params = {
  Bucket: '<バケット名>',
  Key: '<ファイルパス>',
  Expires: 100 // 期限(秒)
}

async function getPresignedUrl(){
  return new Promise((resolve,reject)=>{
    s3.getSignedUrl('putObject', params, (err, url) => {
      if (err) {
        reject(err)
      } else {
        resolve(url)
      }
    })
  })
}

exports.handler = async (event) => {
  const url = await getPresignedUrl()
  return {
    url: url
  }
}

アップロード

以下のcurlコマンドでファイルをアップロードしてみます。

$ curl -X PUT --upload-file <ファイルパス> "<取得したPre-Signed URL>"

S3のバケットにファイルが有れば成功です。
Pre-Signed URLの期限が切れていたり、間違っている場合は以下のようなエラーのxmlが返ってきます。

<?xml version="1.0" encoding="UTF-8"?>
<Error>
  <Code>AccessDenied</Code>
  <Message>Request has expired</Message>
  <Expires>2020-04-09T09:02:03Z</Expires>
  <ServerTime>2020-04-09T16:06:00Z</ServerTime>
  <RequestId>xxxxx</RequestId>
  <HostId>xxxxx</HostId>
</Error>

Pre-Singed URLを使えば簡単にファイルアップロードもできますね!

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9