AWS无服务器 - 自动创建DynamoDB

时间:2018-01-26 03:39:13

标签: node.js amazon-web-services lambda serverless

在我的serverless.yml文件中,我已经指定了一个DynamoDB资源,就此而言(见下文)。我想知道两件事:

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

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

  3. 上面的两个问题汇总成一个单一的问题,即我希望能够在yml中指定表格,然后在进行" deploy"时,有一个不同的问题每个环境创建的表集。

    即。如果我部署到" - stage Prod",那么表格将是" MyTable_Prod"。如果我部署到" - stage Dev&#34 ;,那么表格将是" 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
    

    我的可怕的硬编码样本'表名如下:

    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} ......或其他类似的东西。

1 个答案:

答案 0 :(得分:1)

  

在我的源代码(nodejs)中,我不确定我如何引用yml文件中指定的表而不是硬编码。

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

serverless.yml

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

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

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