# 背景介绍
在亚马逊云科技使用 Amazon NAT Gateway 让私有子网中的资源服务可以访问 Internet 是非常常见的场景,但是随着业务流量的不断上涨,NAT 网关的成本费用也不断增加。借助聚云科技云成本管理与优化平台 —— SavingsNow ,我们看到某客户一周每天 NAT 网关的费用构成主要为三部分费用,费用大头为NatGateway-Bytes(NAT 网关数据处理费用)。
* NatGateway-Bytes(NAT 网关数据处理费用)
* DataTransfer-Regional-Bytes / DataTransfer-Out-Bytes(数据传输费用)
* NatGateway-Hours(NAT 网关小时费率)
![1.png](https://dev-media.amazoncloud.cn/ec37a0a7e9fc4b69b52588ae5c120d31_1.png "1.png")
SavingsNow NAT 网关成本分析
### NAT 网关定价
以美国东部(俄亥俄)为例:
* NAT 网关小时费率:NAT 网关按小时收费。对于该区域,费率为每小时 0.045 USD。
* NAT 网关数据处理费用:1GB 数据通过 NAT 网关。数据处理费用为 0.045 USD。
* 数据传输费用:标准 EC2 数据传输费用。
区域间价格存在差异,具体详情可参考官方定价:
https\://aws.amazon.com/cn/vpc/pricing/
# 方案介绍
想要优化 NAT 网关的成本,特别是优化 NAT 网关数据处理费用,就需要找出哪些流量通过了 NAT 网关,这时可以通过借助 VPC Flowlog 记录 NAT 网关的流量日志,使用 Athena 分析流量日志,找到可以优化的 NAT 网关流量。
本文主要介绍如何查找、分析和优化 NAT 网关的费用。如果想长期观察 NAT 网关的流量数据,可以结合 [Amazon QuickSight](https://aws.amazon.com/cn/quicksight/?trk=cndc-detail) 服务,配置可视化数据报表。
![2.png](https://dev-media.amazoncloud.cn/b8cccfe8fdbf4ca18dba97fc663e83a1_2.png "2.png")
NAT 网关数据分析流程
## 服务介绍
### Amazon NAT Gateway
Amazon NAT Gateway是亚马逊云科技网络服务([Amazon VPC](https://aws.amazon.com/cn/vpc/?trk=cndc-detail))中一种托管的网络地址转换(NAT)服务。允许私有子网中的实例通过 NAT Gateway 与公共 Internet 通信,同时保持实例的私有IP地址不可公开访问。
### VPC Flow Logs
VPC Flow Logs 是亚马逊云科技的一项功能,用于提供有关 Amazon Virtual Private Cloud(VPC)中网络流量的详细信息。
### Amazon Athena
[Amazon Athena](https: //aws.amazon.com/cn/athena/?trk=cndc-detail) 是一种交互式查询服务,能够轻松使用标准 [SQL](https://docs.aws.amazon.com/zh_cn/athena/latest/ug/ddl-sql-reference.html) 直接分析 [Amazon Simple Storage Service](https://aws.amazon.com/cn/s3/?trk=cndc-detail) ([Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail)) 中的数据。只需在 AWS Management Console 中执行几项操作,即可将 Athena 指向 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 中存储的数据,并开始使用标准 SQL 运行临时查询,然后在几秒钟内获得结果。
# 实施步骤
## 创建 NAT Flowlog
1. 找到 NAT 网关对应的网络接口 ENI
![3.png](https://dev-media.amazoncloud.cn/1e678788b11e41f5af917867e561d1d7_3.png "3.png")
2. 创建 NAT ENI 的 Flowlog,选择存储到 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail)中
![4.png](https://dev-media.amazoncloud.cn/8ccf9ebaa90f4c5a80400cd50b91401f_4.png "4.png")
![5.png](https://dev-media.amazoncloud.cn/4280634654664bd4a633173fd75eace8_5.png "5.png")
4. 等待[Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 数据产生
![6.png](https://dev-media.amazoncloud.cn/1a21539fab70424c926a0b0a42dc8264_6.png "6.png")
## NAT 网关流量分析
使用 [Amazon Athena](https: //aws.amazon.com/cn/athena/?trk=cndc-detail) 查询和分析存储在 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 中的 NAT 网关流量日志
1. 设置查询结果临时存储位置
![7.png](https://dev-media.amazoncloud.cn/04c91227de3a474fbd7616e04e8902d7_7.png "7.png")
2. 创建数据库
```SQL
create database vpc_flowlog;
```
3. 创建表
```Bash
CREATE EXTERNAL TABLE `nat_flowlogs_20230907`(
`account` string,
`action` string,
`azid` string,
`numbytes` bigint,
`destinationaddress` string,
`destinationport` int,
`endtime` int,
`flowdirection` string,
`instanceid` string,
`interfaceid` string,
`logstatus` string,
`numpackets` int,
`pktdstawsservice` string,
`pktdstaddr` string,
`pktsrcawsservice` string,
`pktsrcaddr` string,
`protocol` int,
`aws_region` string,
`sourceaddress` string,
`sourceport` int,
`starttime` int,
`sublocationid` string,
`sublocationtype` string,
`subnetid` string,
`tcpflags` int,
`trafficpath` string,
`type` string,
`version` int,
`vpcid` string)
PARTITIONED BY (
`region` string,
`day` string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://vpc-flowlog/flowlog-nat/AWSLogs/1234567890/vpcflowlogs'
TBLPROPERTIES (
'projection.day.format'='yyyy/MM/dd',
'projection.day.range'='2021/01/01,NOW',
'projection.day.type'='date',
'projection.enabled'='true',
'projection.region.type'='enum',
'projection.region.values'='us-east-1,us-west-2,ap-south-1,eu-west-1',
'skip.header.line.count'='1',
'storage.location.template'='s3://vpc-flowlog/flowlog-nat/AWSLogs/1234567890/vpcflowlogs/\${region}/\${day}',
'transient_lastDdlTime'='1689646835')
```
![](https://cheeth-mobile.feishu.cn/space/api/box/stream/download/asynccode/?code=ZGQ4MTA3NmQ1YTA2YWRlNzlmMzI3YzZlNmQ3ZmViYzJfMFdzV0Z1MGlPNmlDTEJOZzZIa3NsRmZJRnlabVZKZG1fVG9rZW46QjN6M2JTVHhBb3A5cU14Qk9OVGNIaEpCblFoXzE2OTQ0ODYwMTg6MTY5NDQ4OTYxOF9WNA)
4. 使用 SQL 查询 NAT 网关流量日志
提供一些查询示例,通过 SQL 查询找出流量统计排行靠前的 IP 地址,通过 IP 地址确认对应资源。
###### 入流量 TOP20 排名
```Bash
SELECT "destinationaddress", sum("numbytes")/1024/1024/1024 as "GB" FROM "vpc_flowlog"."nat_flowlogs_20230907"
group by 1 order by 2 desc
limit 20;
```
###### 出流量 TOP20 排名
```Bash
SELECT "sourceaddress", sum("numbytes")/1024/1024/1024 as "GB" FROM "vpc_flowlog"."nat_flowlogs_20230907"
group by 1 order by 2 desc
limit 20;
```
###### 按出、入 IP 分组的流量 TOP20 排名
```Bash
SELECT "sourceaddress","destinationaddress", sum("numbytes")/1024/1024/1024 as "GB" FROM "vpc_flowlog"."nat_flowlogs_20230907"
group by 1,2 order by 3 desc
limit 20;
```
# 优化总结
通过分析 NAT 网关流量日志,找到流量占比TOP 的IP 地址,通过IP 地址可以在网络接口(ENI)服务内确认对应资源,分析高流量产生的原因。关于NAT 网关的成本优化有几点建议可供参考:
* 确认发送流量最多的实例是否与 NAT 网关是否位于同一可用区。如果未在同一可用区,则在与实例相同的可用区中创建新的 NAT 网关,从而降低跨可用区传输数据的费用。
* 确认发送流量较多的实例,是否为AWS VPC 内服务,例如 LB 等。可为服务新增内网 LB,从公网 LB切换为内网LB,让访问流量走VPC内部,避免通过 NAT 网关访问而产生费用。
* 确认大多数 NAT 网关流量是否流向同一区域的 S3 或 DynamoDB,如果是的话,则创建网关 VPC 终端节点。通过网关 VPC 终端节点来路由发往和来自 AWS 资源的流量,而不是通过 NAT 网关。使用网关 VPC 终端节点不会产生数据处理费或小时收费。如果通过 NAT 网关的大多数流量流向支持接口 VPC 终端节点的 AWS 服务,则为相关服务创建接口 VPC 终端节点。
* 如果大多数互联网流量发往非 AWS 资源,请考虑为生成流量较高的实例使用互联网网关,并通过配合安全组和网络 ACL 来阻止对实例的未经授权访问。要通过互联网网关进行连接,实例必须位于公有子网中,并且必须拥有一个公有 IP 或弹性 IP 地址。