

 从补丁 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/)。

# 从 Apache Kafka 源进行流式摄取入门
<a name="materialized-view-streaming-ingestion-getting-started-MSK"></a>

本主题介绍如何通过实体化视图使用来自 Amazon MSK、Apache Kafka 或 Confluent Cloud 的流数据。

 Amazon Redshift 流式摄取的目的是简化将流式数据直接从流式服务摄取到 Amazon Redshift 或 Amazon Redshift Serverless 的过程。这适用于 Amazon MSK Provisioned 和 Amazon MSK Serverless 以及开源 Apache Kafka 和 Confluent Cloud。使用 Amazon Redshift 流式摄取时，在将流数据摄取到 Redshift 之前，无需在 Amazon S3 中暂存 Apache Kafka 主题。

 在技术层面上，流式摄取以低延迟、高速度的方式，将流或主题数据摄取到 Amazon Redshift 实体化视图中。设置完成后，使用实体化视图刷新，可以接收大量数据。

在配置 Amazon Redshift 流式摄取之前，您必须有可用的 Apache Kafka 源。如果没有源，请按照以下说明创建一个源：
+ **Amazon MSK** - [Getting Started Using Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)
+ **Apache Kafka** - [Apache Kafka Quickstart](https://kafka.apache.org/quickstart)
+ **Confluent Cloud** - [Quick Start for Confluent Cloud](https://docs.confluent.io/cloud/current/get-started/index.html)

## 设置从 Kafka 进行流式摄取
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup"></a>

使用以下步骤设置从 Amazon MSK 或非 AWS 托管的 Apache Kafka 源（Apache Kafka 和 Confluent Cloud）流式摄取到 Amazon Redshift 的过程。

**Topics**
+ [设置身份验证](#materialized-view-streaming-ingestion-getting-started-MSK-setup-auth)
+ [设置 VPC](#materialized-view-streaming-ingestion-getting-started-MSK-Setup-VPC)
+ [创建实体化视图](#materialized-view-streaming-ingestion-getting-started-MSK-setup-materialized-view)

### 设置身份验证
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup-auth"></a>

本节介绍如何设置身份验证来支持 Amazon Redshift 应用程序访问 Amazon MSK 源。

创建应用程序的角色后，请附加以下策略之一，以支持访问 Amazon MSK、Apache Kafka 或 Confluent Cloud 集群。对于 mTLS 身份验证，可以将 Amazon Redshift 使用的证书存储在 ACM 或 Secrets Manager 中，因此，您必须选择与证书存储位置相匹配的策略。

请注意，当您使用直接流式摄取，将任何支持的 Apache Kafka 流式来源摄取到 Amazon Redshift 中时，身份验证或传输中数据不支持自签名证书。这包括 Amazon MSK、Apache Kafka 和 Confluent Cloud。请考虑使用由 AWS Certificate Manager 或任何其他公开可信证书颁发机构生成的证书。

只有 Kafka 版本 2.7.1 或更高版本才支持使用 MSK 进行 Amazon Redshift IAM 身份验证。

**AUTHENTICATION IAM（仅限 Amazon MSK）：**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKIAMpolicy",
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:ReadData",
                "kafka-cluster:DescribeTopic",
                "kafka-cluster:Connect"
            ],
            "Resource": [
                "arn:aws:kafka:*:111122223333:cluster/MyTestCluster/*",
                "arn:aws:kafka:*:111122223333:topic/MyTestCluster/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:AlterGroup",
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": [
                "arn:aws:kafka:*:111122223333:group/MyTestCluster/*"
            ]
        }
    ]
}
```

------

**AUTHENTICATION MTLS：使用存储在 AWS Certificate Manager 中的证书**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKmTLSACMpolicy",
            "Effect": "Allow",
            "Action": [
                "acm:ExportCertificate" 
            ],
            "Resource": [
                "arn:aws:acm:us-east-1:444455556666:certificate/certificate_ID"
            ]
        }
    ]
}
```

------

**AUTHENTICATION MTLS：使用存储在 AWS Secrets Manager 中的证书**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "MSKmTLSSecretsManagerpolicy",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue" 
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:444455556666:secret:secret_ID"
            ]
        }
    ]
}
```

------

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

如果您使用 AUTHENTICATION NONE 连接到 Amazon MSK 源，则不需要任何 IAM 角色。但是，如果使用 AUTHENTICATION IAM 或 MTLS 向 Amazon MSK 集群进行身份验证，则 Amazon Redshift 集群或 Amazon Redshift Serverless 命名空间必须附加具有适当权限的 IAM 角色。使用允许 Amazon Redshift 集群或 Amazon Redshift Serverless 命名空间代入 IAM 角色的信任策略创建该角色。创建角色后，添加以下权限之一以支持 IAM 或 MTLS。对于 mTLS 身份验证，Amazon Redshift 使用的证书可以存储在 AWS Certificate Manager 或 AWS Secrets Manager 中，因此必须选择与证书存储位置相匹配的策略。将角色附加到 Amazon Redshift 预置集群或 Redshift Serverless 命名空间。有关如何为 IAM 角色配置信任策略的信息，请参阅[授权 Amazon Redshift 代表您访问其他 AWS 服务](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)。

下表显示了为从 Amazon MSK 进行流式摄取所要设置的免费配置选项：


| Amazon Redshift 配置 | Amazon MSK 配置 | 要在 Redshift 和 Amazon MSK 之间打开的端口 | 
| --- | --- | --- | 
|  AUTHENTICATION NONE  |  TLS 传输已禁用  | 9092 | 
|  AUTHENTICATION NONE  |  TLS 传输已启用  | 9094 | 
|  AUTHENTICATION IAM  |  IAM  | 9098/9198 | 
|  AUTHENTICATION MTLS  |  TLS 传输已启用  | 9094 | 

Amazon Redshift 身份验证是在 CREATE EXTERNAL SCHEMA 语句中设置的。

**注意**  
如果 Amazon MSK 集群启用了相互传输层安全性协议 (mTLS) 身份验证，则将 Amazon Redshift 配置为使用 AUTHENTICATION NONE 会指示它使用端口 9094 进行未经身份验证的访问。但是，由于 mTLS 身份验证正在使用该端口，因此这一过程将失败。因此，我们建议您在使用 mTLS 时切换到 AUTHENTICATION mtls。

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

对于 Apache Kafka 和 Confluent Cloud，Amazon Redshift 支持以下连接协议：
+ 连接到 Apache Kafka 时，可以使用 mTLS 或具有 TLS 的纯文本传输进行身份验证。
+ 连接到 Confluent Cloud 时，只能使用 mTLS 进行身份验证。

Amazon Redshift 支持使用以下加密协议来连接到 Apache Kafka 或 Confluent Cloud：

**Apache Kafka 和 Confluent Cloud 支持的身份验证方法**


| Amazon Redshift | Kafka 安全协议 | Apache Kafka 支持 | Confluent Cloud 支持 | 
| --- | --- | --- | --- | 
| AUTHENTICATION NONE | PLAINTEXT | 否 | 否 | 
| AUTHENTICATION NONE | SSL | 是 | 否 | 
| AUTHENTICATION IAM | SASL\$1SSL | 否 | 否 | 
| AUTHENTICATION MTLS | SSL | 是（带证书） | 是（带证书） | 

请注意，Amazon Redshift 不支持 SASL/SCRAM 或 SASL/PLAINTEXT。

------

### 设置 VPC
<a name="materialized-view-streaming-ingestion-getting-started-MSK-Setup-VPC"></a>

创建身份验证资源后，检查您的 VPC，并确认 Amazon Redshift 集群或 Amazon Redshift Serverless 工作组拥有通往 Apache Kafka 源的路由。

**注意**  
对于 Amazon MSK，Amazon MSK 集群的入站安全组规则应支持 Amazon Redshift 集群或 Redshift Serverless 工作组的安全组。指定的端口取决于 Amazon MSK 集群上配置的身份验证方法。有关更多信息，请参阅[端口信息](https://docs.aws.amazon.com/msk/latest/developerguide/port-info.html)和[从 AWS 内但在 VPC 外部访问](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access.html)。

下一步，在 Amazon Redshift 集群或 Amazon Redshift Serverless 工作组中启用增强型 VPC 路由。有关更多信息，请参阅[启用增强型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-enabling-cluster.html)。

### 创建实体化视图
<a name="materialized-view-streaming-ingestion-getting-started-MSK-setup-materialized-view"></a>

在本节中，您将设置实体化视图，Amazon Redshift 使用该视图来访问 Apache Kafka 流数据。

假设您有可用的 Apache Kafka 集群，第一步是使用 `CREATE EXTERNAL SCHEMA` 在 Redshift 中定义一个架构，并引用该集群作为数据来源。之后，要访问主题中的数据，请在实体化视图中定义 `STREAM`。您可以使用默认的 Amazon Redshift VARBYTE 数据类型存储主题中的记录，也可以定义架构来将数据转换为半结构化 `SUPER` 格式。当您查询实体化视图时，返回的记录是主题的时间点视图。

1. 在 Amazon Redshift 中，创建一个外部架构来映射到 Apacke Kafka 集群。该语法如下所示：

   ```
   CREATE EXTERNAL SCHEMA MySchema
   FROM KAFKA
   [ IAM_ROLE [ default | 'iam-role-arn' ] ]
   AUTHENTICATION [ none | iam | mtls ]
   {AUTHENTICATION_ARN 'acm-certificate-arn' |  SECRET_ARN 'asm-secret-arn'};
   ```

   在 `FROM` 子句中，`KAFKA` 表示架构映射来自 Apache Kafka 源的数据。

    `AUTHENTICATION` 表示用于流式摄取的身份验证类型。有三种类型：
   + **无** – 指定不需要身份验证。这相当于 MSK 上的未经身份验证访问。这与 Apache Kafka 中的 SSL 身份验证相对应。Confluent Cloud 不支持这种身份验证方法。
   + **iam** – 指定 IAM 身份验证。您只能在 Amazon MSK 中使用 IAM 身份验证。选择此选项时，请确保 IAM 角色具有 IAM 身份验证的权限。有关设置所需 IAM 策略的更多信息，请参阅 [设置从 Kafka 进行流式摄取](#materialized-view-streaming-ingestion-getting-started-MSK-setup)。
   + **mtls** – 指定双向传输层安全通过促进客户端和服务器之间的身份验证来提供安全通信。在这种情况下，客户端是 Redshift，服务器是 Apache Kafka。有关使用 mTLS 配置流式摄取的更多信息，请参阅 [使用 mTLS 对来自 Apache Kafka 源的 Redshift 流式摄取进行身份验证](materialized-view-streaming-ingestion-mtls.md)。

   请注意，流式摄取不支持使用用户名和密码的 Amazon MSK 身份验证。

   `AUTHENTICATION_ARN` 参数指定用于建立加密连接的 ACM 双向传输层安全（mTLS）证书的 ARN。

   `SECRET_ARN` 参数指定 AWS Secrets Manager 密钥的 ARN，其中包含 Amazon Redshift 用于 mTLS 的证书。

   以下示例展示了如何在创建外部架构时为 Amazon MSK 集群设置代理 URI：

   **使用 IAM 身份验证：**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA
   IAM_ROLE 'arn:aws:iam::012345678901:role/my_role'
   AUTHENTICATION IAM
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9098,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9098'
   ```

   **不使用身份验证：**

   ```
   CREATE EXTERNAL SCHEMA my_schema
   FROM KAFKA 
   AUTHENTICATION none
   URI 'b-1.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9092,b-2.myTestCluster.123z8u.c2.kafka.us-west-1.amazonaws.com:9092'
   ```

   **使用 mTLS：**

   ```
   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 'acm-certificate-arn' |  SECRET_ARN 'asm-secret-arn'}
   ```

   有关创建外部架构的更多信息，请参阅 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

1. 创建一个实体化视图以使用来自主题的数据。使用 SQL 命令，如以下示例。

   ```
   CREATE MATERIALIZED VIEW MyView AUTO REFRESH YES AS
   SELECT *
   FROM MySchema."mytopic";
   ```

   Kafka 主题名称区分大小写，可以包含大写字母和小写字母。要从名称大写的主题摄取内容，可以在会话或数据库级别将配置 `enable_case_sensitive_identifier` 设置为 `true`。有关更多信息，请参阅[名称和标识符](https://docs.aws.amazon.com/redshift/latest/dg/r_names.html)和 [enable\$1case\$1sensitive\$1identifier](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。

   要开启自动刷新，请使用 `AUTO REFRESH YES`。默认行为是手动刷新。

1. 元数据列包括以下内容：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html)

   需要注意的是，如果实体化视图定义中的业务逻辑导致业务逻辑错误，在某些情况下可能会导致流式摄取中的摄取失败。这可能会导致您不得不删除实体化视图，然后重新创建。为避免这种情况，我们建议您尽可能简化业务逻辑，并在摄取数据后对数据运行额外的逻辑。

1. 刷新视图，这会调用 Amazon Redshift 从主题中读取数据并将数据加载到实体化视图中。

   ```
   REFRESH MATERIALIZED VIEW MyView;
   ```

1. 在实体化视图中查询数据。

   ```
   select * from MyView;
   ```

   当 `REFRESH` 运行时，直接从主题更新实体化视图。您创建映射到 Kafka 主题数据来源的实体化视图。在实体化视图定义中，您可以对数据执行筛选和聚合。流式摄取实体化视图（基本实体化视图）只能引用一个 Kafka 主题，但是您可以创建额外的实体化视图，以与基本实体化视图和其他实体化视图或表连接使用。

有关流式摄取限制的更多信息，请参阅 [流式摄取行为和数据类型](materialized-view-streaming-ingestion.md#materialized-view-streaming-ingestion-limitations)。

# 使用 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 通过 AWS Certificate Manager 或 AWS Secrets Manager 进行流式摄取的先决步骤。

作为第一步，您必须拥有或创建私有证书颁发机构（PCA），您可以使用它来颁发证书，除其它功能外，还可以通过安全通信渠道进行安全通信。AWS 私有证书颁发机构（私有 CA）是执行此功能的可用服务。有关更多信息，请参阅《AWS 私有证书颁发机构 用户指南》**中的[创建私有 CA](https://docs.aws.amazon.com/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.aws.amazon.com/msk/latest/developerguide/msk-authentication.html#msk-authentication-cluster)。

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

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

1. 创建一个专用 Confluent Cloud 集群，最好与 Amazon Redshift 集群位于同一个 AWS 区域中。有关创建 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. 上传导出的您之前创建的 AWS 私有 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 通过 AWS Certificate Manager 进行流式摄取
<a name="materialized-view-streaming-ingestion-mtls-acm"></a>

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

1. 通过 ACM 请求私有证书。此时，请选择在“先决条件”部分中创建的 PCA 作为证书颁发机构。ACM 会存储已签名的证书和附带的私钥，以确保通信安全。有关使用 ACM 管理证书的更多信息，请参阅《AWS Certificate Manager 用户指南》**中的[发布和管理证书](https://docs.aws.amazon.com/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 角色，以创建外部架构。
**注意**  
向 AWS Certificate Manager 提出的请求要求在 VPC 中有互联网网关（IGW）或 NAT 网关（NGW）。如果您的 VPC 没有 IGW 或 NGW，请执行以下操作：  
使用 Secrets Manager，而不是使用 ACM 来存储证书。
将 Secrets Manager VPC 端点附加到您的 VPC。
有关将 Secrets Manager 与 mTLS 结合使用进行流式摄取的信息，请参阅下面的[使用 mTLS 通过 AWS 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.aws.amazon.com/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 通过 AWS Secrets Manager 进行流式摄取
<a name="materialized-view-streaming-ingestion-mtls-secrets-manager"></a>

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

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

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

1. 将上一步中生成的证书和私钥存储在 AWS Secrets Manager 中。选择 `Other type of secret` 并使用纯文本格式。键值对的格式应为 `{"certificate":"<cert value>","privateKey":"<pkey value>"}`，如以下示例所示。有关在 AWS Secrets Manager 中创建和管理密钥的更多信息，请参阅《AWS Secrets Manager 用户指南》**中的[使用 AWS Secrets Manager 创建和管理密钥](https://docs.aws.amazon.com/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.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)。在下一步中指定相同的 IAM 角色，以创建外部架构。

1. 在 Redshift 中，运行 SQL 命令来创建外部架构。您可以使用 AUTHENTICATION 类型 `mtls`。还可以在 AWS 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';
```

或者，您可以参考 AWS 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)。