如何通过Athena查询NAT网关中CloudWatch相关的VPC流量日志
筛选NAT网关产生的CloudWatch流量Athena查询方案
要从VPC流日志中统计经过NAT网关的CloudWatch相关流量,你可以结合NAT网关标识、CloudWatch服务的IP/端口特征编写查询,以下是几种实用方案:
1. 基于NAT网关ID的精准查询
已知NAT网关ID(格式为nat-xxxxxxx)时,直接筛选该网关的流量,再匹配CloudWatch的HTTPS流量(putLogEvents操作走443端口):
SELECT dstaddr, SUM(bytes) AS total_bytes, COUNT(*) AS flow_count FROM twgflowlogs.awslogs WHERE -- 指定目标NAT网关ID instance_id = 'nat-xxxxxxxxx' -- CloudWatch API/Logs操作均使用HTTPS(443端口) AND dstport = 443 -- 替换为你所在区域的CloudWatch服务CIDR范围 AND dstaddr IN CIDR('52.23.0.0/16', '52.46.0.0/16') GROUP BY dstaddr ORDER BY total_bytes DESC;
2. 基于NAT网关弹性网卡(ENI)的查询
不确定NAT网关ID时,可通过其绑定的弹性网卡ID(eni-xxxxxxx)筛选流量:
SELECT dstaddr, SUM(bytes) AS total_bytes, COUNT(*) AS flow_count FROM twgflowlogs.awslogs WHERE -- 指定NAT网关的弹性网卡ID interface_id = 'eni-xxxxxxxxx' AND dstport = 443 -- 替换为你区域的CloudWatch CIDR AND dstaddr IN CIDR('52.23.0.0/16', '52.46.0.0/16') GROUP BY dstaddr ORDER BY total_bytes DESC;
3. 利用流日志服务分类字段(推荐)
如果你的VPC流日志创建时开启了服务分类功能,会自动生成aws_service字段,无需手动找IP段,直接匹配CloudWatch相关服务即可:
SELECT dstaddr, SUM(bytes) AS total_bytes, COUNT(*) AS flow_count FROM twgflowlogs.awslogs WHERE -- 匹配所有NAT网关(ID以nat-开头) instance_id LIKE 'nat-%' -- 筛选CloudWatch核心服务 AND aws_service IN ('AMAZON_CLOUDWATCH', 'AMAZON_CLOUDWATCH_LOGS') AND dstport = 443 GROUP BY dstaddr ORDER BY total_bytes DESC;
补充说明
- 获取区域CloudWatch CIDR:通过AWS CLI执行
aws ec2 describe-prefix-lists --prefix-list-names com.amazonaws.<你的区域>.cloudwatch com.amazonaws.<你的区域>.logs,返回结果中的cidrBlockSet就是该区域的CloudWatch服务IP范围。 - 评估接口端点效果:创建CloudWatch VPC接口端点后,VPC内资源访问CloudWatch会走私有网络,不再占用NAT网关流量。你可以在创建端点前后分别运行上述查询,对比
total_bytes的差值,直观看到节省的NAT流量。
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

