Amazon Web服務(wù)(AWS)發(fā)布了Lambda@Edge,讓客戶可以在全球的AWS站點(diǎn)運(yùn)行Node.js Lambda函數(shù),從而以非常低的延遲動(dòng)態(tài)地響應(yīng)最終用戶。
開發(fā)者可以用Lambda@Edge將Node.js代碼上傳到AWS Lambda——Amazon的“serverless”服務(wù),Lambda會(huì)在靠近最終用戶的AWS站點(diǎn)上自動(dòng)運(yùn)行和伸縮代碼,從而改善延遲、減少原始負(fù)載,實(shí)現(xiàn)高可用性。
Lambda@Edge代碼由Amazon CloudFront事件觸發(fā),Amazon CloudFront是一種全球內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN) 服務(wù),可以安全地以低延遲和高傳輸速度向?yàn)g覽者分發(fā)數(shù)據(jù)、視頻、應(yīng)用程序和API。
有時(shí)最終用戶會(huì)遍布全球,并且(理想情況)所有決策所需的所有信息都可以使用函數(shù)或請求從CloudFront獲得,Lambda@Edge正是專為這種對延遲敏感的用例所做的優(yōu)化。它可以讓開發(fā)者實(shí)現(xiàn)以下功能。
檢查cookies和顯式重寫URL從而執(zhí)行A/B測試。
返回生成的動(dòng)態(tài)內(nèi)容,例如將未經(jīng)身份驗(yàn)證的用戶重定向到一個(gè)按需創(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ā)送一個(gè)HTTP(S)請求時(shí),并且請求會(huì)抵達(dá)最接近該用戶的站點(diǎn)。這個(gè)事件包含傳入的HTTP請求。
查看器響應(yīng)——該事件發(fā)生在CloudFront邊緣服務(wù)器準(zhǔn)備對發(fā)出請求的最終用戶或設(shè)備做出響應(yīng)時(shí)。這個(gè)事件包含HTTP響應(yīng)。
原始請求——該事件發(fā)生在CloudFront邊緣服務(wù)器的緩存中沒有被請求的對象,并且查看器準(zhǔn)備發(fā)送給原始后端(例如Amazon EC2、Application Load Balancer或Amazon S3)時(shí)。
原始響應(yīng)——該事件發(fā)生在CloudFront邊緣服務(wù)器接收到一個(gè)來自原始后端的響應(yīng)時(shí)。
下面來自AWS Lambda@Edge文檔的圖表可以幫助你在請求/響應(yīng)周期中定位這些事件。
Lambda@Edge開發(fā)者應(yīng)該熟悉標(biāo)準(zhǔn)AWS Lambda開發(fā)范例,而且必須在開發(fā)代碼時(shí)遵循以下約束。
運(yùn)行環(huán)境——運(yùn)行環(huán)境目前只支持Node.js中編寫的函數(shù),它為每個(gè)函數(shù)分配128MB的內(nèi)存,沒有內(nèi)置的庫,也沒有訪問/tmp的權(quán)限。
超時(shí)設(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還沒有提供免費(fèi)體驗(yàn),函數(shù)持續(xù)時(shí)間的計(jì)算是從代碼開始運(yùn)行到返回或者以其他方式終止,每GB-second收費(fèi)$0.00005001。Lambda@Edge函數(shù)每次運(yùn)行都有固定的128MB內(nèi)存,每128MB-second收費(fèi)$0.00000625125。注意Lambda@Edge函數(shù)以50ms為間隔進(jìn)行測量,而不是標(biāo)準(zhǔn)的AWS Lambda 100ms間隔。