

# 将 gRPC 与 CloudFront 分配结合使用
<a name="distribution-using-grpc"></a>

Amazon CloudFront 支持 gRPC，这是一种基于 HTTP/2 的开源远程过程调用（RPC，Remote Procedure Call）框架。gRPC 提供双向流和二进制协议缓冲区有效载荷，因此适用于需要低延迟通信的应用程序。

CloudFront 接收您的 gRPC 请求并将其直接代理到您的来源。您可以使用 CloudFront 来代理四种类型的 gRPC 服务：
+ 一元 RPC
+ 服务器流 RPC
+ 客户端流 RPC
+ 双向流 RPC

## gRPC 在 CloudFront 中的工作方式
<a name="how-grpc-works-cloudfront"></a>

要在 CloudFront 中配置 gRPC，请将提供 gRPC 服务的来源设置为分配的来源。您可以使用同时提供非 gRPC 和 gRPC 服务的来源。CloudFront 根据 `Content-Type` 标头确定传入的请求是 gRPC 请求还是 HTTP/HTTPS 请求。如果请求的 `Content-Type` 标头的值为 `application/grpc`，则该请求被视为 gRPC 请求，CloudFront 会将该请求代理到您的来源。

**注意**  
要启用分配来处理 gRPC 请求，请包含 HTTP/2 作为支持的 HTTP 版本之一，并允许 HTTP 方法，包括 `POST`。您的 gRPC 源端点必须配置为支持 HTTPS，因为 CloudFront 仅支持安全（基于 HTTPS）的 gRPC 连接。gRPC 仅支持端到端 HTTPS。如果您使用自定义源，请验证您的[协议](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy)设置是否支持 HTTPS。

要为您的分配启用 gRPC 支持，请完成以下步骤：

1. 更新分配的缓存行为来允许 HTTP 方法，包括 `POST` 方法。

1. 选择 `POST` 方法后，选中显示的 gRPC 复选框。

1. 将 **HTTP/2** 指定为支持的 HTTP 版本之一。

有关更多信息，请参阅以下主题：
+ [允许通过 HTTP/2 发出 gRPC 请求](DownloadDistValuesCacheBehavior.md#enable-grpc-distribution)
+ 《Amazon CloudFront API Reference**》中的 [GrpcConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GrpcConfig.html)

由于 gRPC 仅用于不可缓存的 API 流量，因此您的缓存配置不会影响 gRPC 请求。您可以使用源请求策略，将自定义标头添加到发送到您的 gRPC 来源的 gRPC 请求中。您可以 AWS WAF 与 CloudFront 配合使用来管理对 gRPC 分配的访问权限，控制机器人，并保护您的 gRPC 应用程序免受网络漏洞攻击。CloudFront gRPC 支持 [CloudFront Functions](cloudfront-functions.md)。

除 HTTPS 状态外，您还将随 gRPC 响应收到 grpc-status。有关 grpc-status 的可能值列表，请参阅[状态码及其在 gRPC 中的用法](https://grpc.github.io/grpc/core/md_doc_statuscodes.html)。

**备注**  
gRPC 不支持以下 CloudFront 功能：  
[自定义错误响应](GeneratingCustomErrorResponses.md)
 gRPC 不支持[来源失效转移](high_availability_origin_failover.md)，因为 gRPC 使用 `POST` 方法。只有当查看器请求的 HTTP 方法是 `GET`、`HEAD` 或 `OPTIONS` 时，CloudFront 才会故障转移到辅助源。
CloudFront 将 gRPC 请求直接代理到来源并绕过区域边缘缓存（REC）。由于 gRPC 会绕过 REC，因此 gRPC 不支持 [Lambda@Edge](lambda-at-the-edge.md) 或[源护盾](origin-shield.md)。
gRPC 不支持 AWS WAF 请求正文检查规则。如果您在分配的 Web ACL 上启用了这些规则，则任何使用 gRPC 的请求都将忽略请求正文检查规则。所有其他 AWS WAF 规则仍将适用。有关更多信息，请参阅 [为分配启用 AWS WAF](WAF-one-click.md)。