使用 Amazon Athena + Flowlog 分析优化 NAT Gateway 流量

NAT
Amazon Athena
Amazon QuickSight
Amazon VPC
Apache Spark support on Amazon Athena
0
1
# 背景介绍 在亚马逊云科技使用 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 地址。
目录
亚马逊云科技解决方案 基于行业客户应用场景及技术领域的解决方案
联系亚马逊云科技专家
亚马逊云科技解决方案
基于行业客户应用场景及技术领域的解决方案
联系专家
1
目录
关闭