Created
January 28, 2020 16:45
-
-
Save nathanpeck/5fb0c6e036af7f2e471bbf7ded5fe1ee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import dynamoStore = require('dynamodb-datastore'); | |
import cdk = require('@aws-cdk/core'); | |
import lambda = require('@aws-cdk/aws-lambda'); | |
const app = new cdk.App(); | |
class MyStack extends cdk.Stack { | |
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { | |
super(scope, id, props); | |
this.datastore = new dynamoStore.DataStoreConstruct(this, 'my-datastore'); | |
this.datastore.addObjectType('User', { | |
indexes: [ | |
'id', | |
'username', | |
'email' | |
] | |
}); | |
this.userLamda = .Function(this, 'Singleton', { | |
code: new lambda.InlineCode(fs.readFileSync('lambda.js', { encoding: 'utf-8' })), | |
handler: 'index.handler', | |
timeout: cdk.Duration.seconds(300), | |
runtime: lambda.Runtime.JAVASCRIPT, | |
env: { | |
DATASTORE_TABLE_NAME: this.datastore.tableName | |
} | |
}); | |
// Helper method similar to the native CDK table.grantReadWriteData(iamRoleBearer) | |
// but aware of the object types, and generates the right IAM statements | |
this.datastore.grantReadWriteType('User').to(this.userLambda); | |
} | |
} | |
app.synth(); | |
// In my Lambda: | |
const dynamoStore = require('dynamodb-datastore'); | |
// Interface that exposes higher level methods that | |
// automatically generate DynamoDB queries with queries | |
// that use the right primary key prefix | |
myDatastore = new dynamoStore.DataStoreInterface({ | |
tableName: process.env.DATASTORE_TABLE_NAME | |
}) | |
exports.handler = async function(event, context) { | |
await myDatastore.writeObject({ | |
type: 'User', | |
object: { | |
id: 1, | |
username: 'foo', | |
email: '[email protected]' | |
} | |
} | |
let userFoundById = await myDatastore.findObject({ | |
type: 'User', | |
match: { | |
id: 1 | |
} | |
}); | |
let userFoundByUsername = await myDatastore.findObject({ | |
type: 'User', | |
match: { | |
username: 'foo' | |
} | |
}); | |
let userFoundByEmail = await myDatastore.findObject({ | |
type: 'User', | |
match: { | |
email: '[email protected]' | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment