[英]How to setup AWS-SDK credentials in NextJS
我需要從 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
如果我在代碼中對憑據進行硬編碼,它就可以正常工作。
我怎樣才能讓它正常工作?
看起來 Vercel 文檔目前已過時(AWS SDK V2 而不是 V3)。 您可以在實例化時將憑據 object 傳遞給 AWS 服務。 例如,通過向其中添加您的應用程序名稱來使用未保留的環境變量。
.env.local
YOUR_APP_AWS_ACCESS_KEY_ID=[your key]
YOUR_APP_AWS_SECRET_ACCESS_KEY=[your secret]
將這些環境變量添加到您的 Vercel 部署設置(或 Netlify 等)中,並在您啟動 AWS 服務客戶端時將它們傳入。
import { S3Client } from '@aws-sdk/client-s3'
...
const s3 = new S3Client({
region: 'us-east-1',
credentials: {
accessKeyId: process.env.TRENDZY_AWS_ACCESS_KEY_ID ?? '',
secretAccessKey: process.env.TRENDZY_AWS_SECRET_ACCESS_KEY ?? '',
},
})
(注意:未定義檢查所以 Typescript 保持快樂)
如果我沒記錯的話,您還想將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
您可能通過 Vercel 托管此應用程序嗎? 根據 vercel 文檔,一些環境變量由 vercel 保留。
https://vercel.com/docs/concepts/projects/environment-variables#reserved-environment-variables
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
也許這就是為什么它沒有得到那些環境變量的原因
我能夠通過將我的自定義環境變量添加到 .env.local 然后調用這些變量來解決這個問題
AWS.config.update({
'region': 'us-east-1',
'credentials': {
'accessKeyId': process.env.MY_AWS_ACCESS_KEY,
'secretAccessKey': process.env.MY_AWS_SECRET_KEY
}
});
最后一步需要將這些添加到 Vercel UI 中
顯然不是理想的解決方案,AWS 也不推薦。
https://vercel.com/support/articles/how-can-i-use-aws-sdk-environment-variables-on-vercel
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.