簡體   English   中英

如何在 NextJS 中設置 AWS-SDK 憑證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM