api-gateway-direct-dynamodb
v0.0.8
Published
High level construct of API Gateway direct integration with DynamoDB
Downloads
9
Readme
api-gateway-direct-dynamodb
Overview
This AWS CDK high level construct is built upon the aws-apigateway-dynamodb.
Besides provisioning an API Gateway with direction DynamoDB integration, this construct offers the added convenience of default templates for all four CRUD operations.
Installation
npm install -D api-gateway-direct-dynamodb
Usage
Create a new secret in AWS Secrets Manager whose text value will be the API Gateway's API key that all clients must supply via the HTTP header
x-api-key
. Note the name and value of the secret. In this example, it is assumed the secret in AWS Secrets Manager is arbitrarily namedMyTopSecretApiKey
and a string value of12345ABCDE12345ABCDE
.In your
Stack
definition, add this minimal deployable pattern definition:
import { RestApiDynamoDB, RestApiDynamoDBProps } from 'api-gateway-direct-dynamodb';
const props: RestApiDynamoDBProps = {
apiProps: {
// Name must be identical to name of secret in Secrets Manager.
apiKeySecretName: 'MyTopSecretApiKey',
createTemplate: { allow: true }, // Enable Create operation.
readTemplate: { allow: true }, // Enable Read operation.
updateTemplate: { allow: true }, // Enable Update operation.
deleteTemplate: { allow: true }, // Enable Delete operation.
},
// Arbitrary prefix when naming internal constructs.
namingPrefix: 'SolutionA',
tableProps: {
// Name of new DynamoDB table to be created.
tableName: 'EmployeesTable',
// List of attribute names in the JSON payload to be sent
// by clients for saving into the DynamoDB table.
otherStringAttribNames: ['username', 'gender', 'remarks'],
}
};
new RestApiDynamoDB(this, 'test-api-gateway-direct-dynamodb', props);
Default Settings
Once the the minimal pattern above has been deployed successfully, you may invoke the four CRUD endpoints using the format as shown by these examples:
CREATE
Sample request:
POST https://{api-id}.{region}.amazonaws.com/dev/
Content-Type: application/json
x-api-key: {value_of_the_secret_in_secrets_manager}
{
"username": "johnsmith",
"gender": "M",
"remarks": "Sits at level two of the corporate building."
}
Sample response:
{
"description": "OK!",
"id": "LsKqiFrZyQ0FTcw="
}
READ
Sample request:
GET https://{api-id}.{region}.amazonaws.com/dev/{item_id}
x-api-key: {value_of_the_secret_in_secrets_manager}
Sample response:
{
"Count": 1,
"Items": [
{
"createdDate": {
"S": "1697125512"
},
"username": {
"S": "johnsmith"
},
"ttlExpiry": {
"S": "1704901512"
},
"id": {
"S": "LsKqiFrZyQ0FTcw="
},
"updatedDate": {
"S": "1697125512"
},
"remarks": {
"S": "Sits at level two of the corporate building."
},
"gender": {
"S": "M"
}
}
],
"ScannedCount": 1
}
UPDATE
Sample request:
PUT https://{api-id}.{region}.amazonaws.com/dev/{item_id}
Content-Type: application/json
x-api-key: {value_of_the_secret_in_secrets_manager}
{
"remarks": "User has shifted to new building."
}
Sample response:
{
"Attributes": {
"createdDate": {
"S": "1697125512"
},
"username": {
"S": "johnsmith"
},
"id": {
"S": "LsKqiFrZyQ0FTcw="
},
"remarks": {
"S": "User has shifted to new building."
},
"ttlExpiry": {
"S": "1704901898"
},
"updatedDate": {
"S": "1697125898"
},
"gender": {
"S": "M"
}
}
}
DELETE
Sample request:
DELETE https://{api-id}.{region}.amazonaws.com/dev/{item_id}
x-api-key: {value_of_the_secret_in_secrets_manager}
Sample response:
{
"Attributes": {
"createdDate": {
"S": "1697125512"
},
"username": {
"S": "johnsmith"
},
"id": {
"S": "LsKqiFrZyQ0FTcw="
},
"remarks": {
"S": "User has shifted to new building."
},
"ttlExpiry": {
"S": "1704901898"
},
"updatedDate": {
"S": "1697125898"
},
"gender": {
"S": "M"
}
}
}