使用 dotenv (.env) 的无服务器阶段环境变量

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

我是无服务器新手, 到目前为止,我已经能够为应用程序部署和使用

.env

然后,在

provider
文件的
stage
属性中的
serverless.yml
下,我将其更改为不同的阶段。我也做了新的
.env.{stage}
.

使用

sls deploy
重新部署后,它仍然读取默认的
.env
文件。

文档声明:

框架在服务目录中查找 .env 和 .env.{stage} 文件,然后尝试使用 dotenv 加载它们。如果找到 .env.{stage},则不会加载 .env。如果未明确定义阶段,则默认为 dev.

所以,我还是不明白“如果stage没有明确定义,默认是dev”。如何明确定义它?

aws-lambda environment-variables serverless-framework serverless dotenv
3个回答
0
投票

dotenv 文件是根据您的舞台属性配置选择的。您需要在 serverless.yaml 中显式定义 stage 属性或在部署命令中设置它。

这将使用 .env.dev 文件

 useDotenv: true
 provider:
  name: aws
  stage: dev # dev [default], stage, prod
  memorySize: 3008
  timeout: 30

或者您通过 deploy 命令设置 stage 属性。 这将使用 .env.prod 文件

sls deploy --stage prod

0
投票

在您的

serverless.yml
中,您需要在
stage
对象中定义
provider
属性。

例子:

provider:
  name: aws
  [...]
  stage: prod

0
投票

2023 年 2 月,我将尝试给出我的解决方案。我正在为 monorepo 使用 Nx 工具(这无关紧要,但以防万一),我正在使用

serverless.ts
代替。

我认为这样做的目的是为了增强开发人员的体验,因为只需

nx run users:serve --stage=test
(在我的情况下使用 Nx)或
sls offline --stage=test
和无服务器就可以为特定的加载适当的变量环境

有些人选择在每个环境中使用多个

.env.<stage>
。我试图走这条路,但因为我不是一个优秀的开发人员,所以我无法让它发挥作用。适用于 的方法是在
serverless.ts
内连接变量名称。让我解释一下……

我只使用一个

.env
文件,但根据
--stage
更改变量名称。魔法正在发生
serverless.ts

// .env

STAGE_development=test
DB_NAME_development=mycraftypal
DB_USER_development=postgres
DB_PASSWORD_development=abcde1234
DB_PORT_development=5432
READER_development=localhost // this could be aws rds uri per db instances
WRITER_development=localhost // this could be aws rds uri per db instances

# TEST
STAGE_test=test
DB_NAME_test=mycraftypal
DB_USER_test=postgres
DB_PASSWORD_test=abcde1234
DB_PORT_test=5433
READER_test=localhost // this could be aws rds uri per db instances
WRITER_test=localhost // this could be aws rds uri per db instances
// serverless.base.ts or serverless.ts based on your configuration
...
useDotenv: true, // this property is at the root level

...
provider: {
  ...
  stage: '${opt:stage, "development"}', // get the --stage flag value or default to development
  ...,
  environment: {
    STAGE: '${env:STAGE_${self:provider.stage}}}',
    DB_NAME: '${env:DB_NAME_${self:provider.stage}}',
    DB_USER: '${env:DB_USER_${self:provider.stage}}',
    DB_PASSWORD: '${env:DB_PASSWORD_${self:provider.stage}}',
    READER: '${env:READER_${self:provider.stage}}',
    WRITER: '${env:WRITER_${self:provider.stage}}',
    DB_PORT: '${env:DB_PORT_${self:provider.stage}}',
    AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
  }
  ...
}

当一个人使用

useDotenv: true
时,无服务器从
.env
加载您的变量并将它们放入
env
变量中,以便您可以访问它们
env:STAGE
.

现在我可以像这样

stage
动态访问变量
${env:DB_PORT_${self:provider.stage}}
。如果您查看
.env
文件,每个变量的末尾都有
..._<stage>
。通过这种方式,我可以动态检索每个值。

我还在想办法,因为我不想在我的网址中使用

production
这个词,但仍然动态获取值,因为我正在连接这个值
${env:DB_PORT_${self:provider.stage}}
...然后实际变量变成
 DB_PORT_
而不是
DB_PORT
.

© www.soinside.com 2019 - 2024. All rights reserved.