

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

# 访问您的集群
<a name="accessing-memorydb"></a>

MemoryDB 实例设计为通过 Amazon EC2 实例对其进行访问。

您可以从同一 Amazon VPC 中的 Amazon EC2 实例访问 MemoryDB 节点。或者，通过使用 VPC 对等连接，您可以从不同 Amazon VPC 中的 Amazon EC2 访问您的 MemoryDB 节点。

**Topics**
+ [授予对集群的访问权限](#grant-access)
+ [从外部 AWS 访问 MemoryDB 资源](#access-from-outside-aws)

## 授予对集群的访问权限
<a name="grant-access"></a>

您只能从正在同一 Amazon VPC 中运行的 Amazon EC2 实例连接到您的 MemoryDB 集群。在此情况下，您需要向集群授予网络进入。

**授予从 Amazon VPC 安全组到集群的网络入口**

1. 登录到 AWS 管理控制台 并打开 Amazon EC2 控制台（[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)）。

1. 在左侧导航窗格中的**网络和安全**下，选择**安全组**。

1. 从安全组列表中，为 Amazon VPC 选择安全组。除非创建安全组供 MemoryDB 使用，否则此安全组将命名为*默认*。

1. 选择 **Inbound** 选项卡，然后执行以下操作：

   1. 选择 **Edit**（编辑）。

   1. 选择**添加规则**。

   1. 在 **Type** 列中，选择 **Custom TCP rule**。

   1. 在 **Port range** 框中，为您的集群节点键入端口号。此端口号必须与启动集群时指定的端口号相同。Valkey 和 Redis OSS 的默认端口均为 **6379**。

   1. 在**源**框中，选择端口范围为（0.0.0.0/0）的**任何位置**，以便从 Amazon VPC 中启动的任何 Amazon EC2 实例都可以连接到您的 MemoryDB 节点。
**重要**  
向 0.0.0.0/0 公开 MemoryDB 集群时，不会在互联网上公开集群，因为它没有公有 IP 地址，因此无法从 VPC 外部访问。但是，默认安全组可以应用到客户账户中的其他 Amazon EC2 实例，这些实例可能具有公有 IP 地址。如果这些实例碰巧在默认端口上运行某些内容，则该服务可能会意外暴露。因此，我们建议创建将由 MemoryDB 独占使用的 VPC 安全组。有关更多信息，请参阅[自定义安全组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#creating-your-own-security-groups)。

   1. 选择**保存**。

当您将 Amazon EC2 实例启动到您的 Amazon VPC 中时，该实例将能够连接到您的 MemoryDB 集群。

## 从外部 AWS 访问 MemoryDB 资源
<a name="access-from-outside-aws"></a>

MemoryDB 是一项设计为在 VPC 内部使用的服务。由于 Internet 流量的延迟以及安全问题，不鼓励外部访问。但是，如果出于测试或开发目的需要对 MemoryDB 进行外部访问，则可以通过 VPN 完成。

使用 AWS 客户端 VPN，您允许对 MemoryDB 节点进行外部访问且具有以下优势：
+ 限制访问获得批准的用户或身份验证密钥；
+ VPN 客户端与 AWS VPN 端点之间的加密流量；
+ 对特定子网或节点的限制访问；
+ 轻松撤消对用户或身份验证密钥的访问；
+ 审核连接；

以下过程演示如何：

**Topics**
+ [创建证书颁发机构](#create-cert)
+ [配置 AWS 客户端 VPN 组件](#configure-vpn-components)
+ [配置 VPN 客户端](#configure-vpn-client)

### 创建证书颁发机构
<a name="create-cert"></a>

可以使用不同的技术或工具创建证书颁发机构（CA）。我们建议使用 [OpenVPN](https://openvpn.net/community-resources/openvpn-project/) 项目提供的 easy-rsa 实用程序。无论您选择哪种选项，请确保密钥安全。以下过程下载 easy-rsa 脚本，创建证书颁发机构和用于验证第一个 VPN 客户端的密钥：
+ 要创建初始证书，请打开终端并执行以下操作：
  + `git clone` [https://github.com/OpenVPN/easy-rsa](https://github.com/OpenVPN/easy-rsa)
  + `cd easy-rsa`
  + `./easyrsa3/easyrsa init-pki`
  + `./easyrsa3/easyrsa build-ca nopass`
  + `./easyrsa3/easyrsa build-server-full server nopass`
  + `./easyrsa3/easyrsa build-client-full client1.domain.tld nopass`

  **pki** 子目录包含将在 **easy-rsa** 下创建的证书。
+ 将服务器证书提交给 AWS Certificate Manager（ACM）：
  + 在 ACM 控制台上，选择 **Certificate Manager**。
  + 选择**导入证书**。
  + 将 `easy-rsa/pki/issued/server.crt` 文件中提供的公有密钥证书输入到**证书文本**字段中。
  + 在 **Certificate private key（证书私有密钥）**中 `easy-rsa/pki/private/server.key` 的粘贴可用私有密钥。确保选择 `BEGIN AND END PRIVATE KEY` 之间的所有行（包括 `BEGIN` 和 `END` 行）。
  + 将 `easy-rsa/pki/ca.crt` 文件中提供的 CA 公用密钥粘贴到**证书链**字段中。
  + 选择**查看并导入**。
  + 选择**导入**。

  要使用 AWS CLI 将服务器的证书提交给 ACM，请运行以下命令：`aws acm import-certificate --certificate fileb://easy-rsa/pki/issued/server.crt --private-key file://easy-rsa/pki/private/server.key --certificate-chain file://easy-rsa/pki/ca.crt --region region`

  请记下证书 ARN 以供将来使用。

### 配置 AWS 客户端 VPN 组件
<a name="configure-vpn-components"></a>

**使用 AWS 控制台**

在 AWS 控制台上，选择 **Services（服务）**，然后选择 **VPC**。

在**虚拟专用网**下，选择**客户端 VPN 终端节点**并执行以下操作：

**配置 AWS Client VPN 组件**
+ 选择**创建客户端 VPN 端点**。
+ 指定以下选项：
  + **客户端 IPv4 CIDR**：使用具有至少 /22 范围的网络掩码的专用网络。确保所选子网与 VPC 网络的地址不冲突。示例：10.0.0.0/22。
  + 在**服务器证书 ARN** 中，选择之前导入的证书的 ARN。
  + 选择**使用双向身份验证**。
  + 在**客户端证书 ARN** 中，选择之前导入的证书的 ARN。
  + 选择**创建客户端 VPN 端点**。

**使用 AWS CLI**

运行以下命令：

`aws ec2 create-client-vpn-endpoint --client-cidr-block "10.0.0.0/22" --server-certificate-arn arn:aws:acm:us-east-1:012345678912:certificate/0123abcd-ab12-01a0-123a-123456abcdef --authentication-options Type=certificate-authentication,,MutualAuthentication={ClientRootCertificateChainArn=arn:aws:acm:us-east-1:012345678912:certificate/123abcd-ab12-01a0-123a-123456abcdef} --connection-log-options Enabled=false `

输出示例：

`"ClientVpnEndpointId": "cvpn-endpoint-0123456789abcdefg", "Status": { "Code": "pending-associate" }, "DnsName": "cvpn-endpoint-0123456789abcdefg.prod.clientvpn.us-east-1.amazonaws.com" } `

**将目标网络关联到 VPN 终端节点**
+ 选择新的 VPN 终端节点，然后选择**关联**选项卡。
+ 选择**关联**并指定以下选项。
  + **VPC**：选择 MemoryDB 集群的 VPC。
  + 选择其中一个 MemoryDB 集群的网络。如果有疑问，请在 MemoryDB 控制面板上查看**子网组** 中的网络。
  + 选择**关联**。如有必要，请为其余网络重复执行这些步骤。

**使用 AWS CLI**

运行以下命令：

`aws ec2 associate-client-vpn-target-network --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdefg --subnet-id subnet-0123456789abdcdef`

输出示例：

`"Status": { "Code": "associating" }, "AssociationId": "cvpn-assoc-0123456789abdcdef" } `

**查看 VPN 安全组**

VPN 终端节点将自动采用 VPC 的默认安全组。检查入站和出站规则，并确认安全组是否允许从 VPN 网络（在 VPN 端点设置中定义）到服务端口上的 MemoryDB 网络的流量（默认情况下，对于 Redis 为 6379）。

如果您需要更改分配给 VPN 终端节点的安全组，请按以下步骤操作：
+ 选择当前安全组。
+ 选择**应用安全组**。
+ 选择新的安全组。

**使用 AWS CLI**

运行以下命令：

`aws ec2 apply-security-groups-to-client-vpn-target-network --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdefga  --vpc-id vpc-0123456789abdcdef --security-group-ids sg-0123456789abdcdef`

输出示例：

`"SecurityGroupIds": [ "sg-0123456789abdcdef" ] } `

**注意**  
MemoryDB 安全组还需要允许来自 VPN 客户端的流量。根据 VPC 网络，客户端的地址将被 VPN 终端节点地址掩盖。因此，在 MemoryDB 安全组上创建入站规则时，请考虑 VPC 网络（而不是 VPN 客户端的网络）。

**授权 VPN 访问目标网络**

在**授权**选项卡上，选择**授权入口**并指定以下内容：
+ 启用访问的目标网络：使用 0.0.0.0/0 以允许访问任何网络（包括互联网），或限制 MemoryDB 网络/主机。
+ 在**授予访问权限：**下，选择**允许访问所有用户**。
+ 选择**添加授权规则**。

**使用 AWS CLI**

运行以下命令：

`aws ec2 authorize-client-vpn-ingress --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdefg --target-network-cidr 0.0.0.0/0 --authorize-all-groups`

输出示例：

`{ "Status": { "Code": "authorizing" } }`

**允许从 VPN 客户端访问 Internet**

如果您需要通过 VPN 浏览 Internet，则需要创建一个额外的路由。选择**路由表**选项卡，然后单击**创建路由**。
+ 路由目的地：0.0.0.0/0
+ **目标 VPC 子网 ID**：选择可访问 Internet 的关联子网之一。
+ 选择**创建路由**。

**使用 AWS CLI**

运行以下命令：

`aws ec2 create-client-vpn-route --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdefg --destination-cidr-block 0.0.0.0/0 --target-vpc-subnet-id subnet-0123456789abdcdef`

输出示例：

`{ "Status": { "Code": "creating" } } `

### 配置 VPN 客户端
<a name="configure-vpn-client"></a>

在 AWS Client VPN 控制面板上，选择最近创建的 VPN 端点，然后选择 **Download Client Configuration（下载客户端配置）**。复制配置文件，以及文件 `easy-rsa/pki/issued/client1.domain.tld.crt` 和 `easy-rsa/pki/private/client1.domain.tld.key`。编辑配置文件并更改或添加以下参数：
+ cert：添加一个新行，其参数证书指向 `client1.domain.tld.crt` 文件。使用到文件的完整路径。示例：`cert /home/user/.cert/client1.domain.tld.crt`
+ cert: key：添加一个新行，其参数键指向 `client1.domain.tld.key` 文件。使用到文件的完整路径。示例：`key /home/user/.cert/client1.domain.tld.key`

使用以下命令建立 VPN 连接：`sudo openvpn --config downloaded-client-config.ovpn`

**撤消访问权限**

如果您需要使来自特定客户端密钥的访问失效，则需要在 CA 中撤消该密钥。然后，将吊销列表提交到 AWS Client VPN。

使用 easy-rsa 撤消密钥：
+ `cd easy-rsa`
+ `./easyrsa3/easyrsa revoke client1.domain.tld`
+ 输入“是” 以继续，或输入任何其他输入以中止。

  `Continue with revocation: `yes` ... * `./easyrsa3/easyrsa gen-crl`
+ 已创建更新的 CRL。CRL 文件：`/home/user/easy-rsa/pki/crl.pem`

将吊销列表导入到 AWS Client VPN：
+ 在 AWS 管理控制台 上，选择**服务**，然后选择 **VPC**。
+ 选择**客户端 VPN 端点**。
+ 选择客户端 VPN 端点，然后选择**操作** -> **导入客户端证书 CRL**。
+ 查看 `crl.pem` 文件的内容。

**使用 AWS CLI**

运行以下命令：

`aws ec2 import-client-vpn-client-certificate-revocation-list --certificate-revocation-list file://./easy-rsa/pki/crl.pem --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdefg `

输出示例：

`Example output: { "Return": true } `