in source/patterns/@aws-solutions-constructs/aws-lambda-dynamodb/lib/index.ts [91:154]
constructor(scope: Construct, id: string, props: LambdaToDynamoDBProps) {
super(scope, id);
defaults.CheckProps(props);
if (props.deployVpc || props.existingVpc) {
if (props.deployVpc && props.existingVpc) {
throw new Error("More than 1 VPC specified in the properties");
}
this.vpc = defaults.buildVpc(scope, {
defaultVpcProps: defaults.DefaultIsolatedVpcProps(),
existingVpc: props.existingVpc,
userVpcProps: props.vpcProps,
constructVpcProps: {
enableDnsHostnames: true,
enableDnsSupport: true,
},
});
defaults.AddAwsServiceEndpoint(scope, this.vpc, defaults.ServiceEndpointTypes.DYNAMODB);
}
this.lambdaFunction = defaults.buildLambdaFunction(this, {
existingLambdaObj: props.existingLambdaObj,
lambdaFunctionProps: props.lambdaFunctionProps,
vpc: this.vpc
});
this.dynamoTable = defaults.buildDynamoDBTable(this, {
dynamoTableProps: props.dynamoTableProps,
existingTableObj: props.existingTableObj
});
// Configure environment variables
const tableEnvironmentVariableName = props.tableEnvironmentVariableName || 'DDB_TABLE_NAME';
this.lambdaFunction.addEnvironment(tableEnvironmentVariableName, this.dynamoTable.tableName);
// Add the requested or default table permissions
if (props.tablePermissions) {
const _permissions = props.tablePermissions.toUpperCase();
if (_permissions === 'ALL') {
this.dynamoTable.grantFullAccess(this.lambdaFunction.grantPrincipal);
} else if (_permissions === 'READ') {
this.dynamoTable.grantReadData(this.lambdaFunction.grantPrincipal);
} else if (_permissions === 'READWRITE') {
this.dynamoTable.grantReadWriteData(this.lambdaFunction.grantPrincipal);
} else if (_permissions === 'WRITE') {
this.dynamoTable.grantWriteData(this.lambdaFunction.grantPrincipal);
}
} else {
this.dynamoTable.grantReadWriteData(this.lambdaFunction.grantPrincipal);
}
// Conditional metadata for cfn_nag
if (props.dynamoTableProps?.billingMode === dynamodb.BillingMode.PROVISIONED) {
defaults.addCfnSuppressRules(this.dynamoTable, [
{
id: "W73",
reason: `PROVISIONED billing mode is a default and is not explicitly applied as a setting.`,
},
]);
}
}