

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

# 使用 mTLS 对来自 Apache Kafka 源的 Redshift 流式摄取进行身份验证
<a name="materialized-view-streaming-ingestion-mtls"></a>

双向传输层安全（mTLS）提供了一种手段，使服务器可以对其发送信息的客户端进行身份验证，客户端也可以对服务器进行身份验证。使用 mTLS 的好处是可以为多个行业垂直应用中的各种应用场景提供可信身份验证。其中包括金融、零售、政府和医疗保健行业的应用场景。在流式摄取到 Redshift 的情况下，身份验证发生在服务器（可能是 Amazon MSK、Apache Kafka 或 Confluent Cloud）与 Amazon Redshift 预置集群或 Amazon Redshift Serverless 工作组之间。

本主题提供的过程和 SQL 命令示例展示了创建外部架构的方法，该架构使用 mTLS 在 Redshift 客户端和任何 Apache Kafka 服务器之间进行身份验证。本主题中的步骤补充了设置从 Apache Kafka 源进行流式摄取的全套步骤。有关更多信息，请参阅 [从 Apache Kafka 源进行流式摄取入门](materialized-view-streaming-ingestion-getting-started-MSK.md)。

## 使用 mTLS 进行流式摄取的先决条件
<a name="materialized-view-streaming-ingestion-mtls-prerequisites"></a>

此部分提供了使用 mTLS 通过 Amazon Certificate Manager 或 Amazon Secrets Manager 进行流式摄取的先决步骤。

作为第一步，您必须拥有或创建私有证书颁发机构（PCA），您可以使用它来颁发证书，除其它功能外，还可以通过安全通信渠道进行安全通信。Amazon 私有证书颁发机构（私有 CA）是执行此功能的可用服务。有关更多信息，请参阅《Amazon 私有证书颁发机构 用户指南》**中的[创建私有 CA](https://docs.amazonaws.cn/privateca/latest/userguide/create-CA.html)。创建私有 CA 后，导出根 CA 证书，并将其保存到扩展名为 .pem 的文件中。

要创建使用 CA 证书的集群，请执行以下操作：

------
#### [ Amazon MSK ]

1. 创建支持 mtls 客户端身份验证的 Amazon MSK 集群。有关配置 Amazon MSK 集群的更多信息，请参阅《Amazon Managed Streaming for Apache Kafka 开发人员指南》**中的 [Mutual TLS client authentication for Amazon MSK](https://docs.amazonaws.cn/msk/latest/developerguide/msk-authentication.html#msk-authentication-cluster)。

1. 编辑 Amazon MSK 集群的安全设置，使用 Amazon Certificate Manager（ACM）打开 TLS 客户端身份验证，并选择之前创建的 Amazon 私有 CA（PCA）。有关更多信息，请参阅《Amazon Managed Streaming for Apache Kafka 开发人员指南》**中的[更新集群的安全设置](https://docs.amazonaws.cn/msk/latest/developerguide/msk-update-security.html)。

------
#### [ Confluent Cloud ]

1. 创建一个专用 Confluent Cloud 集群，最好与 Amazon Redshift 集群位于同一个 Amazon Web Services 区域中。有关创建 Confluent Cloud 集群的信息，请参阅 [Create a Kafka cluster in Confluent Cloud](https://docs.confluent.io/cloud/current/get-started/index.html#step-1-create-a-ak-cluster-in-ccloud)。

1. 上传导出的您之前创建的 Amazon 私有 CA 根 CA 证书 pem 文件。有关更多信息，请参阅 [Manage certificate authority for mTLS authentication for Confluent Cloud](https://docs.confluent.io/cloud/current/security/authenticate/workload-identities/identity-providers/mtls/certificate-authority.html)。Confluent Cloud 使用此证书来验证 Amazon Redshift 客户端证书。

------

## 使用 mTLS 通过 Amazon Certificate Manager 进行流式摄取
<a name="materialized-view-streaming-ingestion-mtls-acm"></a>

下面的过程展示了如何使用 Amazon Certificate Manager（ACM）进行证书存储和管理，为 Redshift 流式摄取配置 mTLS：

1. 通过 ACM 请求私有证书。此时，请选择在“先决条件”部分中创建的 PCA 作为证书颁发机构。ACM 会存储已签名的证书和附带的私钥，以确保通信安全。有关使用 ACM 管理证书的更多信息，请参阅《Amazon Certificate Manager 用户指南》**中的[发布和管理证书](https://docs.amazonaws.cn/acm/latest/userguide/gs.html)。

1. 对于用于管理 Redshift 集群或 Amazon Redshift Serverless 工作组的 IAM 角色，附加导出证书的权限，即 **acm:ExportCertificate**。有关设置必要的 IAM 资源以进行流式摄取的更多信息，请参阅[设置从 Kafka 进行流式摄取](materialized-view-streaming-ingestion-getting-started-MSK.md#materialized-view-streaming-ingestion-getting-started-MSK-setup)。在下一步中指定相同的 IAM 角色，以创建外部架构。
**注意**  
向 Amazon Certificate Manager 提出的请求要求在 VPC 中有互联网网关（IGW）或 NAT 网关（NGW）。如果您的 VPC 没有 IGW 或 NGW，请执行以下操作：  
使用 Secrets Manager，而不是使用 ACM 来存储证书。
将 Secrets Manager VPC 端点附加到您的 VPC。
有关将 Secrets Manager 与 mTLS 结合使用进行流式摄取的信息，请参阅下面的[使用 mTLS 通过 Amazon Secrets Manager 进行流式摄取](#materialized-view-streaming-ingestion-mtls-secrets-manager)。

1. 获取 Amazon MSK、Apache Kafka 或 Confluent Cloud 集群的引导代理 URI。有关获取 Amazon MSK 的引导代理 URI 的信息，请参阅《Amazon Managed Streaming for Apache Kafka 开发人员指南》**中的 [Getting the bootstrap brokers for an Amazon MSK cluster](https://docs.amazonaws.cn/msk/latest/developerguide/msk-get-bootstrap-brokers.html)。

1.  运行诸如以下示例的 SQL 命令来创建一个外部架构，该架构使用 `mtls` 将集群映射到 Redshift 外部架构。

------
#### [ Amazon MSK ]

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';
   ```

------
#### [ Apache Kafka or Confluent Cloud ]

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'lkc-2v531.domz6wj0p.us-west-1.aws.confluent.cloud:9092'
   AUTHENTICATION_ARN 'arn:aws:acm:region:444455556666:certificate/certificate_ID';
   ```

------

   重要参数：
   + IAM\$1ROLE – 与集群相关联的 IAM 角色，用于流式摄取。
   + URI – 集群的引导代理 URI。请注意，对于 Amazon MSK，指定 9094 端口是为了与代理通信来进行 TLS 加密。
   + AUTHENTICATION\$1ARN – ACM 证书的 ARN。当您选择已签发证书时，ARN 就会出现在 ACM 控制台中。

执行这些配置步骤后，就可以创建一个引用示例中定义的架构的 Redshift 实体化视图，然后使用 REFRESH MATERIALIZED VIEW 来流式传输数据。有关更多信息，请参阅 [从 Apache Kafka 源进行流式摄取入门](materialized-view-streaming-ingestion-getting-started-MSK.md)。

## 使用 mTLS 通过 Amazon Secrets Manager 进行流式摄取
<a name="materialized-view-streaming-ingestion-mtls-secrets-manager"></a>

如果您不想在 Amazon Certificate Manager 中引用证书，则可以使用 Amazon Secrets Manager 进行证书管理，为 Redshift 流式摄取配置 mTLS。以下步骤介绍如何使用 Secrets Manager 配置 mTLS。

1. 使用您选择的工具创建证书签名请求和私钥。然后，您可以使用为集群生成证书时使用的同一 Amazon 私有 CA（PCA），来使用签名请求生成签名证书。有关签发证书的更多信息，请参阅《Amazon 私有证书颁发机构 API 参考》**中的 [IssueCertificate](https://docs.amazonaws.cn/privateca/latest/APIReference/API_IssueCertificate.html)。

1. 使用 Amazon 私有证书颁发机构 提取证书。有关更多信息，请参阅《Amazon 私有证书颁发机构 用户指南》**中的 [Retrieve a private certificate](https://docs.amazonaws.cn/privateca/latest/userguide/PcaGetCert.html)。

1. 将上一步中生成的证书和私钥存储在 Amazon Secrets Manager 中。选择 `Other type of secret` 并使用纯文本格式。键值对的格式应为 `{"certificate":"<cert value>","privateKey":"<pkey value>"}`，如以下示例所示。有关在 Amazon Secrets Manager 中创建和管理密钥的更多信息，请参阅《Amazon Secrets Manager 用户指南》**中的[使用 Amazon Secrets Manager 创建和管理密钥](https://docs.amazonaws.cn/secretsmanager/latest/userguide/managing-secrets.html)。

   ```
   {"certificate":"-----BEGIN CERTIFICATE-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 
   H4hAX8/eE96qCcjkpfT84EdvHzp6fC+/WwM0oXlwUEWlvfMCXNaG5D8SqRq3qA==
   -----END CERTIFICATE-----
   -----BEGIN CERTIFICATE-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi 
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   -----END CERTIFICATE-----",
   "privateKey":"-----BEGIN PRIVATE KEY-----
   klhdslkfjahksgdfkgioeuyihbflahabhbdslv6akybeoiwv1hoaiusdhbahsbdi
   7OD4m1dBEs3Fj++hDMH9rYRp99RqtCOf0EWOUe139KOilOsW+cyhAoc9Ci2+Jo/k
   17u2N1iGILMQEZuCRtnJOkFYkw==
   -----END PRIVATE KEY-----"}
   ```

1. 将检索密钥的权限策略附加到用于管理 Amazon Redshift 集群或 Amazon Redshift Serverless 工作组的 IAM 角色。此权限为 `secretsmanager:GetSecretValue`。有关更多信息，请参阅 [设置身份验证](materialized-view-streaming-ingestion-getting-started-MSK.md#materialized-view-streaming-ingestion-getting-started-MSK-setup-auth)。有关管理 IAM 策略的更多信息，请参阅[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)。在下一步中指定相同的 IAM 角色，以创建外部架构。

1. 在 Redshift 中，运行 SQL 命令来创建外部架构。您可以使用 AUTHENTICATION 类型 `mtls`。还可以在 Amazon Secrets Manager 中指定集群的 URI 和密钥 ARN。

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION mtls
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9094'
   SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
   ```

重要参数：
+ IAM\$1ROLE – 与集群相关联的 IAM 角色，用于流式摄取。
+ URI – 集群的引导代理 URI。请注意，对于 Amazon MSK，指定 9094 端口是为了与代理通信来进行 TLS 加密。
+ SECRET\$1ARN – 来自 Secrets Manager 的密钥的 ARN，其中包含用于 mTLS 的证书。

## 为现有外部架构启用 mTLS 身份验证
<a name="materialized-view-streaming-ingestion-mtls-alter"></a>

如果您有一个用于流式摄取的现有外部架构，并且想要实现双向 TLS 进行身份验证，则可以运行如下命令，该命令在 ACM 中指定 mTLS 身份验证和 ACM 证书 ARN。

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
AUTHENTICATION_ARN 'arn:aws:acm:Region:444455556666:certificate/certificate_ID';
```

或者，您可以参考 Amazon Secrets Manager 中的密钥 ARN 指定 mTLS 身份验证。

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
```

有关 ALTER EXTERNAL SCHEMA 命令的信息，请参阅 [ALTER EXTERNAL SCHEMA](r_ALTER_EXTERNAL_SCHEMA.md)。