You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在serverless.yml中正确创建并使用环境变量?

正确解决方案

你之前的问题核心是没搞清楚Serverless框架的变量作用域:provider.environment里的变量是给Lambda运行时用的,没法直接在CloudFormation资源(resources部分)里引用;而${env:XXX}是读取系统环境变量,不是你在serverless.yml里定义的那个环境变量集合。

正确的做法是在serverless.yml的顶层自定义变量里定义表名,然后分别在provider.environment和resources中引用这个变量,这样两边都能正常使用:

# 顶层自定义变量,全局可引用
custom:
  dynamoDbTableName: "tableName" # 这里定义表名,需符合[a-zA-Z0-9_.-]+格式

provider:
  name: aws
  runtime: java11
  stage: dev
  region: us-east-1
  environment:
    # 把自定义变量赋值给运行时环境变量,供代码调用
    DYNAMO_DB_TABLE: ${self:custom.dynamoDbTableName}

resources:
  Resources:
    S3ObjectsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        # 直接引用顶层自定义变量创建表
        TableName: ${self:custom.dynamoDbTableName}
        # 补充必要的DynamoDB配置示例
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

为什么之前的方案不行?

  1. 方案1:${DYNAMO_DB_TABLE}试图直接引用provider.environment里的变量,但Serverless框架不允许在resources部分直接读取该区域的变量,报错里的正则问题本质是变量未成功解析,导致传入了无效格式的表名。
  2. 方案2:${env:DYNAMO_DB_TABLE}是读取本地系统的环境变量(比如终端中export的变量),并非serverless.yml内provider.environment下的变量,所以找不到对应值。

代码中如何使用?

在Java代码里直接读取环境变量即可:

String tableName = System.getenv("DYNAMO_DB_TABLE");
// 使用该tableName操作DynamoDB

内容的提问来源于stack exchange,提问作者hhrzc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:46:07