To start with, I would take off the sum() to be sure you're not summing over multiple instances or interfaces. That is, try this query instead:
rate(node_network_receive_bytes_total{instance=~"ip-10-XX-XXX-44.us-west-2.compute.internal",device="eth0"}[5m])
Does that give one result, or multiple? If it's multiple then you'll need to investigate why. (For example: is instance=~ matching multiple instances? Are you doing federation so you have multiple copies of the same metric?)
If it's only a single result, and it's still showing around 22.5MB/sec, then you could always escalate to AWS support, to ask them why their traffic metering doesn't matching what is seen at the host. But since AWS is recording traffic levels 5 times lower than what node_exporter sees, you might want to keep it to yourself :-)
The other things I'd do are:
- look at node_network_transmit_bytes_total, and the corresponding AWS transmit metric. Maybe they consider "send" and "receive" the other way round.
- treble-check that you're looking at the same instance
- look at what proportion of packets are broadcast/multicast [compare node_network_receive_packets_total and node_network_receive_multicast_total] - those probably don't count towards ingress/egress totals
- look at what proportion of traffic is going between hosts on the same LAN, e.g. using
sniffnet.net. It could be that AWS are only counting Internet ingress traffic, not local traffic.
Personally I'd trust node_exporter more than AWS: that AWS line is suspiciously flat.