Posted in: Amazon VPC
AWS Lambda Network Traffic Test in VPC w/ or w/o Endpoint
有人在問 Lambda 抓取 S3 資料出現下載時間過大 (latency) 的問題,我做了這樣的假設:
- 把 Lambda 放在 VPC 裡
- 把 VPC endpoint 打開,指定到 Lambda subnet 的 Route Table
推論基礎是:都在 LAN 裡的傳輸,會比出去到 WAN 還快。
以 AWS 來說,Lambda / S3 都是在 VPC 裡 (LAN) 的網路傳輸應該會比透過 WAN 去 S3 拿還好。不過找了 Lambda 對於 VPC / Network 官方文件的描述,都沒有提到類似的。
基於好奇心,做了以下的測試。
測試組合
Lambda 網路條件組合:
- 對照組: Lambda without VPC (最常見的使用方式)
- 對照組: Lambda in VPC without Endpoint (一般會使用的方式,通常是要存取 VPC 內的服務,像是 EC2, RDS, ElasticCache …)
- 實驗組: Lambda in VPC with Endpoint (考慮 AWS Service 跟 VPC 的網路傳輸架構才會使用的方案,目前只有整合 S3)
為了避免檔案大小差異,所以每個組合分別用存在 S3 的檔案:10MB, 40MB, 70MB 各跑了 200 次。
Lambda Function
以下是 Lambda Function, 內容很簡單,就是去 S3 抓東西下來,然後計算處理時間。使用的方式是透過 AWS SDK 拿 s3 object。
import os, sys, time
import boto3
client = boto3.client(‘s3′)
def handler(event, context):
start_time=time.time()
print ‘%s: start of test’ % start_time
print ‘bucket: [%s], filename: [%s]’ % (event[‘bucket’], event[‘filename’])
print client.download_file(event[‘bucket’], event[‘filename’], ‘/tmp/%s.file’ % str(start_time))
end_time=time.time()
print ‘%s: end of test’ % end_time
print “process time: [%s]s” % (str(end_time – start_time))
return str(end_time – start_time)
輸入的資料格式,指定 bucket 跟檔案名稱:10MiB, 40MiB, 70MiB
{
“bucket“: “awsgood.com”,
“filename“: “10MiB.bin”
}
量測、資料蒐集、觀察
- 資料蒐集:執行過程中,都是透過 script 跑 AWS CLI,然後直接把 lambda 結果蒐集起來。
- 觀察 ENI of Lambda:Lambda in VPC 可以觀察 EC2 -> ENI 的變化,會動態產生出 ENI,狀態會從 creating -> available -> in-used
- 第一次跑,會稍微久一點,因為正在產生出 ENI
- 如果一段時間沒跑,ENI 就會自動被刪到
- Lambda 要放在 VPC,要注意 subnet 大小的規劃。畫太小,可能會不夠用,這點跟 ELB 放的 subnet 規劃一樣。
- 量測 Lambda 的 Network in /out:
- Lambda VPC Support 並沒有提到 ENI 的 Throughput 是多少,所以如果要做大資料的處理,可能要注意。
- 如果要量測 Network Throughput,則可以透過 VPC FlowLog + CloudWatch Log + CloudWatch Custom Metric 最後可以再用 filter 弄成 metric。
結果
三種檔案大小,每個都跑了 200 次,結果如下,紅色標點的是實驗組,也就是一開始預期會比較好的:
測完之後,歸納幾個結論:
- 把 Lambda 放到 VPC + Endpoint 之後,網路傳輸不見得比較好,有時候反而更糟!
- Lambda + VPC 跟 No VPC 不見得會比較差
總結:其實三種組合,可以說沒有差。
測試前,有試著用 VPC with endpoint 的條件之下,到 EC2 Instance 試著 traceroute s3 的 endpoint,想比較有無 Endpoint 的 routing 是否有差異,但實際上看不出什麼差異。
備註
- 整個測試都是在
ap-northeast-1
(日本)
結論
雖然測出來結論應該沒差,但過程也學習以下東西:
- 怎麼去蒐集 Network In / Out:VPC FlowLog + CloudWatch Log + CloudWatch Custom Metric
- 怎麼透過 AWS CLI 快速部署 Lambda Function、更改 Lambda Configure 等
- 怎麼透過 AWS CLI 快速更改測試條件,包含 VPC with Endpoint、Associate VPC Endpoint to Route Table … 等
- Lambda in VPC 會動態生出 ENI,跟 ELB 一樣,所以要注意 subnet 範圍的規劃。如下圖:
參考資料