我正在尝试使用boto构建DynamoDB表,这将在表中保存IAM策略的各个方面。我已经为keyschema定义了属性,我不理解错误。我对DYanmoDB和AWS非常陌生。这是我的代码:
table =dynamodb.create_table(
TableName='GoodTable',
KeySchema=[
{
'AttributeName': 'Name',
'KeyType': 'HASH'
},
{
'AttributeName': 'Instance Type',
'KeyType': 'RANGE'
},
{
'AttributeName': 'Region',
'KeyType': 'RANGE'
},
{
'AttributeName': 'Volume Size',
'KeyType': 'RANGE'
},
],
AttributeDefinitions=[
{
"AttributeName": "Name",
"AttributeType": "S"
},
{
"AttributeName": "Instance Type",
"AttributeType": "S"
},
{
"AttributeName": "Region",
"AttributeType": "S"
},
{
"AttributeName": "Volume Size",
"AttributeType": "N"
}
],
ProvisionedThroughput={
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 1
}
)
time.sleep(20)
table = dynamodb.Table('GoodTable')
response = table.put_item(
Item= {
'Name': 'GoodName',
}
)
response = table.put_item(
Item= {
'Instance Type': 't2.micro',
}
)
response = table.put_item(
Item= {
'Region': 'us-east-1',
}
)
response = table.put_item(
Item= {
'Volume Size': '20',
}
)
这就是我得到的错误:
botocore.exceptions.ClientError:调用CreateTable操作时发生错误(ValidationException):检测到1个验证错误:值'[com.amazonaws.dynamodb.v20120810。KeySchemaElement@ad4dcbcd,com.amazonaws.dynamodb.v20120810。KeySchemaElement@126b7ad8,com.amazonaws.dynamodb.v20120810。KeySchemaElement@ca666a07,com.amazonaws.dynamodb.v20120810。KeySchemaElement@6478bc3a]'at'keySchema'未能满足约束:成员的长度必须小于或等于2
字段名是“关键架构”,而不是“表格架构”或其他任何东西,它只定义了键。该表是“无模式”的,这意味着每个记录可以有不同的结构,不需要定义它。您必须只定义密钥。在DynamoDB中,键只能是HASH列或HASH RANGE列。你应该想想你想使用这两种可能性中的哪一种。如果使用HASH RANGE,则必须同时查询这两个表。阅读许多记录是昂贵的。
所以想想你想存储什么,以及你将如何查询。相应地设计散列键。
AWS首席NoSQL技术专家Rick Houlihan提出的单表复杂哈希键数据模型有很大的争议https://youtu.be/HaEPXoXVf2k?t=2573 . 当我观看视频时,我开始以不同的方式设计DynamoDB表格,这改善了我的生活。
然后,自然的趋势是选择一个有点唯一的列并将其用作散列键,但这确实限制了您的查询选项。一个设计良好的散列键可以帮助您在不增加索引的情况下进行查询,因此您的解决方案更便宜、更高效。
如上所述,除了键之外,没有定义任何结构。但这并不意味着每条记录都应该是完全随机的。然而,在一个表中存储多个项目类型是有意义的,其中每个项目类型都具有相同的结构-看视频,这是值得的。
在您的情况下,使用实例名称作为哈希可能会有风险,因为它在各个区域中可能不是唯一的。您甚至可以在同一区域中拥有两个具有相同名称的实例,因为名称只是一个标记。如果您不知道或不想存储实例ID,您必须想出其他一些聪明的解决方案。
例如,哈希可以是:INSTANCE::,排序键可以是实例创建时间。还有一项额外的工作要为每个记录编写和分解密钥。我通过创建一个python类解决了这个问题,该类将put\u item/get\u item包装在一个处理键的方法中。
代码中有两个问题:
dynamodb.Table('GoodTable')
不正确,因为您需要resource
您可以检查修改后的代码:
table = dynamodb.create_table(
TableName='GoodTable',
KeySchema=[
{
'AttributeName': 'Name',
'KeyType': 'HASH'
}
],
AttributeDefinitions=[
{
"AttributeName": "Name",
"AttributeType": "S"
}
],
ProvisionedThroughput={
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 1
}
)
import time
time.sleep(20)
table = boto3.resource('dynamodb').Table('GoodTable')
response = table.put_item(
Item= {
'Name': 'GoodName',
'Instance Type': 't2.micro',
}
)
response = table.put_item(
Item= {
'Name': 'GoodName2',
'Instance Type': 't2.micro',
}
)
response = table.put_item(
Item= {
'Name': 'GoodName3',
'Region': 'us-east-1',
}
)
response = table.put_item(
Item= {
'Name': 'GoodName4',
'Volume Size': '20',
}
)
在DynamoDB中只能有2个字段作为主键。你只能有一个散列密钥和一个范围密钥最大。
编码表
对于复合主键(分区键和排序键),必须按照以下顺序提供两个元素:第一个元素必须具有哈希的KeyType,第二个元素必须具有RANGE的KeyType。
您可以在DynamoDB中设置二级索引
我正在使用Eclipse for Java和AWS工具包。我运行以下代码: 我在控制台视图中看到: […{Name:Name,AttributeDataType:String,DeveloperOnlyAttribute:false,Mutable:true,Required:false,StringAttributeConstraints:{MinLength:0,MaxLength:2048}
我正在创建一个AWS CodePipeline资源与terraform: 运行时,在它返回 编辑: 新的部署阶段是: 我有这个应用程序创建使用: 组使用:
我觉得我一定忽略了什么。 null Grunt@0.4.2应该匹配所有这些依赖项,但npm说它不匹配,安装失败。我是不是忽略了什么? 根据请求,我的package.json文件:
我正在尝试在AWS中应用身份池策略。我正在使用awc cli设置策略,但标题中经常出现以下例外情况: 调用AttachPrincipalPolicy操作时发生错误(InvalidRequestException):检测到1个验证错误:“policyName”处的值“DeviceShadowPolicy”未能满足约束:成员必须满足正则表达式模式:[\w=,。@-] 这是我使用的命令: 我不明白为什么
我正在为https://efactura.dgi.gub.uy:6470/eprueba/ws_personagetactempresarialprueba?wsdl第三方WSDL实现一个webservice客户机。 我使用apache-cxf3.0.4wsdl2java生成java clases。 我需要如何解决这个错误?
我正在尝试使用cucumber框架与selenium和appium,但在执行cucumber特性时,我得到以下异常: @CucumberOptions(features={“src//test//java//feature”},glue={“pages”},plugin={“pretty”,“html:target/cucumber”},tags={“@web”,“@test”,“@appium”