适用于以下内容的亚马逊 DynamoDB 教程 AWS Cloud9 - AWS Cloud9

AWS Cloud9 不再向新客户提供。 AWS Cloud9 的现有客户可以继续正常使用该服务。了解更多

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

适用于以下内容的亚马逊 DynamoDB 教程 AWS Cloud9

本教程允许您设置 AWS Cloud9 开发环境以使用 Amazon DynamoDB。

DynamoDB 是一项完全托管SQL的无数据库服务。您可以使用 DynamoDB 创建一个数据库表来存储和检索任意量级的数据,并支持任何级别的请求流量。DynamoDB 自动将表的数据和流量分布到足够数量的服务器上,以处理指定的请求容量和存储的数据量,同时保持一致且快速的性能。有关更多信息,请参阅网站上的亚马逊 Dyn amoDB。 AWS

创建此样本可能会导致向您的 AWS 账户收取费用。其中包括亚马逊EC2和DynamoDB等服务可能产生的费用。有关更多信息,请参阅亚马逊EC2定价和亚马逊 DynamoDB 定价。

有关其他 AWS 数据库产品的信息,请参阅网站上的亚马逊关系数据库服务 (RDS) ElastiCache、亚马逊和亚马逊 Redshift。 AWS 另请参阅 AWS 网站上的 AWS Database Migration Service

先决条件

在使用此示例之前,请确保您的设置满足以下要求:

  • 您必须拥有现有的 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 命令来测试安装和配置。

  1. 要为 AWS CLI 或设置凭据管理 AWS CloudShell 并在您的环境中安装 AWS CLI AWS CloudShell、或两者,请按照和AWS CloudShell 示例中的步骤 1 AWS CLI 和 2 进行操作,然后返回本主题。如果您已经在环境中安装并配置了 AWS CloudShell、或两者兼而有之,则无需再次执行此操作。 AWS CLI

  2. 通过在您的环境中的终端会话中 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 表示表的键架构。此表具有复合主键 CityIDDate。这意味着,每个表项目必须具有一个 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:向表添加项目

在此步骤中,您将向刚刚创建的表中添加一个项目。

  1. 使用以下内容创建名为 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 开发人员指南中的数据类型

  2. 运行 Dyn put-itemamoDB 命令,指定表的名称 --table-name () 和格式化项目的路径 ()。JSON --item

    aws dynamodb put-item \ --table-name Weather \ --item file://weather-item.json

    如果命令成功,它将运行而没有错误,并且不显示确认消息。

  3. 要确认表的当前内容,请运行 DynamoDB scan 命令,在命令中指定表的名称 (--table-name)。

    aws dynamodb scan --table-name Weather

    如果命令成功,则将显示有关表以及刚刚添加项目的汇总信息。

步骤 4:向表添加多个项目

在此步骤中,您将向 Weather 表中添加多个项目。

  1. 使用以下内容创建名为 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-itemDynamoDB 命令时,必须提供JSON包含对象中的Item每个对象的格式对象。PutRequest然后,您必须将这些 PutRequest 对象包括在与表具有相同名称的父数组中。

  2. 运行 Dyn batch-write-itemamoDB 命令,指定要JSON添加的格式项目的路径 ()。--request-items

    aws dynamodb batch-write-item \ --request-items file://more-weather-items.json

    如果命令成功,它会显示以下消息,确认已成功添加项目。

    { "UnprocessedItems": {} }
  3. 要确认表的当前内容,请再次运行 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 账户产生额外费用。

  1. 使用以下内容创建名为 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 定义默认情况下要检索的属性 (在哈希属性和任意范围属性之外)。在本示例中,为每个匹配项目检索 StateConditionsHighF (属于 Temperatures) 和 LowF (也属于 Temperatures) 属性 (以及 CityDate 属性)。

    • 与表类似,全局二级索引必须定义其预配置吞吐量设置。

    • IndexNameKeySchemaProjectionProvisionedThroughput 设置必须包含在 Create 对象中,该对象定义在下一步骤中运行 DynamoDB update-table 命令时,要创建的全局二级索引。

  2. 运行 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 更改为 ACTIVEIndexStatus 值从 CREATING 更改为 ACTIVE。在成功创建全局二级索引之前,请不要继续完成此步骤。这个过程可能需要几分钟。

步骤 6:获取表中的项目

有多种方法可以从表中获取项目。在此步骤中,您可以使用表的主键、使用表的其他属性以及使用全局二级索引来获取项目。

根据项目的主键值从表中获取单个项目

如果您知道某个项目的主键值,则可以通过运行 DynamoDB 命令 get-itemscanquery 来获取匹配项目。以下介绍了这些命令中的主要差别:

  • get-item 返回具有给定主键的项目的一组属性。

  • scan 通过访问表或者二级索引中的每个项目,返回一个或多个项目和项目属性。

  • query 基于主键值查找项目。您可查询具有复合主键 (分区键和排序键) 的任何表或二级索引。

在本示例中,下面介绍了如何使用这些各个命令来获取包含 CityID (属性值为 1) 和 Date (属性值为 2017-04-12) 的项目。

  1. 要运行 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" } }'
  2. 要运行 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" }'
  3. 要运行 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-132017-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 表中,搜索 CityID3 并且 Date2017-04-132017-04-14的项目。对于找到的每个项目,将显示 CityStateDateHighF (属于 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-132017-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

如果命令成功,则会显示有关表的信息,包括值为 TableStatusDELETING

要确认已成功删除表,请运行 DynamoDB describe-table 命令,在命令中指定表的名称 (--table-name)。

aws dynamodb describe-table --table-name Weather

如果成功删除此表,将显示包含短语 Requested resource not found 的消息。

要删除您的环境,请参阅删除环境