Cloudwatch 是否不从 Cloudfront 记录 Lambda 函数?

Does Cloudwatch not log Lambda functions from Cloudfront?

Cloudfront 是否需要特殊设置才能触发日志?

我有以下流程:

Devices -> Cloudfront -> API Gateway -> Lambda Function

有效,但 Cloudwatch 似乎没有为 lambda 函数(或 API 网关)创建日志。 但是,以下流程会创建日志:

Web/Curl -> API Gateway -> Lambda Function

在上面的评论中,我们似乎得出了一个结论,即未预料到的 client-side 缓存(或缓存在客户端和 AWS 基础设施之间的某处)可能是对观察到的行为的更合适的解释,因为独立的 CloudFront 分发可以通过 API 网关访问 Lambda 函数并导致这些请求不被 Lambda 记录的已知机制。

所以,我会用一种方法来回答这个问题,以确认或拒绝这个假设。

CloudFront 将 header 注入到请求和响应中,X-Amz-Cf-Id,包含唯一标识请求和响应的不透明令牌。文档将这些称为 "encrypted,",但出于我们的目的,它们只是不透明的值,具有非常高的唯一性概率。

尽管名称相同,但请求 header 和响应 header 实际上是两个不相关的值(它们在同一 request/response 上不匹配) .

origin-sideX-Amz-Cf-Id发送到源站的请求只对AWS工程师真正有用,用于故障排除。

但是 CloudFront 在响应中编辑的 viewer-side X-Amz-Cf-Id return 对我们很有用,因为它不仅对每个响应都是唯一的(即使来自 CloudFront 缓存的响应也有每次获取相同的 object 时都会有不同的值),但它也会在 the CloudFront access logs 中显示为 x-edge-request-id(尽管文档似乎没有明确说明这一点)。

因此,如果客户端在多个响应中看到重复的 X-Amz-Cf-Id 值,则表明客户端内部或客户端与 CloudFront 之间(在客户端的网络或 ISP 中)存在某些导致缓存响应的原因给客户看。

将来自客户端的 X-Amz-Cf-Id 跨多个响应关联起来可能会有用(因为它们永远不应该相同)并且与 CloudFront 日志关联也可能有用,因为这会确认请求的时间戳,其中 CloudFront实际上生成了这个特定的响应。

tl;dr:在多个响应中观察到相同的 X-Amz-Cf-Id 意味着缓存发生在 AWS 的边界之外。


请注意,即使 CloudFront 允许 min/max/default TTL 影响 CloudFront 缓存 object 的时间长度,这些设置也不会影响任何下游或客户端缓存行为。源应该 return 正确 Cache-Control 响应 headers(例如 private, no-cache, no-store)以确保整个链的正确缓存行为。如果无法更改原始行为,则可以使用 Lambda@Edge 原始响应或查看器响应触发器来注入适当的响应 headers -- 请参阅 this example on Server Fault.

另请注意,CloudFront 默认将 4xx/5xx 错误响应缓存 5 分钟。如果需要,请参阅 Amazon CloudFront Latency 了解禁用此行为的说明和步骤。此功能旨在让原始服务器休息一下,而不是用假定会继续失败的请求轰炸它。这种行为可能会导致测试和生产中的各种问题,因此在某些情况下应该禁用它。