Serverless Offline 使用实际 AWS SSM 中的环境变量而不是本地 .env 文件

问题描述 投票:0回答:1

我有一个 Nest JS Lambda 后端,我正在使用

serverless-offline
模块在本地运行它并连接到我的本地 Postgres 数据库。

我的 serverless.yml 文件看起来像

service: wbx-borrower-onboarding-service
frameworkVersion: '3'

plugins:
  - serverless-offline
  - serverless-plugin-log-retention
  - serverless-prune-plugin
  - serverless-dotenv-plugin

package: 
  individually: true

custom:
  stage: ${opt:stage}
  region: ${env:REGION, 'ap-south-1'}
  accountId: ${aws:accountId}
  prune:
    automatic: true
    number: 5
  logRetentionPeriod:
    dev: 14
    prod: 90

provider:
  name: aws
  runtime: nodejs18.x
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'ap-south-1'}
  timeout: 30
  apiGateway:
    binaryMediaTypes:
      - "multipart/form-data"
  environment:
    NODE_ENV: ${self:provider.stage}
    CLERK_API_KEY: ${ssm:/wbx/${self:provider.stage}/clerk/secret/key}
    WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET: wbx-borrower-onboarding-docs
    WBX_DB_PROXY: ${ssm:/wbx/${self:provider.stage}/db/proxy}
    WBX_DB_HOST: ${ssm:/wbx/${self:provider.stage}/db/host}
    WBX_DB_USER: ${ssm:/wbx/${self:provider.stage}/db/user}
    WBX_DB_PASSWORD: ${ssm:/wbx/${self:provider.stage}/db/password}
    WBX_DB_NAME: woodbox

functions:
  <FUNCTION>

我的本地 .env 文件看起来像

WBX_DB_PROXY=localhost
WBX_DB_HOST=localhost
WBX_DB_USER=postgres
WBX_DB_PASSWORD=mydbpwd
WBX_DB_NAME=mydb
WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET=my-bucket
CLERK_API_KEY=api-key
FAKE_VAR=hellohello

我的

app.module.ts
看起来像

import { Module } from '@nestjs/common';
import pg from 'pg';
import { SequelizeModule } from '@nestjs/sequelize';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { OnboardingModule } from './onboarding/onboarding.module';
import { Borrower } from './models/index';

@Module({
  imports: [
    SequelizeModule.forRoot({
      dialect: 'postgres',
      dialectModule: pg,
      host: process.env.WBX_DB_PROXY,
      port: 5432,
      username: process.env.WBX_DB_USER,
      password: process.env.WBX_DB_PASSWORD,
      database: process.env.WBX_DB_NAME,
      models: [Borrower],
    }),
    OnboardingModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

当我运行

sls offline start --reloadHandler --stage dev
时,它会在终端上打印以下内容

DOTENV: Loading environment variables from .env:
         - WBX_DB_PROXY
         - WBX_DB_HOST
         - WBX_DB_USER
         - WBX_DB_PASSWORD
         - WBX_DB_NAME
         - WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET
         - CLERK_API_KEY
         - FAKE_VAR
Starting Offline at stage dev (ap-south-1)

这意味着它正在读取本地 .env 文件,但是当控件到达

app.module.ts
时,它会以某种方式读取我在 AWS 帐户上配置的实际 ssm 参数。我知道这一点是因为当我在服务中打印
console.log(process.env.WBX_DB_HOST);
时,它返回实际的 RDS 端点,而不是本地 .env 中给出的本地主机

我什至尝试单独安装 dotenv 插件并在 app.module.ts 中调用它,然后在 main.ts 中调用它,但它仍然没有帮助

node.js postgresql nestjs serverless-framework serverless-offline
1个回答
0
投票

您可以根据条件提供

environment
值(例如:
stage
)。然后,当阶段为
dev
时,让提供一个空对象,否则提供来自SSM的env值。

service: wbx-borrower-onboarding-service
frameworkVersion: '3'

plugins:
  - serverless-offline
  - serverless-dotenv-plugin

package: 
  individually: true

custom:
  stage: ${opt:stage}
  region: ${env:REGION, 'ap-south-1'}
  accountId: ${aws:accountId}
  prune:
    automatic: true
    number: 5
  logRetentionPeriod:
    dev: 14
    prod: 90
  environment: # Define env object for 2 stages
    prod:
      NODE_ENV: ${self:provider.stage}
      CLERK_API_KEY: ${ssm:/wbx/${self:provider.stage}/clerk/secret/key}
      WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET: wbx-borrower-onboarding-docs
      WBX_DB_PROXY: ${ssm:/wbx/${self:provider.stage}/db/proxy}
      WBX_DB_HOST: ${ssm:/wbx/${self:provider.stage}/db/host}
      WBX_DB_USER: ${ssm:/wbx/${self:provider.stage}/db/user}
      WBX_DB_PASSWORD: ${ssm:/wbx/${self:provider.stage}/db/password}
      WBX_DB_NAME: woodbox
    dev: {} # Empty
provider:
  name: aws
  runtime: nodejs18.x
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'ap-south-1'}
  timeout: 30
  apiGateway:
    binaryMediaTypes:
      - "multipart/form-data"
  environment: ${self:custom.environment.${opt:stage}} # Select env object based on the stage
© www.soinside.com 2019 - 2024. All rights reserved.