Lambda共用代碼的方式

閱讀時間約 3 分鐘
raw-image

雖然lambda本身的概念就是主打無伺服器+各自獨立運行的function,但有時又不免其然的需要共用代碼,像是api可能都需要做權限驗證。

會有這方面的研究是因為公司正好要將app跟web共用的api搬到api gateway去處理,但我馬上就想到會有code reuse的問題,怎麼樣用可維護的方式來處理,就會非常重要。

解決方式

我們先來看幾種比較笨的解決方法:

  1. 開發npm套件,在每一個lambda function安裝

缺點:當dependency更新時,難以找出到底有哪些fn需要更新版本

2. 共用的code存在s3,在lambda時讀取

缺點:讀取的時候延遲時間,而且可能需要做額外的處理,感覺髒髒的

3. 寫一隻lambda專門處理middleware

缺點:引入不必要的延遲,整個lambda變得耦合,增加危險性(網路問題),成本也會增加,打一隻api等於打了兩隻

而我選用的解法是利用lambda layer + middy套件方便將middleware邏輯跟商業邏輯做拆分。

什麼是Lambda Layer

aws會自動幫我們把layer的代碼載入到lambda中,能讓我們直接引入使用。

應用情境:共用code、共用dependency(ex: 每一隻api都需要用到middy套件)、自己寫runtime…

限制:每一個lambda最多只能有5個layer

費用:新增layer本身不計費,而要注意的是layer的代碼大小也會計入lambda的檔案大小

缺點:如果是直接用上傳code的方式,你會發現在console看不到那些載入的layer code有哪些

實作

創建Layer + 綁定Layer步驟

首先在你的IDE上開發需要給每隻lambda用到的code,這邊以nodejs為例,但語言應不受限,只不過要注意放code的檔案路徑會有所不同。

raw-image

新增一個新的資料夾來放code,假設叫commonDependency,我們需要在commonDependency資料夾下新增nodejs資料夾來存放共用代碼。

aws會將nodejs資料夾的codey載入lambda,這邊我希望每一個lambda都使用lodash

npm i lodash
raw-image

接著在commonDependency這一層,對所有檔案和目錄做壓縮。

zip -r /壓縮檔要存放的路徑 .

然後將這個壓縮檔上傳到AWS layer

raw-image

新增layer

raw-image

新增完成之後,我們只需要複製Version ARN給lambda使用就好,這邊很讚的是我們可以做版本控制,也可以很方便的知道每一個版本有在使用的lambda有哪些。

raw-image

將ARN複製下來後到你想賦予的lambda function,滑到最下面就會看到可以新增layer的地方了:

raw-image
raw-image

選擇用ARN的方式複製貼上,點選Verify會跳出你要使用的layer資訊,按下Add就大功告成!

之後要用other version的話只要簡單點選edit就可選版號了:

raw-image

使用Layer方法

對於共用的模組(以nodejs而言,為node_module),我們只需要簡單在lambda中使用:

const lodash = require('lodash');

對於我們客製化寫的function則需要指名檔案路徑:

const lodash = require('/opt/nodejs/要用的js檔');
raw-image

註:他不會將lambda layer的檔案show在lambda console中,如果用cloud9似乎就沒這個問題。

測試

很簡單的對lambda function按下test,看看你有沒有成功引入你要的東西,就可以了。

4會員
10內容數
分享感情與生活的故事,期望我們都能在愛與被愛的路上感到幸福,並且在這個只有活一次的人生裡好好的活成自己喜歡的樣子
留言0
查看全部
發表第一個留言支持創作者!
JHIHLEI LIN的沙龍 的其他內容
要談論DBMS,除了SQL語法之外,我們還必須了解底層是怎麼處理資料儲存的,也就是DBMS架構的底層Disk Space Management: Disk Space Management 提供API來讀/寫資料到硬碟,資料會以Page為傳輸單位,為什麼會一次要等到這麼大才寫入硬碟或一次要讀這麼
我對於自己開發的API會習慣性寫一份swagger文件方便前端串接,但因為這些文件都是存在我個人的swagger帳號,且會受限於免費版限制,再加上剛好跟PM在討論如何維護我們的文件,於是我就開始著手將swagger自己部署到公司管理後台。 這樣做的好處: (1)後端都可以編輯 (2)文件隸屬於
要談論DBMS,除了SQL語法之外,我們還必須了解底層是怎麼處理資料儲存的,也就是DBMS架構的底層Disk Space Management: Disk Space Management 提供API來讀/寫資料到硬碟,資料會以Page為傳輸單位,為什麼會一次要等到這麼大才寫入硬碟或一次要讀這麼
我對於自己開發的API會習慣性寫一份swagger文件方便前端串接,但因為這些文件都是存在我個人的swagger帳號,且會受限於免費版限制,再加上剛好跟PM在討論如何維護我們的文件,於是我就開始著手將swagger自己部署到公司管理後台。 這樣做的好處: (1)後端都可以編輯 (2)文件隸屬於
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
Continue from here Prerequisites Create an IAM role with access to Bedrock Create an "IAM Role" that defines the permissions needed to call Bed
Thumbnail
你會在程式裡面寫函數嗎? 通常寫函數的第一個問題,就是要給函數取名字。 名字取得不好,後來調用函數不自然,就會拖垮整個寫程式的效率。 為函數命名,也是一門技術,好的函數命名,就能提高函數被重複使用的頻率。 然而,也是在某些情況下,我們需要「一次性函數」。 沒錯,用完即丟的函數。
Thumbnail
最近開了複委託打算定期定額買美股,主要因為交割戶是設定外幣帳戶交割,先前設置了常用銀行的外幣到價通知,但是美金最近一直逆空高灰,幾乎不會啟動到價通知🥲,只好一直關注銀行即期價格,但因為上班常常會忘記要看一下外幣網銀換匯優惠,故想說練習python之餘,並順便做個爬蟲將資料發送到line群組
Thumbnail
A lambda function is a small anonymous function and can only have one expression.
Thumbnail
從草創的對話程式 Eliza 到首位機器人公民索菲亞,可以看出在科技發展的脈絡下,我們得以窺見人類的兩種渴望:對於高階技術的渴望、對於人性投射的渴望
Thumbnail
只是身處在冷漠的社會反而更難向身邊的人開口,科技彷彿成了孤獨社會下唯一會應允「親密需求」的救贖。
Thumbnail
兩位思想家的論述在語意分析的層面上皆有其論述成立的基礎,不過,剛好沒有涵蓋到的問題是我們如何認定一個有思考能力的「個體」?
Thumbnail
什麼是 serverless (無伺服器運算)? 無伺服器運算是一種開發架構,允許開發者在不用管理伺服器的情況下建置部署和執行應用程式。無伺服器運算裡仍然有伺服器,只是伺服器是由雲端服務供應商負責處理配置、維護、拓展伺服器基礎設施的日常工作,開發者可以專注於開發程式碼。
Thumbnail
或許就如官網文件中所說的,lambda function就只是syntactic sugar而已,所以也就沒特別在意,直到在設計Game of Life的輸入介面時,因為需要用到,兜兜轉轉,費了好些功夫和時間,總算對它的用途和用法有比較完整的認識。
最近公司寫的系統要上線 , EFS 的存取點套用開發時設定出問題 背景是這樣的 開發 : 存取點 path 設 /xxx , 使用者和群組 id 設 1000 , 目錄使用者和群組 id 也設 1000 , 權限開 0600 (owner 可讀可寫) 上線 : 設定如同開發 神奇的事情出現了 , 開
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
Continue from here Prerequisites Create an IAM role with access to Bedrock Create an "IAM Role" that defines the permissions needed to call Bed
Thumbnail
你會在程式裡面寫函數嗎? 通常寫函數的第一個問題,就是要給函數取名字。 名字取得不好,後來調用函數不自然,就會拖垮整個寫程式的效率。 為函數命名,也是一門技術,好的函數命名,就能提高函數被重複使用的頻率。 然而,也是在某些情況下,我們需要「一次性函數」。 沒錯,用完即丟的函數。
Thumbnail
最近開了複委託打算定期定額買美股,主要因為交割戶是設定外幣帳戶交割,先前設置了常用銀行的外幣到價通知,但是美金最近一直逆空高灰,幾乎不會啟動到價通知🥲,只好一直關注銀行即期價格,但因為上班常常會忘記要看一下外幣網銀換匯優惠,故想說練習python之餘,並順便做個爬蟲將資料發送到line群組
Thumbnail
A lambda function is a small anonymous function and can only have one expression.
Thumbnail
從草創的對話程式 Eliza 到首位機器人公民索菲亞,可以看出在科技發展的脈絡下,我們得以窺見人類的兩種渴望:對於高階技術的渴望、對於人性投射的渴望
Thumbnail
只是身處在冷漠的社會反而更難向身邊的人開口,科技彷彿成了孤獨社會下唯一會應允「親密需求」的救贖。
Thumbnail
兩位思想家的論述在語意分析的層面上皆有其論述成立的基礎,不過,剛好沒有涵蓋到的問題是我們如何認定一個有思考能力的「個體」?
Thumbnail
什麼是 serverless (無伺服器運算)? 無伺服器運算是一種開發架構,允許開發者在不用管理伺服器的情況下建置部署和執行應用程式。無伺服器運算裡仍然有伺服器,只是伺服器是由雲端服務供應商負責處理配置、維護、拓展伺服器基礎設施的日常工作,開發者可以專注於開發程式碼。
Thumbnail
或許就如官網文件中所說的,lambda function就只是syntactic sugar而已,所以也就沒特別在意,直到在設計Game of Life的輸入介面時,因為需要用到,兜兜轉轉,費了好些功夫和時間,總算對它的用途和用法有比較完整的認識。
最近公司寫的系統要上線 , EFS 的存取點套用開發時設定出問題 背景是這樣的 開發 : 存取點 path 設 /xxx , 使用者和群組 id 設 1000 , 目錄使用者和群組 id 也設 1000 , 權限開 0600 (owner 可讀可寫) 上線 : 設定如同開發 神奇的事情出現了 , 開