如何在NextJS中设置AWS-SDK凭证

时间:2020-08-04 12:47:06

标签: amazon-web-services amazon-s3 aws-sdk next.js aws-sdk-js

我需要从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

如果我用代码对凭据进行硬编码,则可以正常工作。

如何使其正常工作?

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