【发布时间】:2019-05-10 22:12:25
【问题描述】:
我有一个在 AWS Lambda 上运行的简单 NestJS 应用程序。我正在使用 AWS SSM 参数存储来保存数据库连接信息和凭证。当我导入 TypeORM 时,我使用已从商店检索到的参数。
现在我只是在导入 TypeORM 的 AppModule 中检索参数。我确信有更好的方法可以做到这一点,但我不确定它会是什么。自定义提供者?某种设置服务?我不认为我当前的解决方案非常健壮,也没有很好的错误处理。
唯一的要求是我在运行时而不是在构建或部署时检索 SSM 参数。任何建议
这就是我目前正在做的事情:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ThingyModule } from 'thingy/thingy.module';
import * as awsParamStore from 'aws-param-store';
const ssmParams = awsParamStore.getParametersByPathSync('/myapp/prod', {region: (process.env['AWS_DEFAULT_REGION'] ? process.env['AWS_DEFAULT_REGION'] : 'us-east-2')});
const ssmMap = ssmParams.reduce(function(map, obj) {
map[obj.Name] = obj.Value;
return map;
}, {});
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'postgres',
host: ssmMap['/myapp/prod/db/host'],
port: 5432,
username: ssmMap['/myapp/prod/db/username'],
password: ssmMap['/myapp/prod/db/password'],
database: 'postgres',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
ThingyModule
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
之前已使用 AWS CLI 创建了参数:
// aws ssm put-parameter --type String --name /myapp/prod/db/username --value postgres --region us-east-2
// aws ssm put-parameter --type String --name /myapp/prod/db/password --value supRCkrit --region us-east-2
// aws ssm put-parameter --type String --name /myapp/prod/db/host --value localhost --region us-east-2
【问题讨论】:
-
嗨,你有没有想过如何让它工作?我有同样的问题:-) 谢谢!我在这里问过类似的问题 -> stackoverflow.com/questions/55911569/…
-
不,并没有比上面的更好。我清理了它并将其封装到一个单独的“服务”中,但基本上还是在同一个地方以同样的方式进行。充其量我可能会将它移动到创建 Nest 应用程序的 index.ts 中的主处理函数中。然后我就知道一切都准备好了。我也可能会缓存数据。但是我还没有看到以任何直接方式将其“传递”到模块创建过程。