AWS 无服务器 - 自动创建 DynamoDB
AWS Serverless - Auto Create DynamoDB
在我的 serverless.yml 文件中,我指定了一个 DynamoDB 资源,具有这种效果(见下文)。我想知道两件事:
为什么我没有看到这些 table 在它们不存在时被创建,迫使我手动进入 AWS 控制台并自己这样做?
在我的源代码 (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
在我的 serverless.yml 文件中,我指定了一个 DynamoDB 资源,具有这种效果(见下文)。我想知道两件事:
为什么我没有看到这些 table 在它们不存在时被创建,迫使我手动进入 AWS 控制台并自己这样做?
在我的源代码 (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