Amazon dynamodb 使用无服务器框架创建的DynamoDB表名具有随机后缀

Amazon dynamodb 使用无服务器框架创建的DynamoDB表名具有随机后缀,amazon-dynamodb,amazon-cloudformation,serverless-framework,Amazon Dynamodb,Amazon Cloudformation,Serverless Framework,我正在使用无服务器框架创建DynamoDB表,然后我想从Lambda函数访问它 在serverless.yml文件中,我有以下环境变量和CF资源的定义 我所期望的是一个名为accounts-api-dev-accounts的表,但cloudformation堆栈为我创建的是accounts-api-dev-accounts-SOME\u随机字母和\u数字\u后缀 在我的lambda函数中,环境变量DYNAMODB\u ACCOUNTS\u TABLE\u NAME暴露于函数中,而不包含一些随机字

我正在使用无服务器框架创建DynamoDB表,然后我想从Lambda函数访问它

serverless.yml
文件中,我有以下环境变量和CF资源的定义

我所期望的是一个名为
accounts-api-dev-accounts
的表,但cloudformation堆栈为我创建的是
accounts-api-dev-accounts-SOME\u随机字母和\u数字\u后缀

在我的lambda函数中,环境变量
DYNAMODB\u ACCOUNTS\u TABLE\u NAME
暴露于函数中,而不包含
一些随机字母和数字后缀
部分。CF堆栈是否应该添加随机后缀?如何实际检索正确的表名

service:
  name: accounts-api
provider:
...
  stage: ${opt:stage, 'dev'}
  environment:
    DYNAMODB_ACCOUNTS_TABLE_NAME: '${self:service}-${self:provider.stage}-accounts'
以及以下CF资源:

  Resources:
      AccountsTable:
          Type: AWS::DynamoDB::Table
          Properties:
            TableName: ${env:DYNAMODB_ACCOUNTS_TABLE_NAME}
            AttributeDefinitions:
              - AttributeName: customerNumber
                AttributeType: S
              - AttributeName: accountNumber
                AttributeType: S
            KeySchema:
              - AttributeName: customerNumber
                KeyType: HASH
              - AttributeName: accountNumber
                KeyType: RANGE
            ProvisionedThroughput:
              ReadCapacityUnits: 1
              WriteCapacityUnits: 1

在创建表定义时,环境变量可能尚未更新?我不确定


尝试
${self:provider.environment.DYNAMODB_ACCOUNTS_TABLE_NAME}
而不是
${env:DYNAMODB_ACCOUNTS_TABLE_NAME}

我还没有看到这种行为(部署后的随机字符),这可能是在必须替换表时强制唯一性的一种方法。您可以使用另一个环境变量,并由表资源的输出填充该值。这样,CloudFormation将向Lambda环境变量注入实际的资源名称。我还没试过,但这将是我的第一次“尝试”


另一个注释是,我在部署时收到以下警告:无服务器警告----------------------无法找到满足声明“env:DYNAMODB_ACCOUNTS_TABLE_NAME”的有效环境变量。可能在创建表定义时环境变量尚未更新?我不确定。尝试
${self:provider.environment.DYNAMODB\u ACCOUNTS\u TABLE\u NAME}
而不是
${env:DYNAMODB\u ACCOUNTS\u TABLE\u NAME}
宾果。不确定为什么我不能将${env}与它一起使用,但它可以工作。
environment:
  DYNAMODB_ACCOUNTS_TABLE_NAME: '${self:service}-${self:provider.stage}-accounts'
  ACTUAL_DYNAMODB_ACCOUNTS_TABLE_NAME:
    Ref: AccountsTable