aws s3 节点 js sdk 方法 generateAuthUrl returns 本地主机和 heroku 上部署的不同结果
aws s3 node js sdk method generatePutUrl returns differnt results for localhost and deployment on heroku
我正在尝试根据 heroku recomendations
管理直接文件上传到 S3
- 第一个需要在服务器
上生成预签名URL
- 在客户端中使用此 url 将图像从浏览器直接上传到 S3 存储桶
并最终设法在本地运行。
但是当我尝试在 heroku 上部署服务器时,它开始无故失败或出现可读错误。当我尝试打印它时,只是常见的错误和奇怪的消息
当我从本地主机或 heroku 拨打电话时,预先签名的 url 对我来说看起来很奇怪是完全不同的
本地主机的响应如下所示:
https://mybucket.s3.eu-west-1.amazonaws.com/5e3ec346d0b5af34ef9dfadf_avatar.png?AWSAccessKeyId=<AWSKeyIdHere>&Content-Encoding=base64&Content-Type=image%2Fpng&Expires=1581172437&Signature=xDJcRBiA%2FmQF1qKhBZrnhFXWdaM%3D
heroku 部署的响应如下所示:
https://mybucket.s3.u-west-1.amazonaws.com/5e3ee2bd1513b60017d85c6c_avatar.png?Content-Type=image%2Fpng&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credentials-key-here>%2F20200208%2Fu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200208T163315Z&X-Amz-Expires=900&X-Amz-Signature=<someSignature>&X-Amz-SignedHeaders=content-encoding%3Bhost
服务器代码与示例中的代码几乎相同:
const Bucket = process.env.BUCKET_NAME
const region = process.env.BUCKET_REGION
AWS.config = new AWS.Config({
accessKeyId: process.env.S3_KEY,
secretAccessKey: process.env.S3_SECRET,
region,
logger: console
})
const s3 = new AWS.S3()
async function generatePutUrl(inputParams = {}) {
const params = { Bucket, ...inputParams }
const { Key } = inputParams
const putUrl = await s3.getSignedUrl('putObject', params)
const getUrl = generateGetUrlLocaly(Key)
return {putUrl, getUrl}
}
我能想到的唯一区别是 SSL - 我 运行 本地服务器通过 http 和 heroku 默认通过 https...
但我不明白它会如何影响这里。
我将不胜感激任何有意义的建议如何调试和修复它。
谢谢你。
您的存储桶区域似乎不正确。不应该是 eu-west-1
而不是 u-west-1
吗?
请在 Heroku Server 设置的环境变量中从
更新您的 BUCKET_REGION
u-west-1
到
eu-west-1
并重启测功机。它可能会解决您的问题。
我正在尝试根据 heroku recomendations
管理直接文件上传到 S3- 第一个需要在服务器 上生成预签名URL
- 在客户端中使用此 url 将图像从浏览器直接上传到 S3 存储桶
并最终设法在本地运行。
但是当我尝试在 heroku 上部署服务器时,它开始无故失败或出现可读错误。当我尝试打印它时,只是常见的错误和奇怪的消息
当我从本地主机或 heroku 拨打电话时,预先签名的 url 对我来说看起来很奇怪是完全不同的 本地主机的响应如下所示:
https://mybucket.s3.eu-west-1.amazonaws.com/5e3ec346d0b5af34ef9dfadf_avatar.png?AWSAccessKeyId=<AWSKeyIdHere>&Content-Encoding=base64&Content-Type=image%2Fpng&Expires=1581172437&Signature=xDJcRBiA%2FmQF1qKhBZrnhFXWdaM%3D
heroku 部署的响应如下所示:
https://mybucket.s3.u-west-1.amazonaws.com/5e3ee2bd1513b60017d85c6c_avatar.png?Content-Type=image%2Fpng&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credentials-key-here>%2F20200208%2Fu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200208T163315Z&X-Amz-Expires=900&X-Amz-Signature=<someSignature>&X-Amz-SignedHeaders=content-encoding%3Bhost
服务器代码与示例中的代码几乎相同:
const Bucket = process.env.BUCKET_NAME
const region = process.env.BUCKET_REGION
AWS.config = new AWS.Config({
accessKeyId: process.env.S3_KEY,
secretAccessKey: process.env.S3_SECRET,
region,
logger: console
})
const s3 = new AWS.S3()
async function generatePutUrl(inputParams = {}) {
const params = { Bucket, ...inputParams }
const { Key } = inputParams
const putUrl = await s3.getSignedUrl('putObject', params)
const getUrl = generateGetUrlLocaly(Key)
return {putUrl, getUrl}
}
我能想到的唯一区别是 SSL - 我 运行 本地服务器通过 http 和 heroku 默认通过 https...
但我不明白它会如何影响这里。 我将不胜感激任何有意义的建议如何调试和修复它。 谢谢你。
您的存储桶区域似乎不正确。不应该是 eu-west-1
而不是 u-west-1
吗?
请在 Heroku Server 设置的环境变量中从
更新您的 BUCKET_REGIONu-west-1
到
eu-west-1
并重启测功机。它可能会解决您的问题。