

# 适用于 DynamoDB 的 AWS PrivateLink
<a name="privatelink-interface-endpoints"></a>

借助适用于 DynamoDB 的 AWS PrivateLink，您可以在 Virtual Private Cloud（Amazon VPC）中预置*接口 Amazon VPC 端点*（接口端点）。这些端点可从本地（通过 VPN 及 Direct Connect）或其它 AWS 区域（通过 [Amazon VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)）中的应用程序直接访问。使用 AWS PrivateLink 和接口端点，您可以简化应用程序与 DynamoDB 之间的私有网络连接。

VPC 中的应用程序无需公有 IP 地址，即可使用 VPC 接口端点与 DynamoDB 通信来执行 DynamoDB 操作。接口端点由一个或多个弹性网络接口（ENI）表示，这些接口是从 Amazon VPC 中的子网分配的私有 IP 地址。通过接口端点向 DynamoDB 发出的请求仍留在 Amazon 网络上。您还可以通过 AWS Direct Connect 或 AWS Virtual Private Network（Site-to-Site VPN）从本地部署应用程序访问 Amazon VPC 中的接口端点。有关如何将 Amazon VPC 与本地网络连接的更多信息，请参阅 [Direct Connect 用户指南](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)和 [AWS Site-to-Site VPN 用户指南](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)。

有关接口端点的一般信息，请参阅《AWS PrivateLink 指南》**中的[接口 Amazon VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)。Amazon DynamoDB Streams 端点也支持 AWS PrivateLink。有关更多信息，请参阅 [适用于 DynamoDB Streams 的 AWS PrivateLink](privatelink-streams.md)。

**Topics**
+ [适用于 Amazon DynamoDB 的 Amazon VPC 端点类型](#types-of-vpc-endpoints-for-ddb)
+ [使用适用于 Amazon DynamoDB 的 AWS PrivateLink 时的注意事项](#privatelink-considerations)
+ [创建 Amazon VPC 端点](#ddb-creating-vpc)
+ [访问 Amazon DynamoDB 接口端点](#accessing-ddb-interface-endpoints)
+ [从 DynamoDB 接口端点访问 DynamoDB 表并控制 API 操作](#accessing-tables-apis-from-interface-endpoints)
+ [更新本地 DNS 配置](#updating-on-premises-dns-config)
+ [为 DynamoDB 创建 Amazon VPC 端点策略](#creating-vpc-endpoint-policy)
+ [将 DynamoDB 端点与 AWS 管理控制台私有访问结合使用](#ddb-endpoints-private-access)
+ [适用于 DynamoDB Streams 的 AWS PrivateLink](privatelink-streams.md)
+ [使用适用于 DynamoDB Accelerator（DAX）的 AWS PrivateLink](dax-private-link.md)

## 适用于 Amazon DynamoDB 的 Amazon VPC 端点类型
<a name="types-of-vpc-endpoints-for-ddb"></a>

您可以使用两种类型的 Amazon VPC 端点访问 Amazon DynamoDB：*网关端点*和*接口端点*（使用 AWS PrivateLink）。*网关端点*是您在路由表中指定的网关，用于通过 AWS 网络从 Amazon VPC 访问 DynamoDB。*接口端点*通过私有 IP 地址将请求从您的 Amazon VPC 内部、本地或其它 AWS 区域中的 Amazon VPC，使用 Amazon VPC 对等连接或 AWS Transit Gateway 路由到 DynamoDB，从而扩展网关端点的功能。有关更多信息，请参阅 [What is Amazon VPC peering?](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 和 [Transit Gateway 与 Amazon VPC 对等连接](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/transit-gateway-vs-vpc-peering.html)。

接口端点与网关端点兼容。如果您在 Amazon VPC 中有现有网关端点，则可以在同一 Amazon VPC 中使用这两种类型的端点。


|  适用于 DynamoDB 的网关端点  |  适用于 DynamoDB 的接口端点  | 
| --- | --- | 
|  在这两种情况下，您的网络流量仍保留在 AWS 网络中。  | 
|  使用 Amazon DynamoDB 公有 IP 地址  |  使用 Amazon VPC 中的私有 IP 地址访问 Amazon DynamoDB  | 
|  不允许从本地访问  |  允许从本地访问  | 
|  不允许从其他 AWS 区域访问  |  允许从另一个 AWS 区域中的 Amazon VPC 端点使用 Amazon VPC 对等连接或 AWS Transit Gateway 进行访问  | 
|  不计费  |  计费  | 

有关网关端点的更多信息，请参阅《AWS PrivateLink 指南》**中的[网关 Amazon VPC 端点](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-gateway.html)。

## 使用适用于 Amazon DynamoDB 的 AWS PrivateLink 时的注意事项
<a name="privatelink-considerations"></a>

适用于 Amazon DynamoDB 的 AWS PrivateLink 的适用 Amazon VPC 注意事项。有关更多信息，请参阅《AWS PrivateLink 指南》**中的[接口端点注意事项](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations)和 [AWS PrivateLink 限额](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)。此外，以下限制将适用：

适用于 Amazon DynamoDB 的 AWS PrivateLink 不支持以下各项：
+ 传输层安全性协议（TLS）1.1
+ 私有域名系统和混合域名系统（DNS）服务

**重要**  
请勿创建私有托管区来覆盖 DynamoDB 端点 DNS 名称（例如 `dynamodb.region.amazonaws.com` 或 `*.region.amazonaws.com`），以便将流量路由到您的接口端点。DynamoDB DNS 配置可能会随着时间推移而发生变化。  
 自定义 DNS 覆盖与这些更改不兼容，可能导致请求意外通过公有 IP 地址而不是您的接口端点进行路由。  
 要通过 AWS PrivateLink 访问 DynamoDB，请将您的客户端配置为直接使用 Amazon VPC 端点 URL（例如 `https://vpce-1a2b3c4d-5e6f.dynamodb.region.vpce.amazonaws.com`）。

对于您启用的每个 AWS PrivateLink 端点，您每秒最多可以提交 5 万个请求。

**注意**  
AWS PrivateLink 端点的网络连接超时不在 DynamoDB 错误响应的范围内，需要由连接到 PrivateLink 端点的应用程序适当进行处理。

## 创建 Amazon VPC 端点
<a name="ddb-creating-vpc"></a>

要创建 Amazon VPC 接口端点，请参阅《AWS PrivateLink 指南》**中的[创建 Amazon VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

## 访问 Amazon DynamoDB 接口端点
<a name="accessing-ddb-interface-endpoints"></a>

创建接口端点时，DynamoDB 会生成两种特定于端点的 DynamoDB DNS 名称：*区域*和*可用区*。
+ *区域* DNS 名称包括唯一的 Amazon VPC 端点 ID、服务标识符、AWS 区域和以其命名的 `vpce.amazonaws.com`。例如，对于 Amazon VPC 端点 ID `vpce-1a2b3c4d`，生成的 DNS 名称可能类似于 `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`。
+ *区域* DNS 名称包括可用区 – 例如 `vpce-1a2b3c4d-5e6f-us-east-1a.dynamodb.us-east-1.vpce.amazonaws.com`。如果您的架构隔离了可用区，则可以使用此选项。例如，您可以将其用于故障控制或降低区域数据传输成本。

**注意**  
为了实现最佳可靠性，我们建议将您的服务部署在至少三个可用区中。

## 从 DynamoDB 接口端点访问 DynamoDB 表并控制 API 操作
<a name="accessing-tables-apis-from-interface-endpoints"></a>

您可以使用 AWS CLI 或 AWS SDK 通过 DynamoDB 接口端点访问 DynamoDB 表并控制 API 操作。

### AWS CLI 示例
<a name="privatelink-ddb-aws-cli-examples"></a>

要使用 AWS CLI 命令通过 DynamoDB 接口端点访问 DynamoDB 表或 DynamoDB 控制 API 操作，请使用 `--region` 和 `--endpoint-url` 参数。

**示例：创建 VPC 端点**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**示例：修改 VPC 端点**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**示例：使用端点 URL 列出表**

在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 的 DNS 名称替换为您自己的信息。

```
aws dynamodb --region us-east-1 --endpoint https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com list-tables
```

### AWS SDK 示例
<a name="privatelink-ddb-aws-sdk-examples"></a>

要在使用 AWS SDK 时通过 DynamoDB 接口端点访问 DynamoDB 表或 DynamoDB 控制 API 操作，请将 SDK 更新为最新版本。然后，将客户端配置为使用端点 URL 通过 DynamoDB 接口端点访问表或 DynamoDB 控制 API 操作。

------
#### [ SDK for Python (Boto3) ]

**示例：使用端点 URL 访问 DynamoDB 表**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
ddb_client = session.client(
service_name='dynamodb',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**示例：使用端点 URL 访问 DynamoDB 表**  
在以下示例中，将区域 `us-east-1` 和 VPC 端点 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com` 替换为您自己的信息。

```
//client build with endpoint config  
final AmazonDynamoDB dynamodb = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**示例：使用端点 URL 访问 DynamoDB 表**  
在以下示例中，将区域 us-east-1 和 VPC 端点 ID https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com 替换为您自己的信息。

```
Region region = Region.US_EAST_1;
dynamoDbClient = DynamoDbClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## 更新本地 DNS 配置
<a name="updating-on-premises-dns-config"></a>

 使用特定于端点的 DNS 名称访问适用于 DynamoDB 的接口端点时，您无需更新本地 DNS 解析程序。您可以使用来自公有 DynamoDB DNS 域的接口端点的私有 IP 地址解析特定于端点的 DNS 名称。

### 使用接口端点访问 DynamoDB，无需 Amazon VPC 中的网关端点和互联网网关
<a name="using-interface-endpoints"></a>

Amazon VPC 中的接口端点可以通过 Amazon 网络将 Amazon VPC 内的应用程序和本地应用程序路由到 DynamoDB，如下图所示。

![\[数据流程图，显示了使用接口端点和 AWS PrivateLink 从本地和 Amazon VPC 内的应用程序对 DynamoDB 的访问。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/PrivateLink-interfaceEndpoints.png)


下图说明了以下内容：
+ 您的本地网络使用 Direct Connect 或者 Site-to-Site VPN 连接到 Amazon VPC A。
+ 本地和 Amazon VPC A 中的应用程序使用特定于端点的 DNS 名称通过 DynamoDB 接口端点访问 DynamoDB。
+ 本地应用程序通过 Direct Connect（或 Site-to-Site VPN）将数据发送到 Amazon VPC 中的接口端点。AWS PrivateLink 通过 AWS 网络将数据从接口端点移动到 DynamoDB。
+ Amazon VPC 中的应用程序还向接口端点发送通信。AWS PrivateLink 通过 AWS 网络将数据从接口端点移动到 DynamoDB。

### 在同一 Amazon VPC 中同时使用网关端点和接口端点来访问 DynamoDB
<a name="using-gateway-and-interface-endpoints"></a>

您可以创建接口端点并将现有网关端点保留在同一 Amazon VPC 中，如下图所示。通过这种方法，您可以允许 Amazon VPC 内的应用程序继续通过网关端点访问 DynamoDB，而无需付费。然后，只有您的本地应用程序才会使用接口端点访问 DynamoDB。要通过这种方式访问 DynamoDB，您必须更新本地应用程序，以使用适用于 DynamoDB 的特定于端点的 DNS 名称。

![\[数据流程图，显示了同时使用网关端点和接口端点访问 DynamoDB 的情况。\]](http://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/images/PL-Image2-InterfaceAndGatewayEP.png)


下图说明了以下内容：
+ 本地应用程序使用特定于端点的 DNS 名称通过 Direct Connect（或 Site-to-Site VPN）将数据发送到 Amazon VPC 中的接口端点。AWS PrivateLink 通过 AWS 网络将数据从接口端点移动到 DynamoDB。
+ 使用默认的区域 DynamoDB 名称，Amazon VPC 内应用程序会将数据发送到通过 AWS 网络连接到 DynamoDB 的网关端点。

有关网关端点的更多信息，请参阅《Amazon VPC 用户指南》**中的[网关 Amazon VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)。

## 为 DynamoDB 创建 Amazon VPC 端点策略
<a name="creating-vpc-endpoint-policy"></a>

您可以为 Amazon VPC 端点附加控制对 DynamoDB 的访问的端点策略。该策略指定以下信息：
+ 可执行操作的 AWS Identity and Access Management (IAM) 主体 
+ 可执行的操作 
+ 可对其执行操作的资源 

**Topics**
+ [示例：限制从 Amazon VPC 端点对特定表的访问](#privatelink-example-restrict-access-to-bucket)

### 示例：限制从 Amazon VPC 端点对特定表的访问
<a name="privatelink-example-restrict-access-to-bucket"></a>

您可以创建限制只能访问特定 DynamoDB 表的端点策略。如果您的 Amazon VPC 中有使用表的其它 AWS 服务，这种策略会非常有用。以下表策略限制为仅可访问 `DOC-EXAMPLE-TABLE`。要使用此端点策略，请将 `DOC-EXAMPLE-TABLE` 替换为您的表的名称。

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

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-table-only",
      "Principal": "*",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE",
                   "arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE/*"]
    }
  ]
}
```

------

## 将 DynamoDB 端点与 AWS 管理控制台私有访问结合使用
<a name="ddb-endpoints-private-access"></a>

当您在 [AWS 管理控制台私有访问](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)中将 VPC 端点与 [DynamoDB 控制台](https://console.aws.amazon.com/dynamodb)结合使用时，必须为 DynamoDB 和 DynamoDB Streams 设置 DNS 配置。

要将 DynamoDB 配置为可在 AWS 管理控制台私有访问中访问，您必须创建以下两个 VPC 端点：
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

创建 VPC 端点时，请导航到 Route53 控制台，然后使用区域端点 `dynamodb.us-east-1.amazonaws.com` 为 DynamoDB 创建私有托管区。

在私有托管区中创建以下两个别名记录：
+ `dynamodb.<region>.amazonaws.com` 将流量路由到 VPC 端点 `com.amazonaws.<region>.dynamodb`。
+ `streams.dynamodb.<region>.amazonaws.com` 将流量路由到 VPC 端点 `com.amazonaws.<region>.dynamodb-streams`。