установите переменные env в бессерверной среде условно

#javascript #aws-lambda #serverless-framework

Вопрос:

я пытаюсь установить переменную env ( называемую baseUrl), однако я хочу, чтобы значение этой переменной менялось в зависимости от значения этапа.

 for example if stage = dev baseurl= https://example.com
for exma[le if stage = prod baseurl= https://example2.com
 

вот мой бессерверный файл.yml

 custom:
  profiles:
    dev: default
    prod: mad

provider:
  name: aws
  profile: ${self:custom.profiles.${sls:stage}}
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221
  region: ap-southeast-1
  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - dynamodb:DescribeTable
            - dynamodb:Query
            - dynamodb:Scan
            - dynamodb:GetItem
            - dynamodb:PutItem
            - dynamodb:UpdateItem
            - dynamodb:DeleteItem
          Resource: arn:aws:dynamodb:ap-southeast-1::

resources:
  Resources:
    trimifyUrlsTable:
      Type: 'AWS::DynamoDB::Table'
      Properties:
        AttributeDefinitions:
          - AttributeName: pk
            AttributeType: S
          - AttributeName: originalUrl
            AttributeType: S
        KeySchema:
          - AttributeName: pk
            KeyType: HASH
          - AttributeName: originalUrl
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: 'mad_dove_urls'

functions:
  customAuthorizer:
    handler: authorizer/authorizer.auth
    environment:
      ACCOUNT_ID: ${aws:accountId}
      API_ENDPOINT:
         Ref: ApiGatewayRestApi
      STAGE_NAME: ${opt:stage, 'dev'}
  operations:
    handler: serverless.handler
    environment:
      STAGE_NAME: ${opt:stage, 'dev'}
    events:
      - http:
          path: /
          method: ANY
          cors: true
      - http:
          path: /{proxy }
          method: ANY
          cors: true
      - http:
          path: /auth-ops
          method: ANY
          authorizer: customAuthorizer
          cors: true
      - http:
          path: /auth-ops/{proxy }
          method: ANY
          authorizer: customAuthorizer
          cors: true
 

Ответ №1:

Я бы рекомендовал просто использовать функцию dotenv, которая описана в документации: https://www.serverless.com/framework/docs/environment-variables/

Пример того, как это сделать

Структура файлов:

 serverless.yml
.env.dev
.env.prod
 

Содержимое файлов:

.env.dev :

 BASE_URL=https://example.com
 

.env.prod :

 BASE_URL=https://example2.com
 

serverless.yml :

 service: example-service

custom:
  profiles: ${env:BASE_URL} # this will be example/example2.com depends on the current stage
 

Затем вы можете легко использовать его из пользовательского раздела в качестве обычной бессерверной переменной фреймворка.