根据https://github.com/aws/aws-sdk-go/issues/2984,Amazon DynamoDB 似乎不支持 HTTP/2。还有其他服务支持 HTTP/2,但不支持 Amazon DynamoDB。
我测试了https://docs.aws.amazon.com/general/latest/gr/ddb.html列表中的几个端点,它们似乎不支持它。
$ curl -v --http2-prior-knowledge https://dynamodb.us-east-1.amazonaws.com
* Trying 52.119.233.242:443...
* TCP_NODELAY set
* Connected to dynamodb.us-east-1.amazonaws.com (52.119.233.242) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key …Run Code Online (Sandbox Code Playgroud) 如果项目(状态)不存在,我将调用此函数来放置项目,这是我从这里引用的内容:How do I Conditionally insert an item into a dynamodb table using boto3 ..
def put_items_if_doesnt_exist():
dynamodb = boto3.resource('dynamodb',region_name='us-east-1')
try:
table = dynamodb.Table('awssolutions-ssm-hybrid-table')
response = table.put_item(
Item={
'name':'Execution',
'state': 'Locked',
},
ConditionExpression='attribute_not_exists(state) AND attribute_not_exists(name)'
)
except ClientError as e:
# Ignore the ConditionalCheckFailedException
if e.response['Error']['Code'] != 'ConditionalCheckFailedException':
raise
Run Code Online (Sandbox Code Playgroud)
这里的问题是状态是保留字,因此它失败并出现错误:
[ERROR] ClientError: An error occurred (ValidationException) when calling the PutItem operation: Invalid ConditionExpression: Attribute name is a reserved keyword; reserved keyword: state
Run Code Online (Sandbox Code Playgroud)
有什么建议来处理这个问题吗?
python amazon-web-services amazon-dynamodb boto3 dynamodb-queries
我有一个从 DynamoDB 流事件触发的 lambda 函数。它接受的对象来自DynamoDBEventNugetAmazon.Lambda.DynamoDBEvents包。
public async Task FunctionHandler(DynamoDBEvent event, ILambdaContext context)
{
foreach (var record in event.Records)
{
var newImage = event.Dynamodb.NewImage; // Or "OldImage" property
var myObject = new MyObject();
myObject.ItemId = newImage["ItemId"].N;
myObject.IdList = newImage["IdList"].NS;
myObject.CustomerName = newImage["CustomerName"].S;
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以轻松地将此事件转换为我自己的类,如下所示,例如:
public class MyObject
{
public int ItemId { get; set; }
public List<int> IdList { get; set; }
public string CustomerName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
无需创建自己的映射器来操作每种类型的每个单独属性的 DynamoDBEvent 对象?
该类AttributeValue包含许多不同的属性,DynamoDb …
我希望在 DynamoDB 上设置 TTL,以便可以使某些表中的项目过期。
我研究出了如何启用 TTL 并在表上设置一个属性,其中包含 TTL 何时到期的纪元值并且它可以工作,但是这是不可管理的,因为我认为这需要我手动添加此属性和纪元值时间?
任何人都可以建议是否可以将 TTL 设置为默认值 7 天,以及如何自动让它在 7 天后从表中删除项目?
谢谢
埃蒙
我有点困惑这在 DynamoDB 中是否可行。
我将给出一个 SQL 示例并解释如何优化查询,然后我将尝试解释为什么我对如何建模以及如何访问 DynamoDB 中的相同数据感到困惑。
这不是公司代码。这只是我基于 pcpartpicker 过滤器编写的一个例子。
SELECT * FROM BUILDS
WHERE CPU='Intel' AND 'OVERCLOCKED'='true'
AND Price < 3000
AND GPU='GeForce RTX 3060'
AND ...
Run Code Online (Sandbox Code Playgroud)
根据我的理解,SQL 将首先对 BUILDS 表进行扫描,然后过滤掉 CPU 使用 intel 的所有构建。然后,它从这个子集中执行另一个 WHERE 子句来过滤 'OVERCLOCEKD' = true 等等。基本上,所有附加 WHERE 子句都有较少数量的要过滤的行。
为了加速这个查询,我们可以做的一件事是在这些列上创建索引。性能的主要提高是减少了数据库查看的第一个子句对整个表的初始扫描。因此,在上面的示例中,无需扫描整个数据库来查找使用 intel 的构建,而是可以快速检索它们,因为它已建立索引。
您将如何在 DynamoDB 中对这些数据进行建模?我知道您可以创建一堆二级索引,但不要让引擎执行 WHERE 子句并传递结果以进行下一组过滤。看来这一切都必须你自己做。例如,我们需要使用二级索引来查找所有使用 intel、超频、小于 3000 以及使用特定 GPU 的构建,然后我们需要自己找到交集。有没有更好的方法来制定这种访问模式?我很难弄清楚这是否可能。
编辑:我知道我也可以只使用普通的过滤器,但似乎这会非常昂贵,因为它基本上是通过表进行强力搜索,类似于没有索引的 SQL 解决方案。
要了解我在 pcpartpicker 中的意思,请点击该页面的网站链接:https ://pcpartpicker.com/builds/
人们基本上会选择多个过滤器,因此这使得访问模式的设计变得更加困难。
我正在尝试批量添加 dynamodb 中的项目。我的表由复合主键组成,即主键和排序键的组合。我已在我的表上启用time to live,但指标显示deletedItemsCount没有变化。
以下是我的代码:-
def generate_item(data):
item = {
"pk": data['pk'],
"ttl": str(int(time.time())), # current time set for testing
"data": json.dumps({"data": data}),
"sk": data['sk']
}
return item
def put_input_data(input_data, table_name):
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(table_name)
data_list = input_data["data"]
try:
with table.batch_writer() as writer:
for index, data in enumerate(data_list):
writer.put_item(Item=generate_item(data))
except ClientError as exception_message:
raise
Run Code Online (Sandbox Code Playgroud)
在查询表时,我可以看到项目已添加到表中,但图表显示deletedItemsCount没有变化。
有人能指出我哪里出错了吗?将不胜感激任何提示。
谢谢
我正在阅读https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html以在 Dynamodb 表上添加 TTL 字段。但我找不到它如何支持嵌套字段作为 TTL 字段。例如,
id: xxx
user: { firstName: '', lastName:'', age: ''}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我如何使用user -> age作为 ttl 字段?
我想从 DynamoDB 表存储和检索数据。
我的数据(项目=用户对应用程序功能的评论)具有以下属性:
user string
feature string
appVersion string
timestamp string
rate int
description string
Run Code Online (Sandbox Code Playgroud)
该应用程序的多个版本具有多种功能,并且用户可以对这些功能进行多次评论。所以我想使用 ( user, appVersion, feature, timestamp) 作为主键。
但似乎不可能在 DynamoDB 的主键中使用那么多属性。
我实现的第一个解决方案是使用useras a ,并将 ( , , )Partition Key的哈希值用作 a (在名为 的新字段中)。appVersionfeaturetimestampSort KeyreviewID
我的问题是,我想在不知道值的情况下检索给定user,的项目feature(假设我想要最新的项目,或与 3 个字段匹配的所有项目的列表)appVersiontimestamptimestamp
如果不知道timestamp,我就无法构建Sort Key检索我的物品所需的必要条件。timestamp但如果我从 中删除Sort Key,我将无法存储具有相同 ( user, appVersion, feature) …
我正在尝试使用适用于 Java 的 AWS 开发工具包将项目放入 DynamoDB 表中。
我正在使用EnhancedPutItem.java 文档中的示例:
public static void main(String[] args) {
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create();
Region region = Region.US_EAST_1;
DynamoDbClient ddb = DynamoDbClient.builder()
.credentialsProvider(credentialsProvider)
.region(region)
.build();
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
.dynamoDbClient(ddb)
.build();
putRecord(enhancedClient) ;
ddb.close();
}
...
Run Code Online (Sandbox Code Playgroud)
在本地运行时,我可以成功放置该项目,但是当我在 Fargate 上将应用程序作为任务运行时,它会抛出以下错误:
software.amazon.awssdk.core.exception.SdkClientException:配置文件不包含配置文件“默认”的凭据:ProfileFile(profilesAndSectionsMap=[])。
我们遵循 AWS DynamoDB 的单表架构,并使用单个表来存储所有实体。
我们有在我们这里注册车辆的用户,表结构如下:
| 用户身份 | 实体ID | 实体类型 |
|---|---|---|
| 1 | 1 | 车 |
| 1 | 2 | 自行车 |
和关键属性:
partition_key=user_idsort_key=entity_id现在,我们需要仅获取汽车、自行车或任何其他车辆,user_id我想为其添加本地二级索引,并使用现有分区键(以实体类型作为排序键)。
在应用此更改时,它正在尝试重新创建表。
由于现有表中已有数据,有什么方法可以避免重新创建表吗?
amazon-web-services amazon-dynamodb terraform amazon-dynamodb-index
amazon-dynamodb ×10
boto3 ×2
aws-fargate ×1
aws-lambda ×1
c# ×1
java ×1
primary-key ×1
python ×1
terraform ×1