

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 结合使用 AWS KMS 与 Amazon Redshift Data API
<a name="data-api-kms"></a>

在使用客户自主管理型密钥对 Amazon Redshift 集群或 Redshift Serverless 工作组进行加密时，Amazon Redshift Data API 会使用相同的客户自主管理型密钥来存储和加密您的查询与结果。

默认情况下，Data API 会加密您的数据以保护敏感信息，例如查询文本和查询结果。它使用 AWS 拥有的 AWS KMS 加密密钥来实施此保护措施。

静态数据的默认加密可降低保护敏感数据时的运营开销和复杂性。此方法有助于构建符合严格加密合规性和监管要求的安全应用程序。

## 使用 AWS KMS 中的授权
<a name="data-api-kms-grants"></a>

Data API 需要授权才能使用客户自主管理型密钥。

在对已使用客户自主管理型密钥加密的集群调用 `ExecuteStatement` 或 `BatchExecuteStatement` 时，Amazon Redshift 会通过向 AWS KMS 发送 [https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 请求来代表您创建授权。AWS KMS 通过授权向数据 API 授予对您账户中的 KMS 密钥的访问权限。

Data API 需要授权，才能将客户自主管理型密钥用于以下操作：
+ 向 AWS KMS 发送 [https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) 请求，以使用客户自主管理型密钥对查询元数据进行加密。
+ 向 AWS KMS 发送 [https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 请求，以生成由客户自主管理型密钥加密的数据密钥。
+ 向 AWS KMS 发送 [https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 请求，以对已加密的数据密钥进行解密，从而使用这些密钥对您的数据进行加密。

您可以随时撤销对授权的访问权限，或者删除 Amazon Redshift 对客户自主管理型密钥的访问权限。如果您这样做，Data API 将不再能访问由客户自主管理型密钥加密的数据，这会影响依赖于该数据的操作。例如，如果您在撤销授权后尝试检索查询结果或跟踪查询状态，则 Data API 会返回 `AccessDeniedException`。

## 客户自主管理型密钥的密钥策略
<a name="data-api-kms-policy"></a>

密钥政策控制对客户托管密钥的访问。每个客户托管式密钥必须只有一个密钥策略，其中包含确定谁可以使用密钥以及如何使用密钥的声明。创建客户托管式密钥时，可以指定密钥策略。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[客户托管密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key)。

要结合使用您的客户自主管理型密钥与 Data API，您必须先允许访问 Amazon Redshift。密钥策略中必须允许以下 API 操作：
+ `kms:CreateGrant`：向客户托管密钥添加授权。这些授权控制对指定 AWS KMS 密钥的访问权限，从而允许访问 Amazon Redshift 所需的授权操作。有关更多信息，请参阅[在 AWS KMS 中使用授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations)。

以下是示例密钥策略：

```
"Statement":[
   {
      "Sid":"Allow access to principals authorized to use Amazon Redshift",
      "Effect":"Allow",
      "Principal":{
         "AWS":"*"
      },
      "Action":[
         "kms:DescribeKey",
         "kms:CreateGrant"
      ],
      "Resource":"*",
      "Condition":{
         "StringEquals":{
            "kms:ViaService":"redshift.amazonaws.com",
            "kms:CallerAccount":"111122223333"
         }
      }
   },
   {
      "Sid":"AllowKeyAdministratorsAccess",
      "Effect":"Allow",
      "Principal":{
         "AWS":"arn:aws:iam::111122223333:role/ExampleAdminRole"
      },
      "Action":"kms:*",
      "Resource":"*"
   },
   {
      "Sid":"AllowKeyUseForExampleRole",
      "Effect":"Allow",
      "Principal":{
         "AWS":"arn:aws:iam::111122223333:role/ExampleUserRole"
      },
      "Action":[
         "kms:Encrypt",
         "kms:Decrypt",
         "kms:ReEncrypt*",
         "kms:GenerateDataKey*",
         "kms:DescribeKey"
      ],
      "Resource":"*"
   }
]
```

## Data API 加密上下文
<a name="data-api-kms-encryption"></a>

加密上下文是一组可选的键值对，包含有关数据的其他上下文信息。AWS KMS 会将加密上下文用作其他已经过验证的数据以支持经过身份验证的加密。在请求中包含加密上下文以加密数据时，AWS KMS 将加密上下文绑定到加密的数据。要解密数据，您必须在请求中包含相同的加密上下文。

Data API 在预调配集群的所有 AWS KMS 加密操作中使用相同的三个加密上下文键值对：
+ `aws:redshift:arn`：集群的 Amazon 资源名称（ARN）
+ `aws:redshift:createtime`：请求创建集群时的时间戳
+ `serviceName` – `RedshiftDataAPI`

```
"EncryptionContextSubset": {
    "aws:redshift:arn": "arn:aws:redshift:us-east-1:123456789012:cluster:redshift-cluster",
    "aws:redshift:createtime": "20250815T0000Z",
    "serviceName": "RedshiftDataAPI",
}
```

Data API 在无服务器工作组的所有 AWS KMS 加密操作中使用两个加密上下文键值对：
+ `aws:redshift-serverless:arn`：命名空间的 Amazon 资源名称（ARN）
+ `serviceName`：RedshiftDataAPI

```
"EncryptionContextSubset": {
    "aws:redshift-serverless:arn": "arn:aws:redshift-serverless:us-east-1:123456789012:namespace:12345678-1234-1234-1234-123456789012",
    "serviceName": "RedshiftDataAPI"
}
```

有关加密的更多信息，请参阅 [AWS KMS 的加密详细信息简介](https://docs.aws.amazon.com/kms/latest/cryptographic-details/intro.html)。有关 Amazon Redshift 和 AWS KMS 集成的更多信息，请参阅 [Amazon Redshift 使用 AWS KMS 的方式](https://docs.aws.amazon.com/kms/latest/developerguide/services-redshift.html)。