#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
вместо этого.