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

如何在Serverless部署的NestJS中使用AWS Secrets Manager?

AWS Serverless + NestJS 配置Secrets Manager作为环境变量的正确方式

一、解决Serverless配置报错的问题

你的报错是因为直接通过${self:custom.my_env_var.API_KEY}访问Secret值,但${ssm:/aws/reference/secretsmanager/my_env_var}返回的是整个Secret的JSON字符串,而非可直接访问的对象。以下是两种正确配置方式:

方式1:直接引用单个Secret键值

AWS Secrets Manager支持直接引用Secret内的单个键,格式为${ssm:/aws/reference/secretsmanager/[Secret名称]::[键名]}:

functions:
  main:
    environment:
      API_KEY: ${ssm:/aws/reference/secretsmanager/my_env_var::API_KEY}

方式2:解析整个Secret JSON(多键场景)

如果需要加载多个Secret键,可使用jsonparse解析整个Secret的JSON字符串:

custom:
  my_secret: ${ssm:/aws/reference/secretsmanager/my_env_var}

functions:
  main:
    environment:
      API_KEY: ${jsonparse(${self:custom.my_secret}).API_KEY}
      ANOTHER_SECRET: ${jsonparse(${self:custom.my_secret}).ANOTHER_SECRET}

注意:需确保你的Secret存储的是标准JSON格式,例如{"API_KEY":"xxx", "ANOTHER_SECRET":"yyy"}

必备权限配置

Serverless部署的IAM角色需要具备访问Secrets Manager的权限,需在serverless.yml中添加:

provider:
  name: aws
  runtime: nodejs18.x # 替换为你的NestJS对应的Node版本
  iamRoleStatements:
    - Effect: Allow
      Action:
        - secretsmanager:GetSecretValue
      Resource: arn:aws:secretsmanager:${aws:region}:${aws:accountId}:secret:my_env_var-* # 末尾的-*适配Secrets Manager自动添加的随机后缀

二、NestJS中使用环境变量

推荐使用NestJS官方的@nestjs/config包管理环境变量,步骤如下:

  1. 安装依赖
npm install @nestjs/config
  1. 全局导入ConfigModule
    在AppModule中配置全局ConfigModule,让环境变量在整个应用中可用:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env', // 本地开发时加载.env文件,部署时会被Serverless注入的环境变量覆盖
    }),
  ],
})
export class AppModule {}
  1. 通过ConfigService获取环境变量
    在服务或控制器中注入ConfigService来安全获取环境变量:
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class ExternalApiService {
  private readonly apiKey: string;

  constructor(private configService: ConfigService) {
    this.apiKey = this.configService.get<string>('API_KEY');
  }

  async callExternalService() {
    // 使用apiKey调用外部服务
    console.log('使用API Key:', this.apiKey);
  }
}

如果不需要额外配置,也可以直接使用process.env.API_KEY,但ConfigService提供了类型安全和配置验证的能力,更推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:50:00