

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

# 排查 DynamoDB 加密客户端应用程序中的问题
<a name="troubleshooting"></a>

**注意**  
我们的客户端加密库已[重命名为 AWS 数据库加密 SDK](DDBEC-rename.md)。以下主题提供有关适用于 Java 的 DynamoDB 加密客户端版本 1.*x*—2.*x* 以及适用于 Python 的 DynamoDB 加密客户端版本 1.*x*—3.*x* 的信息。有关更多信息，请参阅[适用于 DynamoDB 的AWS 数据库加密 SDK 版本支持](legacy-dynamodb-encryption-client.md#legacy-support)。

本部分介绍了您在使用 DynamoDB 加密客户端时可能遇到的问题并提供了解决这些问题的建议。

要提供有关 DynamoDB 加密客户端的反馈，请在或存储库中提交问题。[aws-dynamodb-encryption-java[aws-dynamodb-encryption-python](https://github.com/aws/aws-dynamodb-encryption-python/)](https://github.com/aws/aws-dynamodb-encryption-java/) GitHub 

要提供对本文档的反馈，请使用任何页面上的反馈链接。

**Topics**
+ [拒绝访问](#kms-permissions)
+ [签名验证失败](#change-data-model)
+ [旧版本全局表存在的问题](#fix-global-tables)
+ [最新提供程序表现不佳](#mrp-ttl-delay)

## 拒绝访问
<a name="kms-permissions"></a>

**问题**：拒绝您的应用程序访问其所需的资源。

**建议**：了解所需权限并将权限添加到您的应用程序所运行的安全环境。

**详细信息**

要运行使用 DynamoDB 加密客户端库的应用程序，调用方必须具有使用其组件的权限。否则，将会拒绝他们访问必要元素。
+ DynamoDB 加密客户端不需要 Amazon Web Services（AWS）账户，也不依赖任何 AWS 服务。但是，如果您的应用程序使用 AWS，[则](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/)需要[有权使用该账户的 AWS 账户和用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)。
+ DynamoDB 加密客户端不需要 Amazon DynamoDB。但是，如果使用客户端的应用程序创建 DynamoDB 表、将项目放入表中或从表中获取项目，则调用方必须具有在您的 AWS 账户账户中使用所需 DynamoDB 操作的权限。有关详细信息，请参阅《Amazon DynamoDB 开发人员指南》**中的[访问控制主题](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)。
+ 如果您的应用程序使用适用于 Python 的 DynamoDB 加密[客户端中的客户端帮助程序类](python-using.md#python-helpers)，则调用者必须具有调用 DynamoDB 操作的权限。[DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)
+ DynamoDB 加密客户端不 AWS Key Management Service 需要 ()。AWS KMS但是，如果您的应用程序使用 Di [rect KMS 材料提供程序](direct-kms-provider.md)，或者它使用[的是最新提供程序](most-recent-provider.md)和正在使用的提供程序存储区 AWS KMS，则调用方必须拥有使用 AWS KMS [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)和[解密操作](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)的权限。

## 签名验证失败
<a name="change-data-model"></a>

**问题**：由于签名验证失败，无法解密某个项目。该项目也可能未按您希望的进行加密和签名。

**建议**：确保您提供的属性操作考虑到该项目中的所有属性。当解密某个项目时，请确保提供与用于加密该项目的操作匹配的属性操作。

**详细信息**

您提供的[属性操作](DDBEC-legacy-concepts.md#legacy-attribute-actions)告诉 DynamoDB 加密客户端要加密并签名的属性、要签名（但不加密）的属性以及要忽略的属性。

如果您指定的属性操作未考虑到该项目中的所有属性，则该项目可能不会按您希望的方式进行加密和签名。如果您在解密项目时提供的属性操作与在加密项目时提供的属性操作不同，则签名验证可能会失败。这是分布式应用程序中的特定问题，在分布式应用程序中，新属性操作可能不会传播到所有主机。

签名验证错误很难解决。为了帮助防止此类错误，请在更改数据模型时采取额外的预防措施。有关更多信息，请参阅 [更改数据模型](data-model.md)。

## 旧版本全局表存在的问题
<a name="fix-global-tables"></a>

**问题**：由于签名验证失败，旧版本的 Amazon DynamoDB 全局表中的项目无法解密。

**建议**：设置属性操作，使得保留的复制字段不会被加密或签名。

**详细信息**

您可以将 DynamoDB 加密客户端与 [DynamoDB 全局表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)结合使用。我们建议您使用带有[多区域 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)的全局表，并将 KMS 密钥复制到复制全局表的所有 AWS 区域 位置。

从全局表[版本 2019.11.21](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html) 开始，您无需任何特殊配置即可将全局表与 DynamoDB 加密客户端结合使用。但是，如果您使用全局表[版本 2017.11.29](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html)，则必须确保所保留的复制字段不会被加密或签名。

如果您使用全局表版本 2017.11.29，则必须将以下属性的属性操作设置为 [Java](java-using.md#attribute-actions-java) 中的 `DO_NOTHING` 或 [Python](python-using.md#python-attribute-actions) 中的 `@DoNotTouch`。
+ `aws:rep:deleting`
+ `aws:rep:updatetime`
+ `aws:rep:updateregion`

如果您使用任何其他版本的全局表，则无需执行任何操作。

## 最新提供程序表现不佳
<a name="mrp-ttl-delay"></a>

**问题**：您的应用程序响应速度较差，尤其是在更新到较新版本的 DynamoDB 加密客户端之后。

**建议**：调整 time-to-live值和缓存大小。

**详细信息**

最新提供程序旨在通过允许有限地重用加密材料来提高使用 DynamoDB 加密客户端的应用程序的性能。为应用程序配置最新提供程序时，您必须在提高性能与缓存和重用所产生的安全问题之间取得平衡。

在较新版本的 DynamoDB 加密客户端中， time-to-live(TTL) 值决定了缓存的加密材料提供程序 CMPs () 的使用时长。TTL 还决定最新提供程序检查新版本的 CMP 的频率。

如果您的 TTL 过长，则应用程序可能会违反您的业务规则或安全标准。如果 TTL 过短，则频繁调用提供程序存储可能会导致您的提供程序存储限制来自您的应用程序和共享您的服务账户的其他应用程序的请求。要解决此问题，请将 TTL 和缓存大小调整为符合延迟和可用性目标并且符合安全标准的值。有关详细信息，请参阅[设置一个 time-to-live值](most-recent-provider.md#most-recent-provider-ttl)。