You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js 13中通过AWS Secret Manager加载私密环境变量?

在Next.js 13中从AWS Secrets Manager加载私密环境变量的方案

方案1:构建前脚本加载(构建时固定密钥)

这是最贴近你设想的方案,通过构建前执行Node.js脚本拉取密钥并写入本地环境变量文件,供Next.js构建使用。

  1. 安装依赖
    安装AWS SDK for JavaScript(仅作为开发依赖,因为只在构建阶段使用):

    npm install aws-sdk --save-dev
    
  2. 编写密钥加载脚本
    在项目根目录创建load-secrets.js文件,内容如下:

    const AWS = require('aws-sdk');
    const fs = require('fs');
    
    // 初始化AWS Secrets Manager客户端
    const secretsManager = new AWS.SecretsManager({
      region: '你的AWS区域(如us-east-1)'
      // 本地开发时,AWS凭证会自动从~/.aws/credentials或环境变量读取;部署环境可依赖IAM角色
    });
    
    async function loadSecrets() {
      try {
        // 替换为你的Secret ARN或名称
        const secretData = await secretsManager.getSecretValue({ SecretId: '你的Secret ID' }).promise();
        const secrets = JSON.parse(secretData.SecretString);
    
        // 生成.env.local内容
        let envContent = '';
        for (const [key, value] of Object.entries(secrets)) {
          // 私密变量不要加NEXT_PUBLIC_前缀,避免暴露给客户端
          envContent += `${key}=${value}\n`;
        }
    
        // 写入.env.local文件
        fs.writeFileSync('.env.local', envContent);
        console.log('Secrets loaded successfully into .env.local');
      } catch (error) {
        console.error('Failed to load secrets:', error);
        process.exit(1); // 加载失败终止构建
      }
    }
    
    loadSecrets();
    
  3. 修改构建命令
    在package.json中修改build命令,先执行脚本再构建:

    {
      "scripts": {
        "build": "node load-secrets.js && next build",
        "dev": "node load-secrets.js && next dev" // 开发环境也可提前加载
      }
    }
    

方案2:Next.js配置文件中动态加载

Next.js的next.config.js支持异步函数,可在此处直接拉取密钥并注入到环境变量中:

const AWS = require('aws-sdk');

module.exports = async () => {
  const secretsManager = new AWS.SecretsManager({ region: '你的AWS区域' });
  const secretData = await secretsManager.getSecretValue({ SecretId: '你的Secret ID' }).promise();
  const secrets = JSON.parse(secretData.SecretString);

  return {
    env: {
      // 将密钥注入到Next.js环境变量
      DB_PASSWORD: secrets.DB_PASSWORD,
      API_KEY: secrets.API_KEY
      // 如需暴露给客户端,添加NEXT_PUBLIC_前缀(不建议私密密钥这么做)
    }
  };
};

注意:这种方式下,密钥会在构建时被注入到服务器端环境变量中,客户端无法访问未加NEXT_PUBLIC_前缀的变量。

方案3:服务器组件/路由中实时拉取(动态密钥场景)

如果密钥需要动态更新(无需重新构建),可在Next.js 13的服务器组件或API路由中直接拉取:

// app/page.js(服务器组件)
import AWS from 'aws-sdk';

async function getSecret() {
  const secretsManager = new AWS.SecretsManager({ region: '你的AWS区域' });
  const secretData = await secretsManager.getSecretValue({ SecretId: '你的Secret ID' }).promise();
  return JSON.parse(secretData.SecretString);
}

export default async function Home() {
  const secrets = await getSecret();
  // 使用secrets中的密钥,比如连接数据库
  return <div>Loaded secret: {secrets.DB_PASSWORD}</div>;
}

关键注意事项

  • IAM权限:部署环境(如EC2、ECS、Lambda、Amplify)的执行角色需要添加secretsmanager:GetSecretValue权限。
  • 本地开发:确保本地已配置AWS凭证(通过aws configure命令或环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY)。
  • 安全防护:.env.local需加入.gitignore,避免密钥提交到版本控制;私密变量绝对不要添加NEXT_PUBLIC_前缀。
  • 部署适配:在AWS Amplify、Vercel等平台部署时,需确保构建阶段能访问AWS凭证(Amplify可通过环境变量配置,Vercel可在项目设置中添加AWS凭证)。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:02