Amazon Web服務(wù)(AWS)發(fā)布了Lambda@Edge,讓客戶可以在全球的AWS站點運行Node.js Lambda函數(shù),從而以非常低的延遲動態(tài)地響應(yīng)最終用戶。
開發(fā)者可以用Lambda@Edge將Node.js代碼上傳到AWS Lambda——Amazon的“serverless”服務(wù),Lambda會在靠近最終用戶的AWS站點上自動運行和伸縮代碼,從而改善延遲、減少原始負載,實現(xiàn)高可用性。
Lambda@Edge代碼由Amazon CloudFront事件觸發(fā),Amazon CloudFront是一種全球內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN) 服務(wù),可以安全地以低延遲和高傳輸速度向瀏覽者分發(fā)數(shù)據(jù)、視頻、應(yīng)用程序和API。
有時最終用戶會遍布全球,并且(理想情況)所有決策所需的所有信息都可以使用函數(shù)或請求從CloudFront獲得,Lambda@Edge正是專為這種對延遲敏感的用例所做的優(yōu)化。它可以讓開發(fā)者實現(xiàn)以下功能。
檢查cookies和顯式重寫URL從而執(zhí)行A/B測試。
返回生成的動態(tài)內(nèi)容,例如將未經(jīng)身份驗證的用戶重定向到一個按需創(chuàng)建的登錄頁面。
使用特定的對象作為響應(yīng),基于用戶代理頭文件定制用戶看到的網(wǎng)站。
添加、刪除或修改頭文件(受到以下限制)將用戶引導(dǎo)到不同的緩存對象。
修改或壓縮頭文件或URL來提高緩存利用率。
將HTTP請求發(fā)送到其他互聯(lián)網(wǎng)資源并使用結(jié)果定制響應(yīng)(盡管開發(fā)人員應(yīng)該小心地減少發(fā)出這些請求的額外延遲)。
Lambda@Edge函數(shù)的觸發(fā)可以用來響應(yīng)四種不同的CloudFront事件。
查看器請求——該事件發(fā)生在互聯(lián)網(wǎng)上的最終用戶或設(shè)備向CloudFront發(fā)送一個HTTP(S)請求時,并且請求會抵達最接近該用戶的站點。這個事件包含傳入的HTTP請求。
查看器響應(yīng)——該事件發(fā)生在CloudFront邊緣服務(wù)器準備對發(fā)出請求的最終用戶或設(shè)備做出響應(yīng)時。這個事件包含HTTP響應(yīng)。
原始請求——該事件發(fā)生在CloudFront邊緣服務(wù)器的緩存中沒有被請求的對象,并且查看器準備發(fā)送給原始后端(例如Amazon EC2、Application Load Balancer或Amazon S3)時。
原始響應(yīng)——該事件發(fā)生在CloudFront邊緣服務(wù)器接收到一個來自原始后端的響應(yīng)時。
下面來自AWS Lambda@Edge文檔的圖表可以幫助你在請求/響應(yīng)周期中定位這些事件。
Lambda@Edge開發(fā)者應(yīng)該熟悉標準AWS Lambda開發(fā)范例,而且必須在開發(fā)代碼時遵循以下約束。
運行環(huán)境——運行環(huán)境目前只支持Node.js中編寫的函數(shù),它為每個函數(shù)分配128MB的內(nèi)存,沒有內(nèi)置的庫,也沒有訪問/tmp的權(quán)限。
超時設(shè)定——處理原始請求和原始響應(yīng)事件的函數(shù)必須在3秒內(nèi)完成,處理查看器請求和查看器響應(yīng)事件的函數(shù)必須在1秒內(nèi)完成。
Web服務(wù)訪問——處理原始請求和原始響應(yīng)事件的函數(shù)必須在3秒內(nèi)完成,它可以訪問AWS API和通過HTTP獲取內(nèi)容。這些請求總是與對原始請求或響應(yīng)的請求同步。
版本控制——在Lambda控制臺更新代碼之后,必須設(shè)置一套新的觸發(fā)配置。開發(fā)人員需要等待復(fù)制完成。函數(shù)必須和版本號相關(guān),$LATEST和別名都不適用。
頭文件——請查閱“頭文件限制”來確定哪些頭文件是可以訪問的、受限制的、只讀的和被列入黑名單的。
現(xiàn)在Lambda@Edge還沒有提供免費體驗,函數(shù)持續(xù)時間的計算是從代碼開始運行到返回或者以其他方式終止,每GB-second收費$0.00005001。Lambda@Edge函數(shù)每次運行都有固定的128MB內(nèi)存,每128MB-second收費$0.00000625125。注意Lambda@Edge函數(shù)以50ms為間隔進行測量,而不是標準的AWS Lambda 100ms間隔。