在我的serverless.yml文件中,我指定了DynamoDB资源,以达到这种效果(请参见下文)。我想知道两件事:


为什么我看不到这些表不存在时被创建,迫使我自己手动输入AWS控制台?
在我的源代码(nodejs)中,我不确定如何引用yml文件中指定的表,而不是对其进行硬编码。


上面的两个问题汇总成一个单一的问题,那就是我希望能够在yml中指定表,然后在进行“部署”时为每个环境创建一个不同的表集。

即,如果我部署到“ --stage Prod”,则表将为“ MyTable_Prod”。如果我部署到“ --stage Dev”,那么表将是“ 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} ...或类似的东西。

最佳答案

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


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

在您的serverless.yml中,

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


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

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

07-24 09:39
查看更多