使用Kotlin连接Docker中本地DynamoDB时触发HTTP 400错误
问题
在Kotlin与Ktor项目中使用AWS Kotlin客户端库(版本aws.sdk.kotlin:dynamodb:0.18.0-beta)连接Docker中运行的本地DynamoDB实例时,收到400错误日志:
DEBUG httpTraceMiddleware - DynamoDB-GetItem-835467a5-aedc-40ab-8c28-b56b625ccbd4/Attempt-1: HttpResponse: 400: Bad Request
客户端配置代码如下:
suspend fun getValueForKey(tableNameVal: String, keyName: String, keyVal: String) { val keyToGet = mutableMapOf<String, AttributeValue>() keyToGet[keyName] = AttributeValue.S(keyVal) val request = GetItemRequest { key = keyToGet tableName = tableNameVal } val provider = StaticCredentialsProvider.Builder().apply { accessKeyId = "fakeMyKeyId" secretAccessKey = "fakeSecretAccessKey" }.build() DynamoDbClient { credentialsProvider = provider region = "us-east-1" endpointUrl = Url.parse("http://localhost:8000") }.use { ddb -> val returnedItem = ddb.getItem(request) val numbersMap = returnedItem.item numbersMap?.forEach { entry -> println(entry.key) println(entry.value) } } }
已尝试按官方指南配置假密钥,甚至省略credentialsProvider参数,错误仍存在。但通过AWS CLI命令可成功执行操作:
aws dynamodb get-item \ --table-name key_values \ --key '{"key": {"S": "key1"}}' \ --endpoint-url http://localhost:8000
解决方案
禁用请求签名验证:本地DynamoDB无需AWS签名,而0.18.0-beta版本的客户端默认会对请求签名,这是导致400错误的核心原因。在客户端配置中添加签名关闭选项:
DynamoDbClient { credentialsProvider = provider region = "us-east-1" endpointUrl = Url.parse("http://localhost:8000") signingMode = SigningMode.OFF // 新增该行禁用签名 }.use { ddb -> // 原有业务逻辑 }升级客户端版本:0.18.0-beta属于早期测试版本,对本地DynamoDB的兼容性存在问题。建议升级到最新稳定版(如1.x系列),新版本修复了大量兼容性问题:
// 替换原依赖版本 implementation("aws.sdk.kotlin:dynamodb:1.2.1")校验参数一致性:确保代码中传入的表名(
tableNameVal)和键名(keyName)与CLI命令中的完全一致,避免因参数不匹配导致的请求错误。
内容的提问来源于stack exchange,提问作者Oresztesz
相关产品推荐
相关产品推荐

