如何在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包管理环境变量,步骤如下:
- 安装依赖
npm install @nestjs/config
- 全局导入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 {}
- 通过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
相关产品推荐
相关产品推荐

