{"componentChunkName":"component---src-gatsby-theme-chronoblog-templates-note-js","path":"/notes/dynamodb-sqs-docker-compose/","result":{"data":{"mdx":{"parent":{"__typename":"File","fields":{"gitLogLatestDate":"2026-06-13 01:48:00 +0200"}},"id":"bc0b5cd1-f3eb-54f3-9213-b4850936a357","excerpt":"Docker Compose facilitates spinning up local AWS-compatible services without an AWS account. This post covers DynamoDB Local for key-value…","frontmatter":{"title":"DynamoDB and SQS containers with Docker Compose","date":"2026-06-13 00:01:00 UTC","job_ad":null,"job_ad_id":null,"job_ad_url":null,"tags":["docker-compose","dynamodb","sqs","aws"],"cover":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAPoAAAD6AG1e1JrAAABKklEQVQoz32SjW6DMAyEef9X3KTCutJuYwQI+U/4JkLZCmtr6RTLis8+2wV3bJqm3/fWTykxTSum9fcGxZr0l7z6bJJmkpTiFYEYQy6wt2JLsicnJxlj6YRDrGgd1sQc/24czZfP0CpS8MRmTmMMxjg+Pwx1PXA5Sy5nhVIRpTTlQVAehoxOWIqq6jN73w00TYMQLaLV1CdFVXWca32VD6NMyCHi7MQ4SsZx/C9ZDh6jE94HnHN477A2osZI31uE0Fm2d4n6JDm+9Qx9QCmJlBLvE9aAs8vMn0qebS4wFwphWcKMEOK1Acv7seX1paMqJTHe2fIWS9UQfB5+Vfa8VT31SWNtyHHn5m4DxoTHHd7e3no2yxgCWgW0jqS43t5uho83vCe9fwV7VT+31hED4yfa7wAAAABJRU5ErkJggg==","aspectRatio":2.0869565217391304,"src":"/static/6d51c32c814f47ed32c3996c2c4faa04/c4ecb/cover.png","srcSet":"/static/6d51c32c814f47ed32c3996c2c4faa04/57ab0/cover.png 192w,\n/static/6d51c32c814f47ed32c3996c2c4faa04/f4739/cover.png 384w,\n/static/6d51c32c814f47ed32c3996c2c4faa04/c4ecb/cover.png 768w","srcWebp":"/static/6d51c32c814f47ed32c3996c2c4faa04/dd090/cover.webp","srcSetWebp":"/static/6d51c32c814f47ed32c3996c2c4faa04/ae504/cover.webp 192w,\n/static/6d51c32c814f47ed32c3996c2c4faa04/fef30/cover.webp 384w,\n/static/6d51c32c814f47ed32c3996c2c4faa04/dd090/cover.webp 768w","sizes":"(max-width: 768px) 100vw, 768px","presentationWidth":768,"presentationHeight":366},"resize":{"src":"/static/6d51c32c814f47ed32c3996c2c4faa04/c4ecb/cover.png"}}}},"fields":{"slug":"/notes/dynamodb-sqs-docker-compose/","readingTime":{"text":"2 min read"}},"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"DynamoDB and SQS containers with Docker Compose\",\n  \"date\": \"2026-06-13 00:01:00 UTC\",\n  \"cover\": \"./cover.png\",\n  \"tags\": [\"docker-compose\", \"dynamodb\", \"sqs\", \"aws\"],\n  \"canonical_url\": \"https://sevic.dev/notes/dynamodb-sqs-docker-compose/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Docker Compose facilitates spinning up local AWS-compatible services without an AWS account. This post covers DynamoDB Local for key-value storage and ElasticMQ for an SQS-compatible message queue. A common pattern is to persist state in DynamoDB and notify workers through SQS.\"), mdx(\"h3\", {\n    \"id\": \"prerequisites\"\n  }, \"Prerequisites\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Docker Compose installed\")), mdx(\"h3\", {\n    \"id\": \"configuration\"\n  }, \"Configuration\"), mdx(\"p\", null, \"The following configuration spins up DynamoDB Local, DynamoDB Admin, ElasticMQ, and the ElasticMQ UI.\"), mdx(\"p\", null, \"Connection details:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"DynamoDB endpoint: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"http://localhost:8000\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"SQS endpoint: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"http://localhost:9324\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"DynamoDB Admin: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"http://localhost:8001\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"ElasticMQ UI: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"http://localhost:3000\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Region: \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"us-east-1\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Credentials: any dummy values (for example \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"local\"), \" / \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"local\"), \")\")), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-yml\"\n  }), \"# docker-compose.yml\\nservices:\\n  dynamodb:\\n    image: amazon/dynamodb-local:latest\\n    user: root\\n    command: '-jar DynamoDBLocal.jar -sharedDb -dbPath /home/dynamodblocal/data'\\n    ports:\\n      - '8000:8000'\\n    volumes:\\n      - dynamodb_data:/home/dynamodblocal/data\\n\\n  dynamodb-admin:\\n    image: aaronshaf/dynamodb-admin:latest\\n    ports:\\n      - '8001:8001'\\n    environment:\\n      DYNAMO_ENDPOINT: http://dynamodb:8000\\n      AWS_REGION: us-east-1\\n      AWS_ACCESS_KEY_ID: local\\n      AWS_SECRET_ACCESS_KEY: local\\n    depends_on:\\n      - dynamodb\\n\\n  elasticmq:\\n    image: softwaremill/elasticmq-native:latest\\n    ports:\\n      - '9324:9324'\\n    volumes:\\n      - ./elasticmq.conf:/opt/elasticmq.conf\\n      - elasticmq_data:/data\\n\\n  elasticmq-ui:\\n    image: softwaremill/elasticmq-ui:latest\\n    ports:\\n      - '3000:3000'\\n    environment:\\n      SQS_ENDPOINT: http://elasticmq:9324\\n    depends_on:\\n      - elasticmq\\n\\nvolumes:\\n  dynamodb_data:\\n  elasticmq_data:\\n\")), mdx(\"p\", null, \"ElasticMQ loads queue definitions from an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"elasticmq.conf\"), \" file included in the demo.\"), mdx(\"p\", null, \"Run the following command to spin up the containers.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"docker compose up -d\\n\")), mdx(\"h3\", {\n    \"id\": \"disclaimer\"\n  }, \"Disclaimer\"), mdx(\"p\", null, \"ElasticMQ provides an SQS-compatible API, but it is not AWS SQS. DynamoDB Local also differs from managed DynamoDB (for example capacity modes, streams, TTL, and global tables). Use these containers for local development and integration tests, not as production substitutes.\"), mdx(\"h3\", {\n    \"id\": \"demo\"\n  }, \"Demo\"), mdx(\"p\", null, \"Docker Compose files and scripts for this post live in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"dynamodb-sqs-docker-compose\"), \" folder. Get access via \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/demos\"\n  }), \"code demos\"), \".\"));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"id":"bc0b5cd1-f3eb-54f3-9213-b4850936a357"}},"staticQueryHashes":["1961101537","2542493696"]}