Skip to content

Instantly share code, notes, and snippets.

@zhammer
Last active November 15, 2021 21:33
Show Gist options
  • Save zhammer/6f95a75a8f5059f7d6d2624449ca296d to your computer and use it in GitHub Desktop.
Save zhammer/6f95a75a8f5059f7d6d2624449ca296d to your computer and use it in GitHub Desktop.
localstack aws v2 dynamodb bug recreation and logs

localstack aws-sdk-go-v2 dynamodb bug

there may be a bug with managing dynamodb tables in localstack using aws-sdk-go-v2. my team stumbled upon this while migrating an application from aws-sdk-go v1 to v2.

reproduce

to reproduce this locally, run docker compose up to spin up localstack, then run go run main.go (either in a separate terminal, or in the same if docker compose is run in the background.)

main.go

  1. connects to localstack (success)
  2. creates a table "my-table" (success)
  3. scans the table (success)
  4. attempts to delete the table (fails)

when attempting to deleted the created table, localstack returns: {"message": "Cannot do operations on a non-existent table", "__type": "com.amazonaws.dynamodb.v20120810#ResourceNotFoundException"}

if we run go run main.go again, localstack throws an error when we attempt to create the table {"__type":"com.amazonaws.dynamodb.v20120810#ResourceInUseException","Message":"Cannot create preexisting table"}. a stacktrace is logged by localstack to console, which i've attached to this gist.

version: "3"
services:
localstack:
image: localstack/localstack:2021-11-15
ports:
- 4566:4566
SDK 2021/11/15 16:19:38 DEBUG Request
POST / HTTP/1.1
Host: localhost:4566
User-Agent: aws-sdk-go-v2/1.11.0 os/macos lang/go/1.17.2 md/GOOS/darwin md/GOARCH/amd64 api/dynamodb/1.8.0
Content-Length: 219
Accept-Encoding: identity
Amz-Sdk-Invocation-Id: 084661f7-f6e5-4043-ae53-f8c7788018a5
Amz-Sdk-Request: attempt=1; max=3
Authorization: AWS4-HMAC-SHA256 Credential=foobar/20211115//dynamodb/aws4_request, SignedHeaders=accept-encoding;amz-sdk-invocation-id;amz-sdk-request;content-length;content-type;host;x-amz-date;x-amz-target, Signature=b267de4f4a54711bb41e6b8b26bc214f043cdbcd2a627b048eec6af61f64e091
Content-Type: application/x-amz-json-1.0
X-Amz-Date: 20211115T211938Z
X-Amz-Target: DynamoDB_20120810.CreateTable
{"AttributeDefinitions":[{"AttributeName":"id","AttributeType":"S"}],"KeySchema":[{"AttributeName":"id","KeyType":"HASH"}],"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableName":"my-table"}
SDK 2021/11/15 16:19:41 DEBUG Response
HTTP/1.1 200
Connection: close
Content-Length: 476
Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request
Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: etag,x-amz-version-id
Content-Type: application/x-amz-json-1.0
Date: Mon, 15 Nov 2021 21:19:41 GMT
Server: hypercorn-h11
X-Amz-Crc32: 167133302
X-Amzn-Requestid: 64d3eb7b-ffd8-4f71-970b-50a1d26697ee
{"TableDescription": {"AttributeDefinitions": [{"AttributeName": "id", "AttributeType": "S"}], "TableName": "my-table", "KeySchema": [{"AttributeName": "id", "KeyType": "HASH"}], "TableStatus": "ACTIVE", "CreationDateTime": 1637011181.503, "ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 10}, "TableSizeBytes": 0, "ItemCount": 0, "TableArn": "arn:aws:dynamodb:us-east-1:000000000000:table/my-table", "TableId": "ae9fae27-3963-4f84-b0dc-2009d33537af"}}
SDK 2021/11/15 16:19:41 DEBUG Request
POST / HTTP/1.1
Host: localhost:4566
User-Agent: aws-sdk-go-v2/1.11.0 os/macos lang/go/1.17.2 md/GOOS/darwin md/GOARCH/amd64 api/dynamodb/1.8.0
Content-Length: 24
Accept-Encoding: identity
Amz-Sdk-Invocation-Id: 8f468f8b-c5fd-4666-b522-00cde7b94290
Amz-Sdk-Request: attempt=1; max=3
Authorization: AWS4-HMAC-SHA256 Credential=foobar/20211115//dynamodb/aws4_request, SignedHeaders=accept-encoding;amz-sdk-invocation-id;amz-sdk-request;content-length;content-type;host;x-amz-date;x-amz-target, Signature=b1dac4b5f237a3a3b9f28e1c400f8f54713320d6defd9c5b6ca141ab8b39780e
Content-Type: application/x-amz-json-1.0
X-Amz-Date: 20211115T211941Z
X-Amz-Target: DynamoDB_20120810.Scan
{"TableName":"my-table"}
SDK 2021/11/15 16:19:41 DEBUG Response
HTTP/1.1 200
Connection: close
Content-Length: 39
Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request
Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: etag,x-amz-version-id
Content-Type: application/x-amz-json-1.0
Date: Mon, 15 Nov 2021 21:19:41 GMT
Server: hypercorn-h11
X-Amz-Crc32: 583912891
X-Amzn-Requestid: 71c1d4f7-b57d-40d5-a2f4-fe462b80e6b3
{"Items":[],"Count":0,"ScannedCount":0}
2021/11/15 16:19:41 scanned table: &{ConsumedCapacity:<nil> Count:0 Items:[] LastEvaluatedKey:map[] ScannedCount:0 ResultMetadata:{values:map[{}:-572848000 {}:0xc000240060 {}:71c1d4f7-b57d-40d5-a2f4-fe462b80e6b3 {}:{wall:13861184218436269952 ext:3129368444 loc:0x16363c0} {}:{wall:0 ext:63772607981 loc:<nil>} {}:{Results:[{Err:<nil> Retryable:false Retried:false ResponseMetadata:{values:map[{}:-572848000 {}:0xc000240060 {}:71c1d4f7-b57d-40d5-a2f4-fe462b80e6b3 {}:{wall:13861184218436269952 ext:3129368444 loc:0x16363c0} {}:{wall:0 ext:63772607981 loc:<nil>}]}}]}]} noSmithyDocumentSerde:{}}
SDK 2021/11/15 16:19:41 DEBUG Request
POST / HTTP/1.1
Host: localhost:4566
User-Agent: aws-sdk-go-v2/1.11.0 os/macos lang/go/1.17.2 md/GOOS/darwin md/GOARCH/amd64 api/dynamodb/1.8.0
Content-Length: 24
Accept-Encoding: identity
Amz-Sdk-Invocation-Id: 4beeec19-6b1b-46ae-8646-3b469f2e2c20
Amz-Sdk-Request: attempt=1; max=3
Authorization: AWS4-HMAC-SHA256 Credential=foobar/20211115//dynamodb/aws4_request, SignedHeaders=accept-encoding;amz-sdk-invocation-id;amz-sdk-request;content-length;content-type;host;x-amz-date;x-amz-target, Signature=899c8f547eb72980fbd9a2f21f0ca3c5be80c99f0e2f31adcf9eb5e8ff9fbfb9
Content-Type: application/x-amz-json-1.0
X-Amz-Date: 20211115T211941Z
X-Amz-Target: DynamoDB_20120810.DeleteTable
{"TableName":"my-table"}
SDK 2021/11/15 16:19:41 DEBUG Response
HTTP/1.1 400
Connection: close
Content-Length: 131
Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request
Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: etag,x-amz-version-id
Content-Type: text/html; charset=utf-8
Date: Mon, 15 Nov 2021 21:19:41 GMT
Server: hypercorn-h11
X-Amz-Crc32: 1844303718
{"message": "Cannot do operations on a non-existent table", "__type": "com.amazonaws.dynamodb.v20120810#ResourceNotFoundException"}
2021/11/15 16:19:41 error deleting table: operation error DynamoDB: DeleteTable, https response error StatusCode: 400, RequestID: , ResourceNotFoundException: Cannot do operations on a non-existent table
exit status 1
SDK 2021/11/15 16:22:08 DEBUG Request
POST / HTTP/1.1
Host: localhost:4566
User-Agent: aws-sdk-go-v2/1.11.0 os/macos lang/go/1.17.2 md/GOOS/darwin md/GOARCH/amd64 api/dynamodb/1.8.0
Content-Length: 219
Accept-Encoding: identity
Amz-Sdk-Invocation-Id: edd944a7-c470-4857-b38b-b89803f348f7
Amz-Sdk-Request: attempt=1; max=3
Authorization: AWS4-HMAC-SHA256 Credential=foobar/20211115//dynamodb/aws4_request, SignedHeaders=accept-encoding;amz-sdk-invocation-id;amz-sdk-request;content-length;content-type;host;x-amz-date;x-amz-target, Signature=8be5c9bc98a28de2b7c42be6bb0ec0fab1bc6f9ebe755b2272b17c83fb20878f
Content-Type: application/x-amz-json-1.0
X-Amz-Date: 20211115T212208Z
X-Amz-Target: DynamoDB_20120810.CreateTable
{"AttributeDefinitions":[{"AttributeName":"id","AttributeType":"S"}],"KeySchema":[{"AttributeName":"id","KeyType":"HASH"}],"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableName":"my-table"}
SDK 2021/11/15 16:22:08 DEBUG Response
HTTP/1.1 400
Connection: close
Content-Length: 112
Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request
Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: etag,x-amz-version-id
Content-Type: application/x-amz-json-1.0
Date: Mon, 15 Nov 2021 21:22:08 GMT
Server: hypercorn-h11
X-Amz-Crc32: 1756396488
X-Amzn-Requestid: d2a9dff8-fa9d-4d6e-b464-150c5675c320
{"__type":"com.amazonaws.dynamodb.v20120810#ResourceInUseException","Message":"Cannot create preexisting table"}
2021/11/15 16:22:08 error creating table: operation error DynamoDB: CreateTable, https response error StatusCode: 400, RequestID: d2a9dff8-fa9d-4d6e-b464-150c5675c320, ResourceInUseException:
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: 21:22:08.837 [qtp1406253491-19] WARN com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBServerHandler - DynamoDBLocalServiceException exception occured
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: com.amazonaws.services.dynamodbv2.exceptions.DynamoDBLocalServiceException: Cannot create preexisting table
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.exceptions.AWSExceptionFactory.buildLocalServiceException(AWSExceptionFactory.java:93) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.exceptions.AWSExceptionFactory.buildAWSException(AWSExceptionFactory.java:58) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.shared.access.api.cp.CreateTableFunction.validateTableNotExists(CreateTableFunction.java:271) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.shared.access.api.cp.CreateTableFunction.access$000(CreateTableFunction.java:30) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.shared.access.api.cp.CreateTableFunction$1.criticalSection(CreateTableFunction.java:156) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.shared.access.LocalDBAccess$WriteLockWithTimeout.execute(LocalDBAccess.java:361) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.shared.access.api.cp.CreateTableFunction.apply(CreateTableFunction.java:160) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.shared.access.awssdkv1.client.LocalAmazonDynamoDB.createTable(LocalAmazonDynamoDB.java:229) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBRequestHandler.createTable(LocalDynamoDBRequestHandler.java:252) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.dispatchers.CreateTableDispatcher.enact(CreateTableDispatcher.java:18) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.dispatchers.CreateTableDispatcher.enact(CreateTableDispatcher.java:12) ~[DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBServerHandler.packageDynamoDBResponse(LocalDynamoDBServerHandler.java:395) [DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at com.amazonaws.services.dynamodbv2.local.server.LocalDynamoDBServerHandler.handle(LocalDynamoDBServerHandler.java:482) [DynamoDBLocal.jar:?]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:205) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.Server.handle(Server.java:505) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267) [jetty-server-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) [jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [jetty-io-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804) [jetty-util-9.4.18.v20190429.jar:9.4.18.v20190429]
2021-11-15T21:22:08:INFO:localstack.services.dynamodb.server: at java.lang.Thread.run(Unknown Source) [?:?]
module bug
go 1.17
require github.com/aws/aws-sdk-go-v2/config v1.10.1
require (
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.5.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.3.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
)
require (
github.com/aws/aws-sdk-go-v2 v1.11.0
github.com/aws/aws-sdk-go-v2/credentials v1.6.1 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.8.0 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.0 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.0.0 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.0 // indirect
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.8.0
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.5.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.6.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.10.0 // indirect
github.com/aws/smithy-go v1.9.0 // indirect
)
github.com/aws/aws-sdk-go-v2 v1.11.0 h1:HxyD62DyNhCfiFGUHqJ/xITD6rAjJ7Dm/2nLxLmO4Ag=
github.com/aws/aws-sdk-go-v2 v1.11.0/go.mod h1:SQfA+m2ltnu1cA0soUkj4dRSsmITiVQUJvBIZjzfPyQ=
github.com/aws/aws-sdk-go-v2/config v1.10.1 h1:z/ViqIjW6ZeuLWgTWMTSyZzaVWo/1cWeVf1Uu+RF01E=
github.com/aws/aws-sdk-go-v2/config v1.10.1/go.mod h1:auIv5pIIn3jIBHNRcVQcsczn6Pfa6Dyv80Fai0ueoJU=
github.com/aws/aws-sdk-go-v2/credentials v1.6.1 h1:A39JYth2fFCx+omN/gib/jIppx3rRnt2r7UKPq7Mh5Y=
github.com/aws/aws-sdk-go-v2/credentials v1.6.1/go.mod h1:QyvQk1IYTqBWSi1T6UgT/W8DMxBVa5pVuLFSRLLhGf8=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.8.0 h1:OpZjuUy8Jt3CA1WgJgBC5Bz+uOjE5Ppx4NFTRaooUuA=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.8.0/go.mod h1:5E1J3/TTYy6z909QNR0QnXGBpfESYGDqd3O0zqONghU=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.0 h1:zY8cNmbBXt3pzjgWgdIbzpQ6qxoCwt+Nx9JbrAf2mbY=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.0/go.mod h1:NO3Q5ZTTQtO2xIg2+xTXYDiT7knSejfeDm7WGDaOo0U=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.0.0 h1:Z3aR/OXBnkYK9zXkNkfitHX6SmUBzSsx8VMHbH4Lvhw=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.0.0/go.mod h1:anlUzBoEWglcUxUQwZA7HQOEVEnQALVZsizAapB2hq8=
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.0 h1:c10Z7fWxtJCoyc8rv06jdh9xrKnu7bAJiRaKWvTb2mU=
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.0/go.mod h1:6oXGy4GLpypD3uCh8wcqztigGgmhLToMfjavgh+VySg=
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.8.0 h1:S0rw23pDj3vf4pa/JQEj7FgQAxa+0pGuWfx2fyCAfS0=
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.8.0/go.mod h1:Hh0zJ3419ET9xQBeR+y0lHIkObJwAKPbzV9nTZ0yrJ0=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.5.0 h1:lPLbw4Gn59uoKqvOfSnkJr54XWk5Ak1NK20ZEiSWb3U=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.5.0/go.mod h1:80NaCIH9YU3rzTTs/J/ECATjXuRqzo/wB6ukO6MZ0XY=
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.3.0 h1:A2aUh9d38A2ECh76ahOQUdpJFe+Jhjk8qrfV+YbNYGY=
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.3.0/go.mod h1:5h2rxfLN22pLTQ1ZoOza87rp2SnN/9UDYdYBQRmIrsE=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.5.0 h1:qGZWS/WgiFY+Zgad2u0gwBHpJxz6Ne401JE7iQI1nKs=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.5.0/go.mod h1:Mq6AEc+oEjCUlBuLiK5YwW4shSOAKCQ3tXN0sQeYoBA=
github.com/aws/aws-sdk-go-v2/service/sso v1.6.0 h1:JDgKIUZOmLFu/Rv6zXLrVTWCmzA0jcTdvsT8iFIKrAI=
github.com/aws/aws-sdk-go-v2/service/sso v1.6.0/go.mod h1:Q/l0ON1annSU+mc0JybDy1Gy6dnJxIcWjphO6qJPzvM=
github.com/aws/aws-sdk-go-v2/service/sts v1.10.0 h1:1jh8J+JjYRp+QWKOsaZt7rGUgoyrqiiVwIm+w0ymeUw=
github.com/aws/aws-sdk-go-v2/service/sts v1.10.0/go.mod h1:jLKCFqS+1T4i7HDqCP9GM4Uk75YW1cS0o82LdxpMyOE=
github.com/aws/smithy-go v1.9.0 h1:c7FUdEqrQA1/UVKKCNDFQPNKGp4FQg3YW4Ck5SLTG58=
github.com/aws/smithy-go v1.9.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
package main
import (
"context"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func main() {
// create dynamo client
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithEndpointResolver(aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {
return aws.Endpoint{URL: "http://localhost:4566"}, nil
})),
config.WithCredentialsProvider(aws.CredentialsProviderFunc(func(c context.Context) (aws.Credentials, error) {
return aws.Credentials{AccessKeyID: "foobar", SecretAccessKey: "foobar"}, nil
})),
config.WithClientLogMode(aws.LogRequestWithBody|aws.LogResponseWithBody),
)
if err != nil {
log.Fatalf("error connecting to localstack: %s", err)
}
dynamo := dynamodb.NewFromConfig(cfg)
// create table
tableName := "my-table"
_, err = dynamo.CreateTable(context.TODO(), &dynamodb.CreateTableInput{
TableName: &tableName,
AttributeDefinitions: []types.AttributeDefinition{
{
AttributeName: aws.String("id"),
AttributeType: types.ScalarAttributeTypeS,
},
},
KeySchema: []types.KeySchemaElement{
{
AttributeName: aws.String("id"),
KeyType: types.KeyTypeHash,
},
},
ProvisionedThroughput: &types.ProvisionedThroughput{
ReadCapacityUnits: aws.Int64(10),
WriteCapacityUnits: aws.Int64(10),
},
})
if err != nil {
log.Fatalf("error creating table: %s", err)
}
// scan table
result, err := dynamo.Scan(context.TODO(), &dynamodb.ScanInput{TableName: &tableName})
if err != nil {
log.Fatalf("error scanning table: %s", err)
}
log.Printf("scanned table: %+v", result)
// delete table
_, err = dynamo.DeleteTable(context.TODO(), &dynamodb.DeleteTableInput{TableName: &tableName})
if err != nil {
log.Fatalf("error deleting table: %s", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment