Доступ к конфигурациям среды, определенным в бессерверном режиме.yaml в автономном скрипте nodejs

#node.js #docker #serverless-framework #serverless #serverless-offline

Вопрос:

Недавно я начал работать над проектом, в котором мы используем бессерверную платформу. Мы используем docker, чтобы упростить настройку среды разработки.

В рамках этой настройки докера мы создали скрипт, который, помимо прочего, создает сегменты и таблицы S3. Ранее мы определяли переменные среды в docker-compose файле и получали доступ к ним в нашем приложении nodejs. Для целей развертывания в других средах наша команда разработчиков определила несколько переменных среды в 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 setup CMD. Сначала я думал, что использование sls команды может раскрыть эти переменные среды, определенные в serverless.yaml файле, но, похоже, этого не происходит.

Есть ли какой-либо другой способ добиться этого? Я пытаюсь получить доступ к этим переменным, используя process.env которые работает для лямбд, но не для моего автономного сценария. Спасибо!

Ответ №1:

Не существует хорошего способа получить доступ к этим переменным среды, если вы используете лямбда-код в качестве сценария.

Бессерверная платформа вводит эти переменные в конфигурацию среды выполнения лямбда-функции с помощью CloudFormation.

Он не вставляет/не обновляет необработанный serverless.yml файл и каким-либо образом не перехватывает вызовы process.env через процесс узла.

Вы можете использовать плагин для сценариев для запуска после пакета, а затем экспортировать каждую переменную в локальную среду docker. Но это кажется довольно тяжелым для переменных в вашем env.

Вместо этого вы можете рассмотреть что-то вроде dotenv, которое будет загружать переменные из .env файла в вашу среду.

Существует плагин serverless-dotenv, который вы можете использовать, а затем ваш скрипт также может вызвать dotenv его перед запуском.

Комментарии:

1. Спасибо за ваш ответ. Я думаю, что это единственный способ, которым мы можем действовать. Сначала я думал, что плагин using scriptable без сервера может ввести переменные env в контекст при выполнении моего автономного сценария.

2. Это могло бы быть, но вам пришлось бы написать эту логику самостоятельно. Вероятно, проще просто использовать nodenv вместо этого.