我在 master · serverless/serverless · GitHub 上使用了这个出色的模板来开始使用 Node 和 typescript serverless/lib/plugins/create/templates/aws-nodejs-typescript
在处理程序定义中,我尝试引用环境变量
当我打印出变量时,没有插值。变量仍然是带有大括号的 ${env.CONFIG_TABLE}
"CONFIG_TABLE":"${env.CONFIG_TABLE} 我想使用 CI 和 .env 的环境变量进行本地开发。
const serverlessConfiguration: AWS = {
service: 'trial-service',
frameworkVersion: '2',
useDotenv: true,
我在处理程序的环境部分设置了变量。文件functions/my-function/index.ts是
import schema from './schema';
import { handlerPath } from '@libs/handlerResolver';
export default {
handler: `${handlerPath(__dirname)}/handler.main`,
events: [
{
http: {
method: 'post',
path: 'make-payment',
request: {
schema: {
'application/json': schema
}
}
}
}
],
environment: {
CONFIG_TABLE : "${env.CONFIG_TABLE}",
}
}
解决方案是访问process.env。这确实从 .env 文件和环境变量中读取。
environment: {
CONFIG_TABLE : process.env.CONFIG_TABLE,
在为此苦苦挣扎了一段时间后,我意识到,当转向打字稿配置时,必须以稍微不同的方式考虑配置中的环境变量。
首先我们来区分一下两组环境变量:
useDotEnv
标志。 Serverless(或 dotenv 插件)将负责将这些变量加载到无服务器函数中的 process.env 中,以便在运行时访问。我认为这个问题更应该关注(1)。在部署配置期间如何访问每个环境变量?
答案:你没有使用 dotenv。
您应该设置的
唯一是您的STAGE变量:
STAGE=dev sls deploy
这允许您在部署时访问 process.env['STAGE']
以自定义每个阶段的部署。 以下是如何在 serverless.ts 文件中抽象这一点的示例。
interface Stage {
SomeVariable: string
}
const stages: {
[env: string]: Stage
} = {
dev: {
Foo: 'bar',
},
qa: {
Foo: 'baz',
},
}
const stage = stages[process.env['STAGE'] ?? '']
if(!stage) {
throw new Error("STAGE=[dev|qa] sls deploy")
}
您现在可以在无服务器定义中访问每个环境的配置。这有以下优点: