11 วิธีประหยัดค่า Data Transfer บน AWS
Tags: awsthai, architecture, vpc, datatransfer
Published: 2021-09-15 05:39:18

การใช้งานบริการต่างๆ บน AWS​ นั้นเป็นลักษณะที่เราจ่ายตามการใช้งานจริง (pay per use) ซึ่งรวมไปถึงเรื่องของการส่งข้อมูลด้วย ปกติแล้วค่าใช้จ่ายส่วนนี้มักจะเป็นส่วนน้อยเมื่อเทียบกับค่า Compute, Storage, RDS หรือบริการอื่นๆ แต่หากเราไม่ระวังตอนออกแบบและจัดการกับ flow ของข้อมูลไม่ดี ค่าใช้จ่ายส่วนนี้อาจจะสูงขึ้นโดยไม่คาดคิดได้  ในโพสต์นี้เราจะมาดูเทคนิคต่าง ๆ ที่สามารถช่วยประหยัดค่า Data Transfer ได้

ก่อนอื่นเรามาดูกันก่อนว่า ค่าใช้จ่ายหลักๆ ของการใช้งานเครือข่ายบน AWS มีอะไรบ้าง ราคาที่ใช้จะเป็นราคาใน AWS Region สิงคโปร์ขณะที่เขียนบทความ

### การส่งข้อมูลเข้าออกจาก AWS
* การนำข้อมูลเข้าจาก Internet มายัง AWS (inbound) โดยปกติจะไม่มีค่าใช้จ่าย แต่จะมีบางกรณี ที่ใช้งานร่วมกับบริการอื่นที่อาจจะมีค่าใช้บางส่วน ยกตัวอย่างเช่นเช่น
 * การ POST/PUT ข้อมูลจากผ่าน CloudFront มายัง Origin จะมีค่าบริการของ CloudFront อยู่ที่ $0.01/GB
 * การโหลดข้อมูลจาก Internet ผ่านทาง NAT Gateway สำหรับเครื่องที่อยู่ภายใน private subnet จะมีค่าบริการของ NAT Gatewayที่ $0.059/GB
* ค่าส่งข้อมูลออกจาก AWS ทาง Public Internet จะมีค่าใช้งานอยู่ที่ $0.12/GB สำหรับการส่งจาก EC2 และบริการส่วนใหญ่
	

### การส่งข้อมูลอยู่ภายใน AWS
* การส่งข้อมูลภายใน Availability Zone (AZ) เดียวกัน ฟรีไม่มีค่าใช้
* การส่งข้อมูลข้าม AZ ภายใน Region เดียวกัน คิดที่ $0.01/GB ทั้งขาเข้าและออก นั่นหมายถึงจะมีค่าใช้จ่ายรวม $0.02/GB สำหรับการส่งข้อมูลข้าม AZ
* การส่งข้อมูลข้าม AWS Region จะคิดค่าบริการต่างกันไปตามต้นทางและปลายทาง ยกตัวอย่างเช่น จาก Singapore ไป Tokyo มีค่าบริการที่ $0.09/GB
* ถ้ามีการใช้  Transit Gateway (TGW) ในการเชื่อมต่อระหว่าง VPC หรือ On-premise จะมีค่าประมวลผลข้อมูลอยู่ที่ $0.02/GB 
	
รายละเอียดอื่นๆ สามารถดูเพิ่มเติมได้ที่ [blog] (https://aws.amazon.com/blogs/architecture/overview-of-data-transfer-costs-for-common-architectures/) นี้ครับ มีทำสรุปไว้อ่านง่ายดี 

เราพอเข้าใจคร่าวๆ แล้วว่ามีค่าใช้จ่ายจากในการรับส่งและประมวลผลข้อมูลส่วนไหนบ้าง ทีนี้ลองมาดูวิธีการต่างๆ ที่จะช่วยประหยัดค่าใช้จ่ายกันเลย

## 1. เลือกวาง Resource ภายใน AZ เดียวกัน
การวาง Architecture ของระบบ เราอาจจะต้องเลือกใช้งานมากกว่า 1 AZ เพื่อให้ได้ Fault Tolerant ที่ต้องการ แต่ขณะเดียวกันควรคำนึงถึงเส้นทางของข้อมูลด้วย อย่างที่ทราบว่าการส่งข้อมูลภายใน AZ นั้นไม่มีค่าใช้จ่าย ดังนั้นเราควรจะเลือกวาง resource โดยเฉพาะที่ต้องส่งข้อมูลหากันในปริมาณมากๆ ให้อยู่บน AZ เดียวกันเท่าที่จะเป็นไปได้ 

ในกรณีที่มีการใช้งานหลายๆ AWS Account เราควรเลือกใช้ AZ ให้สอดคล้องกันระหว่าง Account ด้วย เช่นกำหนด AZ หลักหรือ AZ รอง เพื่อที่เราจะได้ Availability อย่างที่ต้องการและได้ optimize cost ด้วย มีข้อควรรู้อย่างนึงคือชื่อ AZ เช่น ap-southeast-1a, ap-southeast-1b ที่เราเห็นบน AWS แต่ละ  Account นั้น มีโอกาสที่จะ map ไปยัง AZ คนละที่กันได้ วิธีที่จะตรวจสอบให้แน่ชัด เราต้องเช็คจาก [AZ ID](https://docs.aws.amazon.com/ram/latest/userguide/working-with-az-ids.html) ซึ่งจะเป็นที่เดียวกันในทุกๆ AWS Account

## 2. ใช้ Private IP ในการติดต่อภายใน VPC
การส่งข้อมูลภายใน AZ นั้นไม่มีค่าใช้จ่ายเมื่อเรียกหากันด้วย Private IP Address หากเราไปเรียกใช้ด้วย Elastic IP address หรือ Public IP Address ของ Instance เราจะถูกคิดค่าใช้จ่าย $0.01/GB ทั้งเข้าและออกแม้ว่าจะอยู่ภายใน AZ เดียวกัน 

## 3. ใช้ S3 VPC Endpoint แทนการส่งผ่าน NAT Gateway 
การเรียกใช้ ​S3 จากเครื่องที่อยู่ใน private subnet ผ่าน NAT Gateway นั้น อาจโดนค่าบริการท่ี่สูง หากมีการรับส่งข้อมูลในปริมาณมากๆ (NAT Gateway มีค่าบริการอยู่ที่ประมาณ $59 ต่อข้อมูล 1TB)
ในกรณีแบบนี้เราสามารถใช้ [S3 Gateway VPC Endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html) ซึ่งจะทำให้เราเชื่อมต่อไปยัง S3 จากภายใน VPC แบบ Private ได้โดยที่ไม่มีค่าใช้เลย!! ฟรีทั้งค่าตัว VPC Endpoint และค่าประมวลผลข้อมูล 

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1j447nwgig3d286hx732.png)
 
นอกจาก S3 แล้ว VPC Gateway Endpoint ยังมีให้สำหรับอีกบริการหนึ่งก็คือ DynamoDB ซึ่งก็ไม่มีค่าใช้จ่ายเช่นเดียวกัน แบบนี้ไม่ใช้ไม่ได้แล้ว

## 4. ใช้ Interface Endpoint กับบริการที่รับส่งข้อมูลสูง
นอกจาก S3 และ DynomoDB เรายังสามารถเชื่อมต่อไปยังบริการ AWS อื่นๆ แบบ private ด้วยการใช้ VPC Endpoint ได้เช่นเดียวกัน แต่​จะเป็นแบบ [Interface Endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html) 
แม้ว่า Interface Endpoint จะมีคิดค่าบริการรายชั่วโมงและค่าประมวลผลข้อมูล แต่ถ้าใช้กับบริการที่ต้องส่งข้อมูลเยอะๆ เรายังลดค่าใช้จ่ายโดยรวมได้อยู่ดี
ยกตัวอย่างเช่น ถ้าใช้ Amazon Redshift API ด้วยปริมาณข้อมูลเดือนละ 2TB การวิ่งผ่าน NAT Gateway จะมีค่าประมวลผลข้อมูล $118 ต่อเดือน ในขณะที่ถ้าใช้ VPC Interface Endpoint จะมีค่า Endpoint $19 ต่อเดือน (สำหรับ 2 AZ) และค่าประมวลผลข้อมูล $20 เท่านั้น

ปัจจุบันมี[บริการของ AWS มากกว่า 90 บริการ](https://docs.aws.amazon.com/vpc/latest/privatelink/integrated-services-vpce-list.html) ที่สามารถใช้งานร่วมกับ VPC Interface Endpoint ได้ 

## 5. ใช้ self-manage NAT instance
NAT Gateway เป็น service ที่บริหารจัดการโดย AWS ที่ highly available และมี bandwidth สูงสุดถึง 45Gbps แต่ก็ต้องแลกมาด้วยค่าใช้จ่ายรายชั่วโมงของทั้งตัว NAT Gateway และค่าประมวลผลข้อมูล
เราอาจจะเลือกใช้งาน [Nat Instance](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html) แทนการใช้ Nat Gateway เพื่อลดค่าใช้จ่ายได้
Nat Instance จะเสียเฉพาะค่าใช้งาน EC2 และปกติแล้วก็ไม่ได้ต้องการ spec เครื่องสูงในการทำงาน เช่น ถ้าเราเลือกใช้ t4g.micro ซึ่งเพียงพอสำหรับการใช้งานทั่วๆ ไป จะมีค่าใช้จ่ายเพียง $7.74 ต่อเดือน อย่างไรก็ดี ก็อย่าลืมว่าถ้าเลือกใช้ Nat Instance เราต้องเป็นคนจัดการเรื่อง Availability การ Patch และอื่นๆ ด้วยตัวเอง

## 6. ใช้ CloudFront สำหรับ Deliver Content
ถ้าเรามี web application ที่ต้อง deliver content ไปให้ผู้ใช้งานปริมาณมากๆ แล้วการใช้ CloudFront สามารถช่วยลดค่าจ่ายตรงได้
Cloudfront เป็นบริการ CDN ที่ช่วยเพิ่มความเร็วและความปลอดภัยในการ deliver ผ่าน Amazon edge location มีการคิดราคาเป็น Tier ตามปริมาณข้อมูลที่ใช้ในแต่ละเดือน และถ้ามีการ commit การใช้งานขั้นต่ำตั้งแต่ 10TB/เดือน จะมีสิทธิได้รับส่วนลดเพิ่มขึ้นอีกด้วย

## 7. ใช้ Direct Connect ในการส่งข้อมูลไปยัง On-premise
Direct connect เป็นบริการเชื่อมเครือข่ายตรงระหว่างศูนย์ข้อมูลลูกค้ากับ AWS Data center ที่เสถียรและให้ความเร็วสูงและคงที่กว่าการใช้งาน ​Internet ที่เราควบคุมไม่ได้ การจะใช้ Direct Connect นั้นมี fix cost ส่วนของการเชื่อมต่อและค่าโครงข่ายของผู้ให้บริการในประเทศ แต่จะมีค่าบริการส่งข้อมูลต่ำกว่าการส่งผ่าน Site-to-Site VPN ด้วย Internet ถึงกว่าครึ่ง (Direct Connect คิดที่ $0.041/GB  ในขณะที่ Internet อยู่ที่ $0.12/GB)
ดังนั้นหากองค์กรต้องส่งข้อมูลปริมาณมากมายัง on-premise ทุกเดือน การใช้ Direct Connect อาจเป็นทางเลือกที่คุ้มค่ากว่า

## 8. เลือกใช้ VPC Peering
[Transit Gateway](https://aws.amazon.com/transit-gateway) (TGW) เป็นบริการที่ช่วยลดความซับซ่้อนในเชื่อมต่อระหว่าง VPCs และเครือข่ายบน On-premise ซึ่งปกติเราจะใช้เป็นท่ามาตรฐานในการเชื่่อมต่อ ต่อก็มีบางกรณีที่การใช้ [VPC Peering](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) อาจเป็นทางเลือกที่ดีกว่าเพราะไม่มีค่าใช้จ่ายในการเชื่อมต่อและคิดค่าข้อมูลเฉพาะกรณีข้าม AZ เท่านั้น นอกจากนี้การใช้ VPC Peering มี Latency ต่ำกว่าการวิ่งผ่าน TGW ด้วย

## 9. ทำ Distributed inspection ด้วย GWLB
สำหรับองค์กรที่มีการทำ centralized inspection ด้วย TGW ไปยัง VPC กลางที่มี security appliance วางอยู่ ทุกครั้งที่ข้อมูลวิ่งผ่าน TGW จะมีค่าใช้จ่ายการประมวลผลข้อมูล ด้วย Architecture ลักษณะนี้อาจมีค่าใช้จ่ายถึง $0.04/GB เพราะ traffic ต้องวิ่งผ่าน TGW สองรอบในการ ในการทำ Inspection ด้วยความสามารถของ Gateway Load Balance ที่ออกมาเมื่อปลายปี 2020 เราสามารถเลือกที่จะทำ distributed inspection โดยการวาง GWLB endpoint ใน VPC ที่มีการรับส่งข้อมูลมากๆ เพื่อลดค่าใช้จ่ายในส่วนนี้ได้

## 10. เลือกใช้ Shared VPC
อีกแนวทางนึงที่สามารถช่วยลดค่าใช้จ่าย คือการใช้ [VPC Sharing](https://aws.amazon.com/blogs/networking-and-content-delivery/vpc-sharing-a-new-approach-to-multiple-accounts-and-vpc-management/) ด้วยวิธีการนี้เราสามารถใช้งานแบบ Multi Account เพื่อแยกค่าใช้จ่ายและการบริหารจัดการ โดยที่เราสามารถแชร์ VPC Subnet ร่วมกันระหว่างหลายๆ Account ได้ วิธีนี้เราจะประหยัดทั้ง ​resource พวก ​Nat Gateway และ ​VPC Endpoints รวมถึงค่า Data Transfer ภายใน AZ เดียวกันด้วย

## 11. หมั่นตรวจสอบค่าใช้จ่ายและการใช้งาน
ใช้ [Cost Explorer ในการตรวจสอบค่าใช้บริการ Data Transfer](https://aws.amazon.com/blogs/mt/using-aws-cost-explorer-to-analyze-data-transfer-costs/) เพื่อทำความเข้าใจว่ามาจากการรับส่งลักษณะไหนบ้าง
เรายังสามารถเปิดใช้งาน [​VPC Flow Log](https://aws.amazon.com/blogs/mt/analyzing-vpc-flow-logs-got-easier-with-support-for-s3-as-a-destination/) ให้บันทึก traffic flow ระหว่างภายใน VPC มาตรวจสอบรายละเอียดของการรับส่งข้อมูลในระดับ network interface ได้ด้วย

หวังว่าทุกท่านสามารถนำแนวทางเหล่านี้ไปประยุกต์ใช้เพื่อลดค่าใช้จ่ายในส่วน network ได้บ้างนะครับ