AWS 无服务器 - 自动创建 DynamoDB

AWS Serverless - Auto Create DynamoDB

在我的 serverless.yml 文件中,我指定了一个 DynamoDB 资源,具有这种效果(见下文)。我想知道两件事:

  1. 为什么我没有看到这些 table 在它们不存在时被创建,迫使我手动进入 AWS 控制台并自己这样做?

  2. 在我的源代码 (nodejs) 中,我不确定如何引用 yml 文件中指定的 table 而不是对其进行硬编码。

以上两个问题归结为一个单一问题,即我希望能够在 yml 中指定 tables,然后在执行 "deploy" 时,有每个环境创建不同的 table 集。

即如果我部署到“--stage Prod”,那么 table 将是 "MyTable_Prod"。如果我部署到“--stage Dev”,那么 table 将是 "MyTable_Dev",等等...

弄清楚这一点将大大有助于使部署更加顺利:)。

感兴趣的serverless.yml部分如下:

  resources:  
  Resources:
    DynamoDbTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: MyHappyFunTable
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 5
          WriteCapacityUnits: 5
    DynamoDBIamPolicy:
      Type: AWS::IAM::Policy
      DependsOn: DynamoDbTable
      Properties:
        PolicyName: lambda-dynamodb
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - dynamodb:Query
                - dynamodb:Scan
                - dynamodb:GetItem
                - dynamodb:PutItem
                - dynamodb:UpdateItem
                - dynamodb:DeleteItem
              Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
        Roles:
          - Ref: IamRoleLambdaExecution

我可怕的 'hardcoded' table 名字示例如下:

dbParms = {
    TableName : "MyTable_Dev",
    FilterExpression: "#tid = :tid and #owner = :owner",
    ProjectionExpression: "#id, #name",
    ExpressionAttributeNames: {
        "#tid" : "tenantid",
        "#id" : "id",
        "#name" : "name",
        "#owner" : "owner"
    },
    ExpressionAttributeValues: {
        ":tid": tenantId,
        ":owner": owner
    }
};

请注意 "MyTable_Dev" ...理想情况下,我希望它像 "MyTable_" + {$opt.stage} ...或类似的东西。

In my source code (nodejs), i'm not sure how I'd reference a table specified in the yml file instead of hardcoding it.

我会将您的舞台放在您的 Lambda 函数可以访问的环境变量中。

在你的serverless.yml,

provider:
  ...
  environment:
    STAGE: {$opt:stage}

然后,在您的代码中,您可以通过 process.env.STAGE 访问它。

const tableName = 'MyTable_' + process.env.STAGE