1

我最近开始研究一个我们正在使用无服务器框架的项目。我们正在使用 docker 使开发环境更易于设置。

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

我尝试使用这个插件(serverless-scriptable-plugin)试图能够读取这些环境变量,但仍然无法这样做。

这是我的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 但不适用于我的独立脚本的变量来访问这些变量。谢谢!

4

1 回答 1

1

如果您将 lambda 代码作为脚本运行,则没有一种访问这些环境变量的好方法。

无服务器框架通过 CloudFormation 将这些变量注入到 Lambda 函数运行时配置中。

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

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

相反,您可能会考虑使用类似dotenv的东西,它将文件中的变量加载.env到您的环境中。

您可以使用一个 serverless-dotenv 插件,然后您的脚本也可以dotenv在运行之前调用。

于 2021-08-04T22:39:32.423 回答