【问题标题】:DynamoDB table name created with the serverless framework has a random suffix使用无服务器框架创建的 DynamoDB 表名具有随机后缀
【发布时间】:2020-10-28 20:24:14
【问题描述】:

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

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

我期待的是一个名为 accounts-api-dev-accounts 的表格,但 cloudformation 堆栈为我创建的是 accounts-api-dev-accounts-SOME_RANDOM_LETTERS_AND_NUMBERS_SUFFIX

在我的 lambda 函数中,环境变量 DYNAMODB_ACCOUNTS_TABLE_NAME 暴露给没有 SOME_RANDOM_LETTERS_AND_NUMBERS_SUFFIX 部分的函数。 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

【问题讨论】:

  • 另一条评论,我在部署时收到以下警告:Serverless Warning ----------------------------- --------- 找不到满足声明“env:DYNAMODB_ACCOUNTS_TABLE_NAME”的有效环境变量。
  • 可能是在创建表定义的时候环境变量还没有更新?我不知道。尝试${self:provider.environment.DYNAMODB_ACCOUNTS_TABLE_NAME} 而不是${env:DYNAMODB_ACCOUNTS_TABLE_NAME}
  • 宾果游戏。不知道为什么我不能使用 ${env} ,但它可以工作。

标签: amazon-dynamodb amazon-cloudformation serverless-framework


【解决方案1】:

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

environment:
  DYNAMODB_ACCOUNTS_TABLE_NAME: '${self:service}-${self:provider.stage}-accounts'
  ACTUAL_DYNAMODB_ACCOUNTS_TABLE_NAME:
    Ref: AccountsTable

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多