Lambda Network Traffic Test in VPC w/ or w/o Endpoint


有人在問 Lambda 抓取 S3 資料出現下載時間過大 (latency) 的問題,我做了這樣的假設:

  1. 把 Lambda 放在 VPC 裡
  2. 把 VPC endpoint 打開,指定到 Lambda subnet 的 Route Table

推論基礎是:都在 LAN 裡的傳輸,會比出去到 WAN 還快。

以 AWS 來說,Lambda / S3 都是在 VPC 裡 (LAN) 的網路傳輸應該會比透過 WAN 去 S3 拿還好。不過找了 Lambda 對於 VPC / Network 官方文件的描述,都沒有提到類似的。

基於好奇心,做了以下的測試。


測試組合

Lambda 網路條件組合:

  1. 對照組: Lambda without VPC (最常見的使用方式)
  2. 對照組: Lambda in VPC without Endpoint (一般會使用的方式,通常是要存取 VPC 內的服務,像是 EC2, RDS, ElasticCache …)
  3. 實驗組: Lambda in VPC with Endpoint (考慮 AWS Service 跟 VPC 的網路傳輸架構才會使用的方案,目前只有整合 S3)

為了避免檔案大小差異,所以每個組合分別用存在 S3 的檔案:10MB, 40MB, 70MB 各跑了 200 次。

Lambda Function

以下是 Lambda Function, 內容很簡單,就是去 S3 抓東西下來,然後計算處理時間。使用的方式是透過 AWS SDK 拿 s3 object。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

1
2
3
4
{
"bucket": "gtcafe.tmp",
"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:

結果

三種檔案大小,每個都跑了 200 次,結果如下,紅色標點的是實驗組,也就是一開始預期會比較好的:

10M

40M

70M

測完之後,歸納幾個結論:

  • 把 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 範圍的規劃。如下圖:


延伸閱讀

站內延伸

參考資料


Comments