{"id":20285470,"url":"https://github.com/mramshaw/dynamodb","last_synced_at":"2025-08-26T15:14:21.861Z","repository":{"id":92905227,"uuid":"192760011","full_name":"mramshaw/DynamoDB","owner":"mramshaw","description":"DynamoDB configuration, testing, and billing alerts","archived":false,"fork":false,"pushed_at":"2019-08-02T01:31:54.000Z","size":762,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-14T08:12:12.997Z","etag":null,"topics":["auto-scaling","database","database-as-a-service","dbaas","dynamodb","serverless"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mramshaw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-19T15:34:09.000Z","updated_at":"2021-09-21T01:39:47.000Z","dependencies_parsed_at":"2023-06-15T03:45:44.712Z","dependency_job_id":null,"html_url":"https://github.com/mramshaw/DynamoDB","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mramshaw%2FDynamoDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mramshaw%2FDynamoDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mramshaw%2FDynamoDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mramshaw%2FDynamoDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mramshaw","download_url":"https://codeload.github.com/mramshaw/DynamoDB/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241780512,"owners_count":20019061,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["auto-scaling","database","database-as-a-service","dbaas","dynamodb","serverless"],"created_at":"2024-11-14T14:26:56.824Z","updated_at":"2025-03-04T04:09:56.162Z","avatar_url":"https://github.com/mramshaw.png","language":null,"readme":"# DynamoDB\n\n![AWS DynamoDB](images/Database_AmazonDynamoDB.png)\n\nHaving used AWS DynamoDB for [Alexa](http://github.com/mramshaw/Alexa-Stuff/tree/master/DynamoDB),\nit was time to investigate DynamoDB as a NoSQL database in its own right.\n\n## Contents\n\nThe contents are as follows:\n\n* [Motivation](#motivation)\n    * [DBaaS](#dbaas)\n    * [Auto-scaling](#auto-scaling)\n    * [Global Tables](#global-tables)\n    * [Indexes](#indexes)\n    * [Eventually Consistent](#eventually-consistent)\n    * [Advanced query capabilities](#advanced-query-capabilities)\n    * [Ease of use](#ease-of-use)\n* [Alternatives](#alternatives)\n    * [AWS](#aws)\n    * [Third-Party](#third-party)\n* [Performance](#performance)\n* [Costs](#costs)\n    * [Capacity](#capacity)\n    * [Reserved Capacity](#reserved-capacity)\n* [DDL](#ddl)\n* [Horror Stories](#horror-stories)\n* [Offline use](#offline-use)\n    * [Docker Tags](#docker-tags)\n* [Security](#security)\n    * [Web Identity Federation](#web-identity-federation)\n* [Reference](#reference)\n    * [Serverless](#serverless)\n    * [Tracking Your Free Tier Usage](#tracking-your-free-tier-usage)\n    * [DynamoDB and Indexes](#dynamodb-and-indexes)\n    * [DynamoDB and \"document not found\"](#dynamodb-and-document-not-found)\n    * [Modifying Data in a Table](#modifying-data-in-a-table)\n    * [DynamoDB Accelerator](#dynamodb-accelerator)\n    * [AWS Billing and Cost Management](#aws-billing-and-cost-management)\n    * [AWS Simple Monthly Calculator](#aws-simple-monthly-calculator)\n    * [Billing alarm](#billing-alarm)\n    * [Local usage](#local-usage)\n* [To Do](#to-do)\n\n## Motivation\n\nI will be examining DynamoDB for use in ___serverless architectures___ as a replacement for\n[MongoDB](http://www.mongodb.com/).\n\n#### DBaaS\n\nSpecifically, I will be examining DynamoDB (and alternatives) for __Database as a Service (DBaaS)__ capabilities.\n\n[A principal component of serverless architectures is the ability to outsource the bulk of database operations.]\n\nIn particular, the ability to scale and maintain NoSQL databases at enterprise levels can involve substantial time\nand costs.\n\nDBaaS is generally a premium cloud offering and can get expensive quickly. Even so, it's still probably far less\nexpensive than managing an on-premises database. The choice of cloud provider is important as egress charges tend\nto be prohibitive (MongoDB Atlas can use any of the major cloud providers).\n\nDBaaS is supposed to be a cost-effective way to handle bursty traffic where volumes are unknown. The classic\nexample is getting a mention on SlashDot or HackerNoon that generates flash crowds - usually there is not enough\ncapacity to handle the load and the servers fall over. Or to use a more recent success story, consider\n[Pokemon Go](http://www.techrepublic.com/article/pokemon-go-how-the-cloud-saved-the-smash-hit-game-from-collapse/)\nwhere initial traffic estimates were quickly exceeded by astronomical demand.\n\n#### Auto-scaling\n\nDynamoDB auto-scaling is relatively simple but probably does not extend across AWS regions.\n\nBy default, auto-scaling is not enabled - but once auto-scaling is enabled, it becomes the default.\n\nIt is simple to create an auto-scaling IAM role from the DynamoDB __Capacity__ tab.\n\n[This role cannot then be deleted until it is no longer referenced - in other words, all auto-scaling is disabled.]\n\n__TL;DR__ Don't enable auto-scaling until you actually need it; it will be in permanent ___Alarm___ state otherwise.\n\n#### Global Tables\n\nAWS offers [Global Tables](http://aws.amazon.com/dynamodb/global-tables/) for replication across regions.\n\n[This is a premium service, and may well be overkill for most use cases.]\n\n#### Indexes\n\nDynamoDB does not have a query optimizer. For some tips, refer to [DynamoDB and Indexes](#dynamodb-and-indexes).\n\n#### Eventually Consistent\n\nAlthough NoSQL databases can offer transaction guarantees, most are geared more towards Eventual Consistency.\n\nSo it is little surprise that DynamoDB is ___Eventually Consistent___.\n\n[This is the default; Strong Consistency options are available (probably at a premium).]\n\n#### Advanced query capabilities\n\nTo the extent that they are needed, Advanced query capabilities (text search, JSON parsing) are nice to have.\n\nOf course, for more complicated use cases GraphQL is an option, but this is to be avoided if at all possible.\n\nThere is no clear winner in terms of querying - MongoDB queries are not particularly intuitive, which is\nperhaps why they have [MongoDB Connector for BI](http://www.mongodb.com/products/bi-connector) - which\nallows for standard SQL queries. CouchBase has N1QL (which seems simple enough). And for another standard\nSQL option, there is [Amazon Athena](http://aws.amazon.com/athena/) - which may well be a very good choice\nfor a [CQRS](http://en.wikipedia.org/wiki/CQRS)-type solution (for a Google Cloud alternative to Amazon\nAthena there is [BigQuery](http://cloud.google.com/bigquery/)).\n\n#### Ease of use\n\nConsistent with usage and query requirements, it should as simple as possible to use and manage.\n\n[DynamoDB is simple to set up and administrate, although the IAM aspects can be tricky.]\n\n## Alternatives\n\nThe following is a quick list of alternatives to DynamoDB.\n\nSome notes will be listed, otherwise how to evaluate DynamoDB against the alternatives?\n\n[It will be assumed that what is required is a JSON-friendly NoSQL DBaaS that can auto-scale.]\n\nWikipedia has a good (if slightly out-of-date) summary of the alternatives: http://en.wikipedia.org/wiki/DBaaS\n\n\u003e NoSQL databases are built to service heavy read/write loads and can scale up and down easily\n\n[The article makes no mention of either AWS DocumentDB or Azure DocumentDB.]\n\n#### AWS\n\n[Amazon DocumentDB](http://aws.amazon.com/documentdb/)\n\n* Seems to have been designed as a drop-in replacement for MongoDB\n* Apparently runs on Aurora PostgreSQL under the covers\n* Does not support all [MongoDB data types](http://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis-data-types.html)\n* Probably overkill for simple use cases\n* Probably not a good choice for greenfield applications\n* Apparently has the same price structure as MongoDB Atlas\n* Requires a VPC (additional costs \u0026 doesn't help with Lambda cold starts, possibly leading to high tail-latencies)\n\n[Amazon Athena](http://aws.amazon.com/athena/)\n\n* Uses S3 as a backing store\n* Supports CSV, JSON, ORC, Avro, and Parquet\n* Uses standard SQL (so good integration with traditional analysis tools)\n* Based on Facebook Presto\n\n#### Third-Party\n\n[MongoDB Atlas](http://docs.atlas.mongodb.com/getting-started/)\n\n* Offers a choice of cloud providers (AWS, Azure, GCP)\n* Has a query optimizer (indexes are preferred), can be overridden with [$hint](http://docs.mongodb.com/manual/tutorial/optimize-query-performance-with-indexes-and-projections/#use-hint-to-select-a-particular-index)\n* Widest choice of supported programming languages\n* A relatively old and mature offering, so offers good third-party tools\n* Seems to offer global clusters which pair well with [GCP's global VPCs](http://cloud.google.com/vpc/)\n* Offers the widest JSON support (including BSON)\n* Uses [JSON query syntax](http://docs.mongodb.com/manual/reference/operator/)\n* Offers [MongoDB Connector for BI](http://www.mongodb.com/products/bi-connector) which allows for standard SQL queries\n* Has a free tier (which offers a ___subset___ of Atlas features) which doesn't require a credit card\n* Seems to be playing catch-up with AWS and Azure (both of which have competing offerings)\n* Scaleable, both horizontally and vertically\n* Apparently has the same price structure as AWS DocumentDB\n\nThe following article offers a good overview of MongoDB cluster options:\n\n    http://docs.atlas.mongodb.com/create-new-cluster/\n\nSome quotes follow.\n\n\u003e Electable nodes for high availability\n\n[HA is nice.]\n\n\u003e Read-only nodes for optimal local reads\n\n[They cannot take part in elections and cannot be used for replication, but possibly a nice option.]\n\n\u003e __Auto-Expand Storage__: Available on clusters of size M10 and larger. When disk usage reaches\n\u003e 90%, automatically increase storage by an amount necessary to achieve 70% utilization. To enable\n\u003e this feature, check the box marked __Auto-expand storage when disk usage reaches 90%__.\n\u003e\n\u003e Changes to storage capacity affect [cost](http://docs.atlas.mongodb.com/billing/#instance-size-costs).\n\n[Functional auto-scale but only at the enterprise (M10 and larger, not free) level.]\n\n\u003e __IOPS__ (configurable for AWS only)\n\nThe initial configuration is not cast in stone either; it's possible to modify just about everything\nafter the fact (including scaling-up the cluster). For a list of what can be modified after the fact:\n\n    http://docs.atlas.mongodb.com/scale-cluster/\n\nThis article largely restates the initial article, however some interesting quotes follow:\n\n\u003e You can only modify the cloud provider backing your cluster\n\u003e when you upgrade from an Atlas __M0__ Free Tier or __M2/M5__\n\u003e Shared Tier cluster to a larger cluster.\n\nAnd:\n\n\u003e You cannot modify the cloud provider of __M10__ or larger\n\u003e dedicated clusters.\n\n[You can, however, create a new cluster and do a ___live migration___ to a different cloud provider\n (possibly expensive, but probably still very useful). Expect to pay ___egress charges___.]\n\nAnd:\n\n\u003e For dedicated clusters with an __Instance Size__ of __M10__ or larger,\n\u003e you can modify cluster’s region.\n\n[These are all pretty attractive options.]\n\n[Azure Cosmos DB](http://azure.microsoft.com/en-us/services/cosmos-db/)\n\n* Apparently rebranded from Azure DocumentDB in 2017\n\n[I am unfamiliar with Azure so I won't be examining this product.]\n\n[CouchBase](http://www.couchbase.com/)\n\n* Seems to have better scaling and replication options\n* Probably more JSON-friendly than its competitors (apart from MongoDB)\n* Has its own query language (N1QL)\n* Not really DBaaS\n\n[Check out my [Couchbase repo](http://github.com/mramshaw/RESTful-Couchbase).]\n\n## Performance\n\n![AWS DynamoDB Accelerator (DAX)](images/Database_AmazonDynamoDBAccelerator.png)\n\nIf performance becomes an issue, it is always possible to add a caching layer with\n[Amazon DynamoDB Accelerator (DAX)](http://aws.amazon.com/dynamodb/dax/).\n\n[DAX went GA in June, 2017.]\n\n## Costs\n\nDynamoDB has a handy cost calculator, which is tied to DynamoDB Capacity.\n\nIt is accessible via the DynamoDB ___Capacity___ tab.\n\nFor more precise estimates, there is the ___Capacity calculator___ (available via a link).\n\nAnd for the ultimate in precision, there is the [AWS Simple Monthly Calculator](#aws-simple-monthly-calculator).\n\n#### Capacity\n\nDynamoDB has sensible default values. These can be easily modified after the fact:\n\n![Capacity](images/Capacity.png)\n\nNote the following:\n\n\u003e Select on-demand if you want to pay only for the read and writes you perform, with no capacity planning required.\n\n\u003e Select provisioned to save on throughput costs if you can reliably estimate your application's throughput requirements.\n\n\u003e You can update to on-demand mode at any time.\n\n[Switching to On-demand capacity can take 5 minutes or so. But switching back to Provisioned is nearly instantaneous.]\n\n![On-demand capacity](images/On-demand_capacity.png)\n\nNota bene:\n\n* Changes to On-demand capacity are limited\n* Auto-scaling is not an option if On-demand capacity is selected\n\n#### Reserved Capacity\n\nOnce production volumes have become established (after a few months running in production perhaps),\nit is possible to reserve DynamoDB capacity. This is a moderately long-term commitment (one or three\nyears) but offers discounts. The capacity to reserve should be based upon the expected usage. The cost\nfactor will play into this calculation of course; the higher the capacity reserved, the greater the\ncost savings.\n\n![Reserved Capacity](images/Reserved_Capacity.png)\n\n[Costs can apparently be expected to continue to go down, so the one year option is the term to choose.]\n\n## DDL\n\nRather annoyingly, there is no way to export DynamoDB configurations/definitions.\n\nPerhaps DDL (Data Definition Language) is not the correct term for this, as NoSQL databases are ___schema-less___,\nbut for replicating (say perhaps in different regions or for [offline testing](#offline-use)) or re-creating\na database (NoSQL or not) it is useful to have a backup copy of the database definition (if only to be\nable to check it into a Git repo).\n\nThis is a pretty minor complaint, as it takes five minutes or so to create a DynamoDB table,\nhowever it can get a little tedious setting up the same DynamoDB table in multiple regions so\nnot having a backup or definitive copy of the table configuration is a bit of an issue.\n\nProbably the best option is to take a screenshot of the table overview once it has been defined:\n\n![DynamoDB Configuration](images/DynamoDB_config.png)\n\n[This should enable an easy re-creation of the table, if it ever got accidentally deleted or something.]\n\n## Horror Stories\n\nIt's pretty easy to find examples where a DynamoDB project failed. Lots of projects fail, for any\nnumber of reasons, so this is hardly surprising. However it's worth looking into these stories, if only\nto find examples of things to NOT do. The following article gives a good explanation of the ___hot key___\nproblem - which seems to be a common problem with DynamoDB:\n\n    http://syslog.ravelin.com/you-probably-shouldnt-use-dynamodb-89143c1287ca\n\nThere are work-arounds for hot keys ([DAX](#dynamodb-accelerator) should fix this problem) but the key\ntakeaway should be that the ease and simplicity of using DynamoDB comes at a cost - that of visibility\ninto DynamoDB internals.\n\n## Offline use\n\nDynamoDB is available for [local use](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html).\n\n[This may well be coupled with AWS CloudFormation (which can run locally) or [LocalStack](http://github.com/localstack/localstack).]\n\nProbably the best option is to use the [Dockerized version](http://hub.docker.com/r/amazon/dynamodb-local):\n\n```bash\n$ docker run -p 8000:8000 amazon/dynamodb-local\n```\n\nUsage notes:\n\n    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html\n\n#### Docker Tags\n\nYou can find the Docker tags [here](http://hub.docker.com/r/amazon/dynamodb-local/tags).\n\nThe example shown above really defaults to:\n\n```bash\n$ docker run -p 8000:8000 amazon/dynamodb-local:latest\n```\n\nAnd a better option is to use a tagged version as follows:\n\n```bash\n$ docker run -p 8000:8000 amazon/dynamodb-local:tag\n```\n\n## Security\n\nMy approach to security involves the [Principle of least privilege](http://en.wikipedia.org/wiki/Principle_of_least_privilege).\n\nAccordingly, it's better to allocate 'YourTableName' manually rather than give Create permission.\n\nFor online use, restrict access as follows:\n\n\t{\n\t  \"Version\": \"2012-10-17\",\n\t  \"Statement\": [\n\t    {\n\t      \"Effect\": \"Allow\",\n\t      \"Action\": [\n\t        \"dynamodb:PutItem\",\n\t        \"dynamodb:GetItem\"\n\t      ],\n\t      \"Resource\":[\"arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/YourTableName\"],\n\t    }\n\t  ]\n\t}\n\nThe example above is fine for [Alexa skills](http://github.com/mramshaw/Alexa-Stuff/tree/master/DynamoDB#permissions)\nbut for a CRUD something like the following is more appropriate:\n\n\t{\n\t  \"Version\": \"2012-10-17\",\n\t  \"Statement\": [\n\t    {\n\t      \"Effect\": \"Allow\",\n          \"Action\": [\n            \"dynamodb:DeleteItem\",\n            \"dynamodb:GetItem\",\n            \"dynamodb:PutItem\",\n            \"dynamodb:Scan\",\n            \"dynamodb:UpdateItem\"\n          ],\n\t      \"Resource\":[\"arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/YourTableName\"],\n\t    }\n\t  ]\n\t}\n\nYou may wish to include `dynamodb:Query` in your access list - or even have `dynamodb:Query` only:\n\n\t{\n\t  \"Version\": \"2012-10-17\",\n\t  \"Statement\": [\n\t    {\n\t      \"Effect\": \"Allow\",\n\t      \"Action\": [\n            \"dynamodb:Query\"\n\t      ],\n\t      \"Resource\":[\"arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/YourTableName\"],\n\t    }\n\t  ]\n\t}\n\n__TL;DR__ Use an inline policy for DynamoDB unless you are anticipating reuse. Likewise, restrict DynamoDB access\nto the needed table or tables - it's not just a ___best practice___, it will probably help with GDPR compliance.\n\n#### Web Identity Federation\n\nDynamoDB offers [Web Identity Federation](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WIF.html).\n\n[Current identity providers are Amazon, Facebook and Google.]\n\n## Reference\n\nAs always with the cloud, documentation is voluminous. Some useful links are listed below.\n\n#### Serverless\n\nFor a quick (and largely provider-agnostic) summary of Serverless, the MongoDB Stitch\n[FAQ](http://www.mongodb.com/cloud/stitch/faq) provides this:\n\n\u003e Stitch represents the next stage in the industry's migration to a more streamlined, managed infrastructure. Virtual\n\u003e Machines running in public clouds (notably AWS EC2) led the way, followed by hosted containers, and serverless offerings\n\u003e such as AWS Lambda and Google Cloud Functions. With serverless systems, you don't need to pre-provision computing\n\u003e resources – you just send requests and rely on the provider to handle them.\n\u003e\n\u003e Existing serverless offerings (sometimes referred to as \"Functions as a Service\") still require backend developers to\n\u003e implement and manage access controls and REST APIs to provide access to microservices, public cloud services, and of\n\u003e course data.\n\n[MongoDB Stitch seems to be javascript-only. Also \"You pay for both data transfer and compute usage (memory x time).\"\n although there is a free tier. It does seem to have good developer tooling.]\n\n#### Tracking Your Free Tier Usage\n\nTracking Your Free Tier Usage:\n\n    http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/tracking-free-tier-usage.html\n\n#### DynamoDB and Indexes\n\nQuerying and Scanning an Index:\n\n    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.Indexes.QueryAndScan.html\n\n[Shows how to specify an index, also how to use a __ProjectionExpression__ (basically, _subset_ the query results).]\n\n#### DynamoDB and \"document not found\"\n\nSome databases will return an error if the document being modified or deleted does not exist.\n\nLikewise if the document being created already exists.\n\nNot so DynamoDB.\n\nA case in point: `putItem` - this functions as an ___upsert___ - meaning it will update the document in question\nif it exists or it will create it if it does not yet exist. This may be _helpful_ but it is not _RESTful_.\n\n__TL;DR__ It is necessary to check for the presence (or absence) of the document in question in DynamoDB to avoid surprises.\n\n#### Modifying Data in a Table\n\nHow to update a DynamoDB item:\n\n    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html\n\n[Also shows how to use ___atomic counters___.]\n\nReturnValues:\n\nUse `ReturnValues` if you want to get the item attributes as they appear before or after they are updated. For `UpdateItem`, the valid values are:\n\n* `NONE` - If `ReturnValues` is not specified, or if its value is `NONE`, then nothing is returned. (This setting is the default for `ReturnValues`.)\n* `ALL_OLD` - Returns all of the attributes of the item, as they appeared before the UpdateItem operation.\n* `UPDATED_OLD` - Returns only the updated attributes, as they appeared before the UpdateItem operation.\n* `ALL_NEW` - Returns all of the attributes of the item, as they appear after the UpdateItem operation.\n* `UPDATED_NEW` - Returns only the updated attributes, as they appear after the UpdateItem operation.\n\n[Note that unchanged values will be considered to be UPDATED if they were specified in the `UpdateExpression`.]\n\nFrom:\n\n    http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html\n\n#### DynamoDB Accelerator\n\nDAX as a drop-in accelerator for DynamoDB:\n\n    http://www.allthingsdistributed.com/2017/06/amazon-dynamodb-accelerator-dax.html\n\n\u003e With DAX, we've created a fully managed caching service that is API-compatible with DynamoDB.\n\nAnd:\n\n\u003e With DAX, you get faster reads, more throughput, and cost savings - without having to write any new code.\n\n#### AWS Billing and Cost Management\n\nWhat Is AWS Billing and Cost Management?:\n\n    http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-what-is.html\n\n#### AWS Simple Monthly Calculator\n\nSimple Monthly Calculator:\n\n    http://calculator.s3.amazonaws.com/index.html\n\n[Click the __Amazon DynamoDB__ tab in the column on the right-hand side.]\n\n\u003e FREE TIER: Each month, Amazon DynamoDB users pay no charges on the first 25GB of storage,\n\u003e the first 2.5 million DynamoDB Streams read request units, as well as 25 write capacity unit\n\u003e and 25 read capacity units of provisioned capacity. Free tier also provides 25 replicated\n\u003e write capacity units to deploy DynamoDB Global Tables in up to 2 AWS regions.\n\n#### Billing Alarm\n\nBilling alarm:\n\n    http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html\n\n\u003e You must be signed in using AWS account root user credentials; IAM users cannot enable billing alerts for your AWS account.\n\n#### Local usage\n\nLocal usage notes:\n\n    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html\n\n## To Do\n\n- [x] Investigate MongoDB DBaaS offering (Atlas)\n- [x] Investigate MongoDB Atlas free tier\n- [ ] Investigate DynamoDB data residency (in terms of regions)\n- [x] Investigate DynamoDB Capacity, Reserved Capacity, and Cost Calculator\n- [x] Investigate backing-up DynamoDB configuration\n- [x] Investigate DynamoDB indexing\n- [x] Investigate DynamoDB DML (updateItem, etc)\n- [ ] Test DynamoDB Accelerator (DAX)\n- [ ] Investigate Google's offerings ([Cloud Firestore](http://cloud.google.com/firestore/) and [Cloud Bigtable](http://cloud.google.com/bigtable/))\n- [ ] Investigate [AWS Athena](http://aws.amazon.com/athena/)\n- [ ] Investigate [BigQuery](http://cloud.google.com/bigquery/) (Google Cloud alternative to AWS Athena)\n- [ ] Investigate DynamoDB offline use\n- [ ] Investigate [AWS Cost Explorer](http://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/ce-enable.html)\n- [ ] Investigate AWS Budgets (budgeting, cost allocation tags, alerts, consolidated billing)\n- [ ] Investigate AWS billing alerts\n- [x] Investigate AWS current IAM and RBAC\n- [x] Verify if the access permissions shown above are still current (yes, as of July 2019)\n- [ ] Investigate [Web Identity Federation](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WIF.html)\n- [x] Investigate DynamoDB auto-scaling\n- [ ] Test DynamoDB [Global Tables](http://aws.amazon.com/dynamodb/global-tables/)\n- [ ] Investigate exporting DDL for DynamoDB alternatives\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmramshaw%2Fdynamodb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmramshaw%2Fdynamodb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmramshaw%2Fdynamodb/lists"}