AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用该服务。了解更多
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
适用于以下内容的亚马逊 DynamoDB 教程 AWS Cloud9
本教程允许您设置 AWS Cloud9 开发环境以使用 Amazon DynamoDB。
DynamoDB 是一项完全托管SQL的无数据库服务。您可以使用 DynamoDB 创建一个数据库表来存储和检索任意量级的数据,并支持任何级别的请求流量。DynamoDB 自动将表的数据和流量分布到足够数量的服务器上,以处理指定的请求容量和存储的数据量,同时保持一致且快速的性能。有关更多信息,请参阅网站上的亚马逊 Dyn
创建此样本可能会导致向您的 AWS 账户收取费用。其中包括亚马逊EC2和DynamoDB等服务可能产生的费用。有关更多信息,请参阅亚马逊EC2定价和亚马逊
有关其他 AWS 数据库产品的信息,请参阅网站上的亚马逊关系数据库服务 (RDS)
先决条件
在使用此示例之前,请确保您的设置满足以下要求:
-
您必须拥有现有的 AWS Cloud9 EC2开发环境。此示例假设您的EC2环境已连接到运行 Amazon Linux 的亚马逊EC2实例,或者 Ubuntu 服务器。如果您有不同类型的环境或操作系统,可能需要按照本示例的说明来设置相关的工具。有关更多信息,请参阅 在中创建环境 AWS Cloud9。
-
您已经打开了 AWS Cloud9 IDE适用于现有环境的。当你打开一个环境时,会IDE在 Web 浏览器中 AWS Cloud9 打开该环境的。有关更多信息,请参阅 在 AWS Cloud9 中打开环境。
步骤 1:在您的环境中安装和配置 AWS CLI和/或 AWS CloudShell
在此步骤中,您将使用在您的环境中安装和配置 AWS CLI AWS CloudShell、或两者兼而有之,这样您就可以运行命令与 DynamoDB 进行交互。 AWS Cloud9 IDE然后,您将使用 AWS CLI 运行基本 DynamoDB 命令来测试安装和配置。
-
要为 AWS CLI 或设置凭据管理 AWS CloudShell 并在您的环境中安装 AWS CLI AWS CloudShell、或两者,请按照和AWS CloudShell 示例中的步骤 1 AWS CLI 和 2 进行操作,然后返回本主题。如果您已经在环境中安装并配置了 AWS CloudShell、或两者兼而有之,则无需再次执行此操作。 AWS CLI
-
通过在您的环境中的终端会话中 AWS CLI运行 DynamoDB
list-tables
命令来列出您的现有 DynamoDB 表(如果有),以测试安装和配置、aws-shell 或两者兼而有之。要开始新的终端会话,请在菜单栏上依次选择 Window (窗口)、New Terminal (新建终端)。aws dynamodb list-tables # For the AWS CLI. dynamodb list-tables # For the aws-shell.
注意
在本示例中,如果您使用的是 aws-shell,请忽略以
aws
开头的每个命令中的aws
。要启动 aws-shell,请运行aws-shell
命令。要停止使用 aws-shell,请运行.exit
或.quit
命令。如果此命令成功,它会输出一个
TableNames
数组,其中包含您现在已有的 DynamoDB 表的列表。如果您还没有 DynamoDB 表,则TableNames
数组将为空。{ "TableNames": [] }
如果您有任何 DynamoDB 表,则
TableNames
数组包含表名称列表。
步骤 2:创建表
在此步骤中,您在 DynamoDB 中创建表,并指定表的名称、布局、简单主键以及数据吞吐量设置。
此示例表名为 Weather
,包含美国几个城市的天气预报信息。此表包含以下类型的信息(在 DynamoDB 中,每一条信息称为一个属性):
-
必需的唯一城市 ID (
CityID
) -
必需的预测日期 (
Date
) -
城市名称 (
City
) -
州名称 (
State
) -
预测天气状况 (
Conditions
) -
预测温度 (
Temperatures
)-
预测高温,使用华氏度 (
HighF
) -
预测低温,使用华氏度 (
LowF
)
-
要创建表,请在的终端会话中运行 DynamoDB create-table
命令。 AWS Cloud9 IDE
aws dynamodb create-table \ --table-name Weather \ --attribute-definitions \ AttributeName=CityID,AttributeType=N AttributeName=Date,AttributeType=S \ --key-schema \ AttributeName=CityID,KeyType=HASH AttributeName=Date,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
在此命令中:
-
--table-name
表示表名 (在本示例中为Weather
)。在您 AWS 账户的每个 AWS 区域中,表名必须是唯一的。 -
--attribute-definitions
表示用于唯一标识表项目的属性。此表的每个项目都由数字ID
属性和以 ISO -8601格式字符串表示的Date
属性的组合进行唯一标识。 -
--key-schema
表示表的键架构。此表具有复合主键CityID
和Date
。这意味着,每个表项目必须具有一个CityID
属性值和一个Date
属性值,但表中的任意两个项目不能具有相同的CityID
属性值和Date
属性值。 -
--provisioned-throughput
表示表的读写容量。对于最大 4 KB 的项目,DynamoDB 允许每秒最多 5 次强一致性读取,或者对于最大 4 KB 的项目,每秒最多 5 次最终一致读数。对于最大 1 KB 的项目,DynamoDB 还允许每秒最多 5 次写入。注意
设置更高的预配置吞吐量可能会导致您的 AWS 账户产生额外费用。
有关此命令和其他 DynamoDB 命令的更多信息,请参阅 AWS CLI 命令参考中的 dynamodb。
如果此命令成功,它会显示所创建新表的摘要信息。要确认已成功创建表,请运行 DynamoDB describe-table
命令,在命令中指定表的名称 (--table-name
)。
aws dynamodb describe-table --table-name Weather
成功创建表之后,TableStatus
值会从 CREATING
变为 ACTIVE
。在成功创建表之前,请不要继续完成此步骤。
步骤 3:向表添加项目
在此步骤中,您将向刚刚创建的表中添加一个项目。
-
使用以下内容创建名为
weather-item.json
的文件。要创建新文件,请在菜单栏上依次选择 File (文件)、New File (新建文件)。要保存文件,请依次选择 File (文件)、Save (保存)。{ "CityID": { "N": "1" }, "Date": { "S": "2017-04-12" }, "City": { "S": "Seattle" }, "State": { "S": "WA" }, "Conditions": { "S": "Rain" }, "Temperatures": { "M": { "HighF": { "N": "59" }, "LowF": { "N": "46" } } } }
在本代码中,
N
表示数字属性值。S
是字符串属性值。M
是映射属性,该属性是一组属性/值对。在使用项目时,您必须指定属性的数据类型。有关其他可用属性数据类型的信息,请参阅 Amazon DynamoDB 开发人员指南中的数据类型。 -
运行 Dyn
put-item
amoDB 命令,指定表的名称--table-name
() 和格式化项目的路径 ()。JSON--item
aws dynamodb put-item \ --table-name Weather \ --item file://weather-item.json
如果命令成功,它将运行而没有错误,并且不显示确认消息。
-
要确认表的当前内容,请运行 DynamoDB
scan
命令,在命令中指定表的名称 (--table-name
)。aws dynamodb scan --table-name Weather
如果命令成功,则将显示有关表以及刚刚添加项目的汇总信息。
步骤 4:向表添加多个项目
在此步骤中,您将向 Weather
表中添加多个项目。
-
使用以下内容创建名为
more-weather-items.json
的文件。{ "Weather": [ { "PutRequest": { "Item": { "CityID": { "N": "1" }, "Date": { "S": "2017-04-13" }, "City": { "S": "Seattle" }, "State": { "S": "WA" }, "Conditions": { "S": "Rain" }, "Temperatures": { "M": { "HighF": { "N": "52" }, "LowF": { "N": "43" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "1" }, "Date": { "S": "2017-04-14" }, "City": { "S": "Seattle" }, "State": { "S": "WA" }, "Conditions": { "S": "Rain" }, "Temperatures": { "M": { "HighF": { "N": "49" }, "LowF": { "N": "43" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "2" }, "Date": { "S": "2017-04-12" }, "City": { "S": "Portland" }, "State": { "S": "OR" }, "Conditions": { "S": "Thunderstorms" }, "Temperatures": { "M": { "HighF": { "N": "59" }, "LowF": { "N": "43" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "2" }, "Date": { "S": "2017-04-13" }, "City": { "S": "Portland" }, "State": { "S": "OR" }, "Conditions": { "S": "Rain" }, "Temperatures": { "M": { "HighF": { "N": "51" }, "LowF": { "N": "41" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "2" }, "Date": { "S": "2017-04-14" }, "City": { "S": "Portland" }, "State": { "S": "OR" }, "Conditions": { "S": "Rain Showers" }, "Temperatures": { "M": { "HighF": { "N": "49" }, "LowF": { "N": "39" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "3" }, "Date": { "S": "2017-04-12" }, "City": { "S": "Portland" }, "State": { "S": "ME" }, "Conditions": { "S": "Rain" }, "Temperatures": { "M": { "HighF": { "N": "59" }, "LowF": { "N": "40" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "3" }, "Date": { "S": "2017-04-13" }, "City": { "S": "Portland" }, "State": { "S": "ME" }, "Conditions": { "S": "Partly Sunny" }, "Temperatures": { "M": { "HighF": { "N": "54" }, "LowF": { "N": "37" } } } } } }, { "PutRequest": { "Item": { "CityID": { "N": "3" }, "Date": { "S": "2017-04-14" }, "City": { "S": "Portland" }, "State": { "S": "ME" }, "Conditions": { "S": "Mostly Sunny" }, "Temperatures": { "M": { "HighF": { "N": "53" }, "LowF": { "N": "37" } } } } } } ] }
在本代码中,8 个
Item
对象定义要添加到表中的 8 个项目,类似于上一步中定义的单个项目。但是,在下一步中运行batch-write-item
DynamoDB 命令时,必须提供JSON包含对象中的Item
每个对象的格式对象。PutRequest
然后,您必须将这些PutRequest
对象包括在与表具有相同名称的父数组中。 -
运行 Dyn
batch-write-item
amoDB 命令,指定要JSON添加的格式项目的路径 ()。--request-items
aws dynamodb batch-write-item \ --request-items file://more-weather-items.json
如果命令成功,它会显示以下消息,确认已成功添加项目。
{ "UnprocessedItems": {} }
-
要确认表的当前内容,请再次运行 DynamoDB
scan
命令。aws dynamodb scan --table-name Weather
如果命令成功,现在显示 9 个项目。
步骤 5:创建全局二级索引
运行 DynamoDB scan
命令以获取有关项目信息的速度可能会较慢,尤其在表的大小增长或者您要获取的信息类型非常复杂时。您可以创建一个或多个二级索引,以加快速度并更轻松地获取信息。在此步骤中,您将了解 DynamoDB 支持用于实现此目的两种二级索引类型。这两种索引称为本地二级索引 和全局二级索引。然后创建全局二级索引。
要了解这些二级索引类型,您首先需要了解主键,它用于唯一地标识表的项目。DynamoDB 支持简单主键或复合主键。简单主键具有一个属性,该属性值对于表中的每个项目必须唯一。该属性也称为分区键(或哈希属性),DynamoDB 可以使用该属性来分区项目以实现更快地访问。表还可以具有复合主键,其中包含两个属性。第一个属性是分区键,第二个属性是排序键(也称为范围属性)。在具有复合主键的表中,任何两个项目可以具有相同的分区键值,但不能同时具有相同的排序键值。Weather
表具有复合主键。
本地二级索引具有与表相同的分区键,但此索引类型可以具有不同的排序键。全局二级索引可以具有与表本身均不相同的分区键和排序键。
例如,您可以使用主键,按照 Weather
访问 CityID
项目。要按照 Weather
访问 State
,您可以创建具有分区键 CityID
(必须与表本身的分区键相同) 以及排序键 State
的本地二级索引。要按照 Weather
访问 City
,您可以创建具有分区键 City
以及排序键 Date
的全局二级索引。
您只能在创建表的时候创建本地二级索引。由于 Weather
表已存在,您不能向它添加任何本地二级索引。不过,您可以添加全局二级索引。现在练习添加全局二级索引。
注意
创建二级索引可能会导致您的 AWS 账户产生额外费用。
-
使用以下内容创建名为
weather-global-index.json
的文件。[ { "Create": { "IndexName": "weather-global-index", "KeySchema": [ { "AttributeName": "City", "KeyType": "HASH" }, { "AttributeName": "Date", "KeyType": "RANGE" } ], "Projection": { "ProjectionType": "INCLUDE", "NonKeyAttributes": [ "State", "Conditions", "Temperatures" ] }, "ProvisionedThroughput": { "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 } } } ]
在此代码中:
-
全局二级索引的名称为
weather-global-index
。 -
City
属性是分区键 (哈希属性),Date
属性是排序键 (范围属性)。 -
对于使用此索引进行的表搜索所匹配的每个项目,
Projection
定义默认情况下要检索的属性 (在哈希属性和任意范围属性之外)。在本示例中,为每个匹配项目检索State
、Conditions
、HighF
(属于Temperatures
) 和LowF
(也属于Temperatures
) 属性 (以及City
和Date
属性)。 -
与表类似,全局二级索引必须定义其预配置吞吐量设置。
-
IndexName
、KeySchema
、Projection
和ProvisionedThroughput
设置必须包含在Create
对象中,该对象定义在下一步骤中运行 DynamoDBupdate-table
命令时,要创建的全局二级索引。
-
-
运行 DynamoDB
update-table
命令。aws dynamodb update-table \ --table-name Weather \ --attribute-definitions \ AttributeName=City,AttributeType=S AttributeName=Date,AttributeType=S \ --global-secondary-index-updates file://weather-global-index.json
在此命令中:
-
--table-name
是要更新的表的名称。 -
--attribute-definitions
是要包括在索引中的属性。分区键始终首先列出,任意排序键始终第二列出。 -
--global-secondary-index-updates
是指向定义全局二级索引的文件的路径。
如果此命令成功,它会显示所创建新全局二级索引的摘要信息。要确认已成功创建全局二级索引,请运行 DynamoDB
describe-table
命令,在命令中指定表的名称 (--table-name
)。aws dynamodb describe-table --table-name Weather
成功创建了全局二级索引时,
TableStatus
值从UPDATING
更改为ACTIVE
,IndexStatus
值从CREATING
更改为ACTIVE
。在成功创建全局二级索引之前,请不要继续完成此步骤。这个过程可能需要几分钟。 -
步骤 6:获取表中的项目
有多种方法可以从表中获取项目。在此步骤中,您可以使用表的主键、使用表的其他属性以及使用全局二级索引来获取项目。
根据项目的主键值从表中获取单个项目
如果您知道某个项目的主键值,则可以通过运行 DynamoDB 命令 get-item
、scan
或 query
来获取匹配项目。以下介绍了这些命令中的主要差别:
-
get-item
返回具有给定主键的项目的一组属性。 -
scan
通过访问表或者二级索引中的每个项目,返回一个或多个项目和项目属性。 -
query
基于主键值查找项目。您可查询具有复合主键 (分区键和排序键) 的任何表或二级索引。
在本示例中,下面介绍了如何使用这些各个命令来获取包含 CityID
(属性值为 1
) 和 Date
(属性值为 2017-04-12
) 的项目。
-
要运行 DynamoDB
get-item
命令,请指定表的名称 (--table-name
)、主键值 (--key
) 以及要显示的项目的属性值 (--projection-expression
)。由于Date
是 DynamoDB 中的保留关键字,您还必须为Date
属性值 (--expression-attribute-names
) 提供一个别名。(State
也是保留关键字,因此您将在后面的步骤中看到为其提供的别名。)aws dynamodb get-item \ --table-name Weather \ --key '{ "CityID": { "N": "1" }, "Date": { "S": "2017-04-12" } }' \ --projection-expression \ "City, #D, Conditions, Temperatures.HighF, Temperatures.LowF" \ --expression-attribute-names '{ "#D": "Date" }'
在此命令和其他命令中,要显示项目的所有属性,请勿包括
--projection-expression
。在本示例中,由于您未包括--projection-expression
,您也无需包含--expression-attribute-names
。aws dynamodb get-item \ --table-name Weather \ --key '{ "CityID": { "N": "1" }, "Date": { "S": "2017-04-12" } }'
-
要运行 DynamoDB
scan
命令,请指定:-
表的名称 (
--table-name
)。 -
要运行的搜索 (
--filter-expression
)。 -
要使用的搜索标准 (
--expression-attribute-values
)。 -
要为匹配项目显示的属性类型 (
--select
)。 -
要显示的项目的属性值 (
--projection-expression
)。 -
如果您的属性使用 DynamoDB 中的预留关键字,则指定这些属性的别名 (
--expression-attribute-names
)。
aws dynamodb scan \ --table-name Weather \ --filter-expression "(CityID = :cityID) and (#D = :date)" \ --expression-attribute-values \ '{ ":cityID": { "N": "1" }, ":date": { "S": "2017-04-12" } }' \ --select SPECIFIC_ATTRIBUTES \ --projection-expression \ "City, #D, Conditions, Temperatures.HighF, Temperatures.LowF" \ --expression-attribute-names '{ "#D": "Date" }'
-
-
要运行 DynamoDB
query
命令,请指定:-
表的名称 (
--table-name
)。 -
要运行的搜索 (
--key-condition-expression
)。 -
在搜索中使用的属性值 (
--expression-attribute-values
)。 -
要为匹配项目显示的属性类型 (
--select
)。 -
要显示的项目的属性值 (
--projection-expression
)。 -
如果您的属性使用 DynamoDB 中的预留关键字,则指定这些属性的别名 (
--expression-attribute-names
)。
aws dynamodb query \ --table-name Weather \ --key-condition-expression "(CityID = :cityID) and (#D = :date)" \ --expression-attribute-values \ '{ ":cityID": { "N": "1" }, ":date": { "S": "2017-04-12" } }' \ --select SPECIFIC_ATTRIBUTES \ --projection-expression \ "City, #D, Conditions, Temperatures.HighF, Temperatures.LowF" \ --expression-attribute-names '{ "#D": "Date" }'
请注意,
scan
命令需要扫描所有 9 个项目以获得所需的结果,而query
命令仅扫描 1 个项目。 -
根据项目的主键值从表中获取多个项目
如果您知道项目的主键值,则可以通过运行 DynamoDB batch-get-item
命令获取匹配项目。在本示例中,下面介绍了如何获取包含 CityID
(属性值为 3
) 和 Date
(属性值为 2017-04-13
或 2017-04-14
) 的项目。
运行 DynamoDB batch-get-item
命令,指定描述要获取项目的文件的路径 (--request-items
)。
aws dynamodb batch-get-item --request-items file://batch-get-item.json
在本示例中,batch-get-item.json
文件中的代码指定在 Weather
表中,搜索 CityID
为 3
并且 Date
为 2017-04-13
或 2017-04-14
的项目。对于找到的每个项目,将显示 City
、State
、Date
和 HighF
(属于 Temperatures
) 的属性值 (如果存在)。
{ "Weather" : { "Keys": [ { "CityID": { "N": "3" }, "Date": { "S": "2017-04-13" } }, { "CityID": { "N": "3" }, "Date": { "S": "2017-04-14" } } ], "ProjectionExpression": "City, #S, #D, Temperatures.HighF", "ExpressionAttributeNames": { "#S": "State", "#D": "Date" } } }
获取表的所有匹配项目
如果您知道表中属性值的一些信息,则可以通过运行 DynamoDB scan
命令获取匹配项目。在本示例中,下面介绍了当 Conditions
属性值包含 Sunny
并且 HighF
属性值 (属于 Temperatures
) 大于 53
时,如何获取日期。
运行 DynamoDB scan
命令,指定:
-
表的名称 (
--table-name
)。 -
要运行的搜索 (
--filter-expression
)。 -
要使用的搜索标准 (
--expression-attribute-values
)。 -
要为匹配项目显示的属性类型 (
--select
)。 -
要显示的项目的属性值 (
--projection-expression
)。 -
如果您的属性使用 DynamoDB 中的预留关键字,则指定这些属性的别名 (
--expression-attribute-names
)。
aws dynamodb scan \ --table-name Weather \ --filter-expression \ "(contains (Conditions, :sun)) and (Temperatures.HighF > :h)" \ --expression-attribute-values \ '{ ":sun": { "S" : "Sunny" }, ":h": { "N" : "53" } }' \ --select SPECIFIC_ATTRIBUTES \ --projection-expression "City, #S, #D, Conditions, Temperatures.HighF" \ --expression-attribute-names '{ "#S": "State", "#D": "Date" }'
从全局二级索引获取所有匹配项目
要使用全局二级索引搜索,请使用 DynamoDB query
命令。在本示例中,下面介绍了如何使用 weather-global-index
二级索引,获取名为 Portland
的城市在日期 2017-04-13
和 2017-04-14
的天气预报。
运行 DynamoDB query
命令,指定:
-
表的名称 (
--table-name
)。 -
全局二级索引的名称 (
--index-name
)。 -
要运行的搜索 (
--key-condition-expression
)。 -
在搜索中使用的属性值 (
--expression-attribute-values
)。 -
要为匹配项目显示的属性类型 (
--select
)。 -
如果您的属性使用 DynamoDB 中的预留关键字,则指定这些属性的别名 (
--expression-attribute-names
)。
aws dynamodb query \ --table-name Weather \ --index-name weather-global-index \ --key-condition-expression "(City = :city) and (#D between :date1 and :date2)" \ --expression-attribute-values \ '{ ":city": { "S" : "Portland" }, ":date1": { "S": "2017-04-13" }, ":date2": { "S": "2017-04-14" } }' \ --select SPECIFIC_ATTRIBUTES \ --projection-expression "City, #S, #D, Conditions, Temperatures.HighF" \ --expression-attribute-names '{ "#S": "State", "#D": "Date" }'
步骤 7:清除
为了防止在您使用完此示例后继续向您的 AWS 账户收费,您应该删除该表。删除表还将删除全局二级索引。您还应该删除环境。
要删除表,请运行 DynamoDB delete-table
命令,在命令中指定表的名称 (--table-name
)。
aws dynamodb delete-table --table-name Weather
如果命令成功,则会显示有关表的信息,包括值为 TableStatus
的 DELETING
。
要确认已成功删除表,请运行 DynamoDB describe-table
命令,在命令中指定表的名称 (--table-name
)。
aws dynamodb describe-table --table-name Weather
如果成功删除此表,将显示包含短语 Requested
resource not found
的消息。
要删除您的环境,请参阅删除环境。