【问题标题】:AWS Serverless - Auto Create DynamoDBAWS 无服务器 - 自动创建 DynamoDB
【发布时间】:2018-01-26 21:25:07
【问题描述】:

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

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

  2. 在我的源代码 (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} ...或类似的东西。

【问题讨论】:

  • 我不明白为什么没有创建您的 DynamoDB 表。 sls deploy 会出错吗?或者,它是否成功完成并创建除了 dynamodb 表之外的所有内容?

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


【解决方案1】:

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

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

在你的serverless.yml

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2022-12-06
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多