I'm using Docker Compose for testing to replicate my AWS infrastructure which uses CloudFormation. My CloudFormation template create a FooBars
DynamoDB table and I want to do the same for my Docker Compose setup.
I add a DynamoDB Local service:
foobar-service-db:
image: amazon/dynamodb-local:latest
command: "-jar DynamoDBLocal.jar -inMemory"
ports: [8090:8000]
restart: always
When I run docker compose …
I can then use aws dynamodb create-table
to create a table using --endpoint-url http://localhost:8090
and --region dummy-region
. Great. I want to do that as part of Docker Compose, so I add this "service":
foobar-service-db-init:
depends_on:
- foobar-service-db
image: amazon/aws-cli
environment:
AWS_ACCESS_KEY_ID: dummy-key-id
AWS_SECRET_ACCESS_KEY: dummy-key
command: >-
dynamodb create-table
--table-name FooBars
--attribute-definitions
AttributeName=id,AttributeType=S
--key-schema
AttributeName=id,KeyType=HASH
--billing-mode PAY_PER_REQUEST
--endpoint-url http://foobar-service-db:8000 --region dummy-region
(Note that I have to indicate the container port instead of the host port, because the request is inside the Docker Compose network.)
I can see the output when Docker Compose
starts up, and it shows that a table with an ARN of arn:aws:dynamodb:ddblocal:000000000000:table/FooBars
was created. But when I try aws dynamodb list-tables --endpoint-url http://localhost:8090 --region dummy-region
from the command line, no tables are listed.
However on the command line I can create the table using aws dynamodb create-table … --endpoint-url http://localhost:8090 --region dummy-region
, which should be equivalent what foobar-service-db-init
is calling. This command also says is created a table with ARN arn:aws:dynamodb:ddblocal:000000000000:table/FooBars
was created. And if I run the same command again, it says "Cannot create preexisting table" as expected.
So foobar-service-db-init
inside Docker Compose seems to be creating the table somewhere else, where it doesn't show up when I make the request from the command line. But where else could it be creating it? There is only one DynamoDB Local service, foobar-service-db
!
(From the command line I'm using my actual AWS credentials. But that shouldn't make a difference. Surely DynamoDB Local doesn't have a separate namespace based on user identity—that's not how it works on AWS itself. The namespace is based on region, and I specify the same dummy-region
.)