访问独立nodejs脚本中serverless.yaml中定义的环境配置



我最近开始着手一个项目,在该项目中我们使用了无服务器框架。我们使用docker使开发环境更容易设置。

作为这个docker设置的一部分,我们创建了一个脚本,用于创建S3 bucket&桌子等等。我们之前在docker-compose文件中定义环境变量,并在nodejs应用程序中访问它们。为了部署到其他环境,我们的devops团队在serverless.yaml文件中定义了一些环境变量,导致环境配置出现在两个位置。我们现在计划将docker-compose文件中定义的所有环境配置移动到serverless.yaml。这对我们的lambdas函数很有效,因为它们能够读取这些配置,但对我们编写的独立设置脚本不起作用。

我尝试使用这个插件(serverless-scriptable-plugin)来读取这些env变量,但仍然无法做到

这是我的serverless.yaml文件

service:
name: my-service
frameworkVersion: '2'
configValidationMode: error
provider:
name: aws
runtime: nodejs14.x
region: 'us-east-1'
profile: ${env:PROFILE, 'dev'}
stackName: stack-${self:provider.profile}
apiName: ${self:custom.environment_prefix}-${self:service.name}-my-api
environment: ${self:custom.environment_variables.${self:provider.profile}}
plugins:
- serverless-webpack
- serverless-scriptable-plugin
- serverless-offline-sqs
- serverless-offline
functions:
myMethod:
handler: handler.myHandler
name: ${self:custom.environment_prefix}-${self:service.name}-myHandler
events:
- sqs:
arn:
Fn::GetAtt:
- MyQueue
- Arn
resources:
Resources:
MyQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${self:custom.queuename}
Tags:
- Key: product
Value: common
- Key: service
Value: common
- Key: function
Value: ${self:service.name}
- Key: region
Value: ${env:REGION}
package:
individually: true
custom:
webpack:
webpackConfig: ./webpack.config.js
includeModules: true
serverless-offline:
host: 0.0.0.0
port: 3000
serverless-offline-sqs:
apiVersion: '2012-11-05'
endpoint: http://sqs:9324
region: ${self:provider.region}
accessKeyId: root
secretAccessKey: root
skipCacheInvalidation: false
localstack:
stages:
- local
lambda:
mountCode: true
debug: true
environment_prefixes:
staging: staging
production: production
dev: dev
environment_prefix: ${self:custom.environment_prefixes.${self:provider.profile}}
queuename: 'myQueue'
environment_variables:
dev:
AWS_ACCESS_KEY_ID: test
AWS_SECRET_ACCESS_KEY: test
BUCKET_NAME: my-bucket
S3_URL: http://localstack:4566
SLS_DEBUG: '*'
scriptable:
commands:
setup: node /app/dockerEntrypoint.js

在DockerFile中,我尝试使用sls setupCMD执行脚本。我最初认为使用sls命令可能会公开serverless.yaml文件中定义的这些环境变量,但似乎并没有实现。

还有其他方法可以做到这一点吗?我正在尝试使用process.env访问这些变量,它适用于lambdas,但不适用于我的独立脚本。谢谢

如果您将lambda代码作为脚本运行,那么访问这些环境变量的方法并不好。

Serverless Framework通过CloudFormation将这些变量注入Lambda函数运行时配置中。

它不会插入/更新原始serverless.yml文件,也不会以某种方式通过节点进程拦截对process.env的调用。

您可以使用可编写脚本的插件在包后运行,然后将每个变量导出到本地docker环境中。但对于env中的变量来说,这似乎相当沉重。

相反,您可以考虑像dotenv这样的东西,它将把.env文件中的变量加载到您的环境中。

您可以使用一个无服务器的dotenv插件,然后您的脚本也可以在运行前调用dotenv

最新更新