适用于 AWS Cloud9 的 Amazon DynamoDB 教程 - AWS Cloud9

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

适用于 AWS Cloud9 的 Amazon DynamoDB 教程

此教程让您能够设置 AWS Cloud9 开发环境以与 Amazon DynamoDB 一起使用。

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

创建此示例可能会导致您的 AWS 账户产生相关费用。其中包括可能对 Amazon EC2 和 DynamoDB 等服务收取的费用。有关更多信息,请参阅 Amazon EC2 定价Amazon DynamoDB 定价

有关其他 AWS 数据库服务的信息,请参阅 AWS 网站上的 Amazon Relational Database Service (RDS)Amazon ElastiCacheAmazon Redshift。另请参阅 AWS 网站上的 AWS Database Migration Service

先决条件

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

  • 您必须有现成的 AWS Cloud9 EC2 开发环境。本示例假设您已经有连接到运行 Amazon Linux 或 Ubuntu Server 的 Amazon EC2 实例的 EC2 环境。如果您有不同类型的环境或操作系统,可能需要按照本示例的说明来设置相关的工具。有关更多信息,请参阅在中创建环境 AWS Cloud9

  • 您已将适用于现有环境的 AWS Cloud9 IDE 打开。当您打开环境时,AWS Cloud9 会在 Web 浏览器中为该环境打开 IDE。有关更多信息,请参阅在 AWS Cloud9 中打开环境

步骤 1:在您的环境中安装和配置 AWS CLI 和/或 AWS CloudShell

在此步骤中,您将在环境中使用 AWS Cloud9 IDE 安装和配置 AWS CLI 和/或 AWS CloudShell,这样您就可以运行命令来与 DynamoDB 交互。然后,您将使用 AWS CLI 运行基本 DynamoDB 命令来测试安装和配置。

  1. 要在您的环境中设置 AWS CLI 或 AWS CloudShell 的凭证管理以及安装 AWS CLI 和/或 AWS CloudShell,请按照 AWS CLI 和 AWS CloudShell 示例中的步骤 1 和 2 操作,然后返回此主题。如果您已在环境中安装并配置了 AWS CLI 和/或 AWS CloudShell,则无需重复此过程。

  2. 在环境中,通过从终端会话运行 DynamoDB list-tables 命令列出现有的 DynamoDB 表(如果有),测试 AWS CLI 和/或 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)

要创建表,请在 AWS Cloud9 IDE 的终端会话中运行 DynamoDB create-table 命令。

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 属性和 Date 属性的组合唯一标识,表示为 ISO-8601 格式的字符串。

  • --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. 运行 DynamoDB put-item 命令,在命令中指定表的名称 (--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 个项目,类似于上一步中定义的单个项目。不过,在下一步骤中运行 DynamoDB batch-write-item 命令时,您必须提供 JSON 格式的对象,该对象在包含的每个 PutRequest 对象中包括一个 Item 对象。然后,您必须将这些 PutRequest 对象包括在与表具有相同名称的父数组中。

  2. 运行 DynamoDB batch-write-item 命令,在命令中指定要添加的 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 的消息。

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