Lambda 仅插入 4 条记录但迭代 248 次
Lambda only inserts 4 records but iterates 248 times
我有一个 AWS lambda(由 cloudwatch 事件触发),它应该从一个 API 中提取 248 条记录并将 248 条记录插入 Dynamo DB。它成功拉取了 248 条记录,但是 Dynamo table 在执行完成后只包含 4 条记录,没有错误。
这是来自 lambda 的工作马代码:
public async Task<APIGatewayProxyResponse> Get(APIGatewayProxyRequest request, ILambdaContext context)
{
try
{
var count = await LoadAutocomplete(Data);
context.Logger.LogLine($"{count} items processed into table '{EnvironmentHelper.DynamoTableName}'");
...
return response;
}
catch (Exception ex)
{
...
}
}
private async Task<int> LoadAutocomplete(IList<MatItem> data)
{
var count = 0;
var client = new AmazonDynamoDBClient();
var table = Amazon.DynamoDBv2.DocumentModel.Table.LoadTable(client, EnvironmentHelper.DynamoTableName);
foreach (var item in data)
{
var doc = new Amazon.DynamoDBv2.DocumentModel.Document();
doc.Add("LANGUAGE", item.LANGUAGE);
doc.Add("MAT_DESC", item.MAT_DESC);
doc.Add("SALES_ORG", item.SALES_ORG);
doc.Add("COUNTRY", item.COUNTRY);
doc.Add("SPECIFICATION", item.SPECIFICATION);
doc.Add("MATERIAL", item.MATERIAL);
doc.Add("TEMPLATE_ID", item.TEMPLATE_ID);
await table.PutItemAsync(doc);
count++;
System.Threading.Thread.Sleep(100);
}
return count;
}
这是 LogLine
语句的输出:
248 项处理为 table 'my-data'
这是用来创建 table 的 tf:
# create the table
resource "aws_dynamodb_table" "prospectmaterials_table" {
name = "my-table"
hash_key = "MATERIAL"
billing_mode = "PROVISIONED"
read_capacity = 5
write_capacity = 5
attribute {
name = "MATERIAL"
type = "S"
}
}
您的代码看起来不错,所以很可能是数据和 table 设计会影响您。
在 DynamoDB 中,主键是唯一标识一个项目的东西,您需要主键来写入 to/update 一个项目。您将分区键(在本例中也是主键)设置为 MATERIAL
属性。
我的猜测是,数据中 MATERIAL
的不同值并不多,因此您的 248 次写入导致四个项目,因为它们可能会覆盖现有项目。
我有一个 AWS lambda(由 cloudwatch 事件触发),它应该从一个 API 中提取 248 条记录并将 248 条记录插入 Dynamo DB。它成功拉取了 248 条记录,但是 Dynamo table 在执行完成后只包含 4 条记录,没有错误。
这是来自 lambda 的工作马代码:
public async Task<APIGatewayProxyResponse> Get(APIGatewayProxyRequest request, ILambdaContext context)
{
try
{
var count = await LoadAutocomplete(Data);
context.Logger.LogLine($"{count} items processed into table '{EnvironmentHelper.DynamoTableName}'");
...
return response;
}
catch (Exception ex)
{
...
}
}
private async Task<int> LoadAutocomplete(IList<MatItem> data)
{
var count = 0;
var client = new AmazonDynamoDBClient();
var table = Amazon.DynamoDBv2.DocumentModel.Table.LoadTable(client, EnvironmentHelper.DynamoTableName);
foreach (var item in data)
{
var doc = new Amazon.DynamoDBv2.DocumentModel.Document();
doc.Add("LANGUAGE", item.LANGUAGE);
doc.Add("MAT_DESC", item.MAT_DESC);
doc.Add("SALES_ORG", item.SALES_ORG);
doc.Add("COUNTRY", item.COUNTRY);
doc.Add("SPECIFICATION", item.SPECIFICATION);
doc.Add("MATERIAL", item.MATERIAL);
doc.Add("TEMPLATE_ID", item.TEMPLATE_ID);
await table.PutItemAsync(doc);
count++;
System.Threading.Thread.Sleep(100);
}
return count;
}
这是 LogLine
语句的输出:
248 项处理为 table 'my-data'
这是用来创建 table 的 tf:
# create the table
resource "aws_dynamodb_table" "prospectmaterials_table" {
name = "my-table"
hash_key = "MATERIAL"
billing_mode = "PROVISIONED"
read_capacity = 5
write_capacity = 5
attribute {
name = "MATERIAL"
type = "S"
}
}
您的代码看起来不错,所以很可能是数据和 table 设计会影响您。
在 DynamoDB 中,主键是唯一标识一个项目的东西,您需要主键来写入 to/update 一个项目。您将分区键(在本例中也是主键)设置为 MATERIAL
属性。
我的猜测是,数据中 MATERIAL
的不同值并不多,因此您的 248 次写入导致四个项目,因为它们可能会覆盖现有项目。