使用 Curl 将记录插入 Amazon 的 DynamoDB(通过低级别 API)
Insert a Record into Amazon's DynamoDB using Curl (via low level API)
我正在尝试使用 Curl 将项目插入 DynamoDB table。我知道有 AWS SDK 和 AWS-CLI,但 as per this document 似乎也可以通过简单的 HTTP API 或 Curl
插入项目。
无论如何,我已经尝试了一段时间,但我一直收到此错误响应:
{"__type":"com.amazon.coral.service#SerializationException"}
有人可以告诉我我做错了什么吗?
这是我的脚本:
$date = date('r');
$priv_key = getenv('AWS_SECRET_ACCESS_KEY');
$access_key = getenv('AWS_ACCESS_KEY_ID');
$length = strlen($value);
$signature = base64_encode(hash_hmac('sha256', $date, $priv_key, TRUE));
$cmd = "\
curl -d @test.json \
-H \"Host: dynamodb.us-east-1.amazonaws.com;\" \
-H \"Accept-Encoding: identity\" \
-H \"Content-Length: $length\" \
-H \"User-Agent: Curl\" \
-H \"Content-Type: application/x-amz-json-1.0\" \
-H \"Authorization: $access_key:$signature\" \
-H \"X-Amz-Date: $date\" \
-H \"X-Amz-Target: DynamoDB_20120810.PutItem\" \
https://dynamodb.us-east-1.amazonaws.com\"\
";
print ($cmd);
print system($cmd);
这里是 test.json
的内容(Curl 发送的文件)
{
"TableName": "cache",
"Key": {
"id": {"S": "1"},
"data": {"S": "test"}
}
}
同样,我知道我可以通过 SDK 很容易地做到这一点,但我只是想知道为什么这不起作用?我正在按照文档进行所有操作,以了解 SDK 的内部工作原理。有什么想法吗?
我唯一看到的错误是 Content-Type 应该是 "application\json"。这是 GetItem 的工作示例:
curl -X POST \
http://dynamodb.ap-southeast-2.amazonaws.com \
-H 'Accept-Encoding: identity' \
-H 'Authorization: AWS4-HMAC-SHA256 Credential=AKIAXXXXXXXXXXXXXXXX/20190505/ap-southeast-2/dynamodb/aws4_request, SignedHeaders=accept-encoding;cache-control;content-length;content-type;host;postman-token;user-agent;x-amz-date;x-amz-target, Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
-H 'Content-Length: 253' \
-H 'Content-Type: application/json' \
-H 'Host: dynamodb.ap-southeast-2.amazonaws.com' \
-H 'Postman-Token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'User-Agent: postman' \
-H 'X-Amz-Date: 20190505T235951Z' \
-H 'X-Amz-Target: DynamoDB_20120810.GetItem' \
-H 'cache-control: no-cache' \
-d '{
"TableName": "test-table",
"Key": {
"Eventdate": {
"S": "2019-03-28"
},
"Eventid": {
"S": "00001"
}
},
"ConsistentRead": true,
"ReturnConsumedCapacity": "TOTAL"
}'
我正在尝试使用 Curl 将项目插入 DynamoDB table。我知道有 AWS SDK 和 AWS-CLI,但 as per this document 似乎也可以通过简单的 HTTP API 或 Curl
插入项目。
无论如何,我已经尝试了一段时间,但我一直收到此错误响应:
{"__type":"com.amazon.coral.service#SerializationException"}
有人可以告诉我我做错了什么吗?
这是我的脚本:
$date = date('r');
$priv_key = getenv('AWS_SECRET_ACCESS_KEY');
$access_key = getenv('AWS_ACCESS_KEY_ID');
$length = strlen($value);
$signature = base64_encode(hash_hmac('sha256', $date, $priv_key, TRUE));
$cmd = "\
curl -d @test.json \
-H \"Host: dynamodb.us-east-1.amazonaws.com;\" \
-H \"Accept-Encoding: identity\" \
-H \"Content-Length: $length\" \
-H \"User-Agent: Curl\" \
-H \"Content-Type: application/x-amz-json-1.0\" \
-H \"Authorization: $access_key:$signature\" \
-H \"X-Amz-Date: $date\" \
-H \"X-Amz-Target: DynamoDB_20120810.PutItem\" \
https://dynamodb.us-east-1.amazonaws.com\"\
";
print ($cmd);
print system($cmd);
这里是 test.json
的内容(Curl 发送的文件)
{
"TableName": "cache",
"Key": {
"id": {"S": "1"},
"data": {"S": "test"}
}
}
同样,我知道我可以通过 SDK 很容易地做到这一点,但我只是想知道为什么这不起作用?我正在按照文档进行所有操作,以了解 SDK 的内部工作原理。有什么想法吗?
我唯一看到的错误是 Content-Type 应该是 "application\json"。这是 GetItem 的工作示例:
curl -X POST \
http://dynamodb.ap-southeast-2.amazonaws.com \
-H 'Accept-Encoding: identity' \
-H 'Authorization: AWS4-HMAC-SHA256 Credential=AKIAXXXXXXXXXXXXXXXX/20190505/ap-southeast-2/dynamodb/aws4_request, SignedHeaders=accept-encoding;cache-control;content-length;content-type;host;postman-token;user-agent;x-amz-date;x-amz-target, Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
-H 'Content-Length: 253' \
-H 'Content-Type: application/json' \
-H 'Host: dynamodb.ap-southeast-2.amazonaws.com' \
-H 'Postman-Token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'User-Agent: postman' \
-H 'X-Amz-Date: 20190505T235951Z' \
-H 'X-Amz-Target: DynamoDB_20120810.GetItem' \
-H 'cache-control: no-cache' \
-d '{
"TableName": "test-table",
"Key": {
"Eventdate": {
"S": "2019-03-28"
},
"Eventid": {
"S": "00001"
}
},
"ConsistentRead": true,
"ReturnConsumedCapacity": "TOTAL"
}'