我需要从NextJs应用程序将一些文件上传到S3。由于它是服务器端,我给人的印象是简单地设置环境变量应该可以,但不能。我知道还有其他选择,例如为EC2分配角色,但我想使用accessKeyID和secretKey。
这是我的next.config.js
module.exports = {
env: {
//..others
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID
},
serverRuntimeConfig: {
//..others
AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY
}
}
这是我的config/index.js
export default {
//...others
awsClientID: process.env. AWS_ACCESS_KEY_ID,
awsClientSecret: process.env.AWS_SECRET_ACCESS_KEY
}
这是我在代码中使用的方式:
import AWS from 'aws-sdk'
import config from '../config'
AWS.config.update({
accessKeyId: config.awsClientID,
secretAccessKey: config.awsClientSecret,
});
const S3 = new AWS.S3()
const params = {
Bucket: "bucketName",
Key: "some key",
Body: fileObject,
ContentType: fileObject.type,
ACL: 'public-read'
}
await S3.upload(params).promise()
我收到此错误: 未处理的拒绝(CredentialsError):配置中缺少凭证,如果使用AWS_CONFIG_FILE,则设置AWS_SDK_LOAD_CONFIG = 1
如果我用代码对凭据进行硬编码,则可以正常工作。
如何使其正常工作?
答案 0 :(得分:0)
如果我没记错的话,您也想将AWS_ACCESS_KEY_ID
设为运行时变量。当前,它是一个构建时间变量,在您的节点应用程序中将无法访问。
// replace this
env: {
//..others
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID
},
// with this
module.exports = {
serverRuntimeConfig: {
//..others
AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID
}
}
参考:https://nextjs.org/docs/api-reference/next.config.js/environment-variables