AWS KMSで暗号化されたS3オブジェクトの期限付きURL(PreSignedURL)を、Nodejsで発行する


こういう状態のオブジェクトを想定。

一般的な書き方

import { S3 } from 'aws-sdk'

const client = new S3()

client.getSignedUrl('getObject', {
  Bucket: 'BUCKET_NAME',
  Key: 'OBJECT_KEY',
  Expires: 60 * 60 * 24 * 2
}, (e, r) => {
  console.log(e)
  console.log(r)
})

結果

URLは発行されるのですが、暗号化されているオブジェクトは、HTTP403が返ってきます。

対応

クラスを初期化する際にsignatureVersionを渡してやりましょう。

import { S3 } from 'aws-sdk'

const client = new S3({
  signatureVersion: 's3v4'
})

client.getSignedUrl('getObject', {
  Bucket: 'BUCKET_NAME',
  Key: 'OBJECT_KEY',
  Expires: 60 * 60 * 24 * 2
}, (e, r) => {
  console.log(e)
  console.log(r)
})