Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

为 Amazon DynamoDB 使用基于身份的策略(IAM 策略)

本主题提供了基于身份的策略的示例,这些示例展示了账户管理员如何将权限策略附加到 IAM 身份 (即用户、组和角色),从而授予对 Amazon DynamoDB 资源执行操作的权限。

重要

我们建议您首先阅读以下介绍性主题,这些主题说明了管理 Amazon DynamoDB 资源访问权限的基本概念和选项。有关更多信息,请参阅 管理您的 Amazon DynamoDB 资源的访问权限概述

本主题的各个部分涵盖以下内容:

下面介绍权限策略示例。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DescribeQueryScanBooksTable", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:account-id:table/Books" } ] }

该策略有一条语句用于为针对 us-west-2 区域中的某个表(由 account-id 指定的 AWS 账户所有)的三项 &DDB; 操作(dynamodb:DescribeTabledynamodb:Querydynamodb:Scan)授予权限。Resource 值中的 Amazon 资源名称 (ARN) 指定了适用这些权限的表。

使用 Amazon DynamoDB 控制台所需的权限

某个用户要能够使用 DynamoDB 控制台,必须拥有一组可使用其 AWS 账户的 DynamoDB 资源的最低权限。除这些 DynamoDB 权限以外,控制台还需要来自以下服务的权限:

  • 显示指标和图形的 Amazon CloudWatch 权限。

  • 导出和导入 DynamoDB 数据的 AWS Data Pipeline 权限。

  • 访问导出和导入所需角色的 AWS Identity and Access Management 权限。

  • 每当触发 CloudWatch 警报时通知您的 Amazon Simple Notification Service 权限。

  • 处理 DynamoDB 流 记录的 AWS Lambda 权限。

如果创建比必需的最低权限更为严格的 IAM 策略,对于挂载了该 IAM 策略的用户,控制台将无法按预期正常运行。为确保这些用户仍可使用 DynamoDB 控制台,同时向用户挂载 AmazonDynamoDBReadOnlyAccess 托管策略,请参阅 适用于 Amazon DynamoDB 的 AWS 托管(预定义)策略

对于只需要调用 AWS CLI 或 Amazon DynamoDB API 的用户,您无需为其提供最低控制台权限。

适用于 Amazon DynamoDB 的 AWS 托管(预定义)策略

AWS 通过提供由 AWS 创建和管理的独立 IAM 策略来解决许多常用案例。这些 AWS 托管策略可针对常用案例授予必要的权限,使您免去调查所需权限的工作。有关更多信息,请参阅 IAM 用户指南 中的 AWS 托管策略

下面的 AWS 托管策略可挂载到您账户中的用户,这些托管策略特定于 DynamoDB 并且按使用案例场景进行分组:

  • AmazonDynamoDBReadOnlyAccess – 使用 AWS 管理控制台授予对 DynamoDB 资源的只读访问权限。

  • AmazonDynamoDBFullAccess – 使用 AWS 管理控制台授予对 DynamoDB 资源的完全访问权限。

  • AmazonDynamoDBFullAccesswithDataPipeline – 使用 AWS 管理控制台授予对 DynamoDB 资源(包括使用 AWS Data Pipeline 导出和导入资源)的完全访问权限。

注意

您可以通过登录到 IAM 控制台并在该控制台中搜索特定策略来查看这些权限策略。

此外,您还可以创建自己的自定义 IAM 策略,以授予 DynamoDB 操作和资源的相关权限。您可以将这些自定义策略挂载到需要这些权限的 IAM 用户或组。

客户托管策略示例

本节的用户策略示例介绍如何授予执行各个 DynamoDB 操作的权限。当您使用 AWS 开发工具包或 AWS CLI 时,可以使用这些策略。当您使用控制台时,您需要授予特定于控制台的其他权限,使用 Amazon DynamoDB 控制台所需的权限中对此进行了讨论。

注意

所有示例都使用 us-west-2 区域和虚构的账户 ID。

示例 1:允许用户对表执行任何 DynamoDB 操作

以下权限策略用于授予允许对表执行所有 DynamoDB 操作的权限。Resource 中指定的 ARN 值用于标识特定区域中的表。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnBooks", "Effect": "Allow", "Action": "dynamodb:*", "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

注意

如果您将资源 ARN (Books) 中的表名称替换为通配符 (*),则可以对账户中的所有表执行任意 DynamoDB 操作。如果您决定这样做,请仔细考虑安全方面的问题。

示例 2:允许对表中的项目进行只读访问

以下权限策略用于授予仅允许执行 GetItemBatchGetItem DynamoDB 操作的权限,从而设置对表的只读访问权限。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadOnlyAPIActionsOnBooks", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

示例 3:允许对特定表执行放入、更新和删除操作

以下权限策略用于授予允许对特定 DynamoDB 表执行 PutItemUpdateItemDeleteItem 操作的权限。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PutUpdateDeleteOnBooks", "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

示例 4:允许访问特定表及其所有索引

以下权限策略用于授予允许对表 (Book) 及其所有索引执行所有 DynamoDB 操作的权限。有关索引工作原理的更多信息,请参阅使用二级索引改进数据访问

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessAllIndexesOnBooks", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books", "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*" ] } ] }

示例 5:设置适用于单独的测试环境和生产环境的权限策略

假设您拥有单独的测试环境和生产环境,其中每个环境都持有自己的 ProductCatalog 表版本。如果您通过同一个 AWS 账户创建这些 ProductCatalog 表,由于权限的设置方式,测试工作可能会影响生产环境(例如,在 AWS 账户级别设置并行创建和删除操作就会产生这种影响)。因此,测试环境中的每个操作都会减少生产环境中可执行的操作数量。同时,测试环境中的代码还存在会意外访问生产环境中的表的风险。要防止出现这些问题,请考虑为生产环境和测试环境创建单独的 AWS 账户。

进一步假设您有两个开发人员(Bob 和 Alice),他们在对 ProductCatalog 表进行测试。您没有为每个开发人员创建单独的 AWS 账户,而是让开发人员共享同一个测试账户。在此测试账户中,您可以创建同一个表的副本(如 Alice_ProductCatalogBob_ProductCatalog),以便每个开发人员对其执行操作。在这种情况下,您可以在为测试环境创建的 AWS 账户中创建 IAM 用户 Alice 和 Bob。然后,您可以授予这些用户对其拥有的表执行 DynamoDB 操作的权限。

要向这些用户授予权限,您可以执行以下任一操作:

  • 为每个用户创建单独的策略,然后分别将每个策略挂载到相应用户。例如,您可以将以下策略挂载到用户 Alice,允许她对 Alice_ProductCatalog 表执行所有 DynamoDB 操作:

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnAliceTable", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog" } ] }

    然后,您可以使用其他资源(Bob_ProductCatalog 表)为用户 Bob 创建类似的策略。

  • 您可以使用 IAM 策略变量编写一项策略并将其挂载到某个组,而不是为各个用户挂载策略。在此示例中,您需要创建一个组,并且将用户 Alice 和用户 Bob 添加到这个组中。以下示例授予对 ${aws:username}_ProductCatalog 表执行所有 DynamoDB 操作的权限。评估策略时,策略变量 ${aws:username} 将替换为请求者的用户名称。例如,如果 Alice 发送一个添加项目的请求,那么只有当 Alice 向 Alice_ProductCatalog 表中添加项目时才能执行这一操作。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllAPIActionsOnUserSpecificTable", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog" }, { "Sid": "AdditionalPrivileges", "Effect": "Allow", "Action": [ "dynamodb:ListTables", "dynamodb:DescribeTable", "cloudwatch:*", "sns:*" ], "Resource": "*" } ] }

注意

使用 IAM 策略变量时,您必须在策略中明确指定访问策略语言的版本 2012-10-17。访问策略语言的默认版本 2008-10-17 不支持策略变量。

请注意,您无需将特定表标识为资源,可以使用通配符 (*) 为所有名称以发出请求的 IAM 用户名称为前缀的表授予权限,如下所示:

Copy
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"

示例 6:防止用户购买预留容量产品

DynamoDB 客户可以购买预留容量,如 Amazon DynamoDB 定价中所述。通过预留容量,您可以支付一次性预付费用并承诺在一段时间内支付最低用量级别的费用,从而节省大量成本。您可以通过 AWS 管理控制台查看和购买预留容量。不过,您可能不希望您企业或组织中的所有用户拥有相同级别的访问权限。

DynamoDB 提供以下 API 操作,以便控制对预留容量管理的访问:

  • dynamodb:DescribeReservedCapacity – 返回当前有效的预留容量购买信息。

  • dynamodb:DescribeReservedCapacityOfferings – 返回有关 AWS 当前提供的预留容量计划的详细信息。

  • dynamodb:PurchaseReservedCapacityOfferings – 实际购买预留容量。

AWS 管理控制台使用这些 API 操作来显示预留容量的相关信息以及进行购买。您无法从应用程序调用这些操作,只能通过控制台对其进行访问。但是,您可以在 IAM 权限策略中允许或拒绝对这些操作的访问。

以下策略允许用户通过 AWS 管理控制台查看预留容量服务和当前购买情况,但是新购买请求将会被拒绝。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowReservedCapacityDescriptions", "Effect": "Allow", "Action": [ "dynamodb:DescribeReservedCapacity", "dynamodb:DescribeReservedCapacityOfferings" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*" }, { "Sid": "DenyReservedCapacityPurchases", "Effect": "Deny", "Action": "dynamodb:PurchaseReservedCapacityOfferings", "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*" } ] }

示例 7:仅允许对 DynamoDB 流(而非表)进行读取访问

当您对表启用 DynamoDB 流 时,它将捕获有关对表中数据项目进行的每项修改的信息。有关更多信息,请参阅 使用 DynamoDB 流 捕获表活动

在某些情况下,您可能需要阻止应用程序从 DynamoDB 表中读取数据,同时仍允许访问该表的流。例如,您可以配置 AWS Lambda 以在检测到项目更新时轮询流并调用 Lambda 函数,然后再执行其他处理。

您可以通过执行以下操作来控制对 DynamoDB 流 的访问:

  • dynamodb:DescribeStream

  • dynamodb:GetRecords

  • dynamodb:GetShardIterator

  • dynamodb:ListStreams

以下示例创建了一项策略,用于向用户授予权限以便其访问名为 GameScores 的表中的流。ARN 中的最后一个通配符 (*) 用于匹配与该表关联的所有流 ID。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessGameScoresStreamOnly", "Effect": "Allow", "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:ListStreams" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*" } ] }

请注意,此策略允许访问 GameScores表中的流,但不允许访问该表本身。

示例 8:允许 AWS Lambda 函数处理 DynamoDB 流记录

如果您希望基于 DynamoDB 流中的新事件执行特定操作,则可以编写一个由这些新事件触发的 AWS Lambda 函数。有关将 Lambda 与流事件结合使用的更多信息,请参阅DynamoDB 流 和 AWS Lambda 触发器。诸如此类的 Lambda 函数需要拥有从 DynamoDB 流中读取数据的权限。

要向 Lambda 授予权限,您可以使用与 Lambda 函数的 IAM 角色(即执行角色,是您在创建该 Lambda 函数时指定的)相关联的权限策略。

例如,您可以将以下权限策略与该执行角色相关联,从而向 Lambda 授予执行所列 DynamoDB 流 操作的权限。

Copy
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLambdaFunctionInvocation", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "*" ] }, { "Sid": "AllAPIAccessForDynamoDBStreams", "Effect": "Allow", "Action": [ "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:ListStreams" ], "Resource": "*" } ] }

有关更多信息,请参阅 AWS Lambda Developer Guide 中的 AWS Lambda 权限模型