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を使えば簡単にファイルアップロードもできますね!