AWS Serverless with NodeJS

更新於 發佈於 閱讀時間約 9 分鐘

研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。

這次練習主題是,使用AWS Serverless並搭配NodeJS程式語言,實作撈取匯率API,並設定排程定期撈取匯率後更新到S3上或是Google Sheet,搭配ChatGPT快速實作,這邊提供一個免費的匯率API叫全球即時匯率API,還有提供Python 跟 PHP範例Code。

相關NodeJS的筆記文章可以參考 NodeJS 初學(一) 這系列文章


安裝serveless 框架

這邊使用的是Serverless這個框架服務,幫助我們透過CLI處理部署跟測試,而如果安裝遇到一些問題,可以選擇強制安裝

npm install -g serverless

npm install -g serverless --force

安裝完畢後可以使用下列指令查看版本

serverless --version
raw-image

創建一個Serverless服務

執行下列指令創建一個serverless project,接著會有一個提示窗選擇哪種服務,第一次使用可以選擇AWS NodeJS - Starter,而其他選擇會根據你選擇的服務拉取適合你的Template模板。

//Create a new serverless project
serverless
raw-image

接著下一步會詢問你project命名,可以Enter使用預設命名,或是額外建立一個新的名字。

raw-image

這邊使用預設命名,接著會開始下載屬於的模板,這時候會問你註冊或是登入,這邊指的是Serverless提供的Dashboard,能夠幫助你觀察你的Serverless服務,而這邊我沒有使用。

raw-image

接著會詢問你是否要部署這個Serverless,選擇NO,當你寫YES,他就會直接部署上去了。

raw-image

選擇NO之後可以看到他已經幫我們創建完成,你可以在所在資料夾底下看到這個檔案

raw-image

接著進到專案裡面,可以看到預設創建的檔案

raw-image

檔案內容講解

這邊可以看到Serverless cli 幫我們創建了index.js檔案,這個是lambda執行邏輯的地方

raw-image

對照serverless.yaml檔,可以看到function1這個名字,這是到時候本地測試時,對應的function名字,而執行這個function時,會去觸發function1:handler底下的index.handler,而這個index.handler,就是index.js檔案下個handler

raw-image

程式邏輯撰寫

這邊將function1的名字改一下方便到時候本地測試時不會錯亂XDDD...,

raw-image

接著你可以使用Cli指令進行本地測試

sls invoke local -f getRateApi

或者增加傳入參數

sls invoke local --function getRateApi --data {"a": "test"}

// --function 可以簡化成 -f
sls invoke local -f getRateApi --data '{"a": "我是測試參數"}'
raw-image

確認都能正常執行之後開始撰寫NodeJS的邏輯,這邊NodeJS我也是還在學習階段,這次練習主要是搞懂Serverless運作觀念跟NodeJS。

首先要先創建一個package.json,因為習慣使用 yarn 這邊直接用yarn 創建,加上-y表示跳過那些問答,直接創建,接著你的文檔會多一個package.json

npm init -y​

yarn init -y

接著安裝axios,主要是基於Promise的HTTP客户端,方便我們處理HTTP請求,可以參考這個包,GITHUB

//安裝axois套件
yarn add axios

首先先建立一個負責處理google sheet 的Class,這邊看到要使用googleapis這個套件,故我們先安裝在引入。

yarn add googleapis​

創建一個命名為GoogleSheetsHandlerClass,檔案路徑跟名稱命名為./service/google.js幫我們把對google sheet的操作抽出,利用Chatgpt協助生成程式碼,constrictor傳入我們Google Sheet的credentials.json檔及SpreadsheetId,而申請googole服務可以參考這篇實作 Laravel 串接Google Sheet API,接著把這個Class export。

raw-image

編寫index.js主要邏輯,這邊有在額外使用moment處理時間格式,可做可不做,只是想記錄他每天有沒有正常執行而已,引入 Class 命名為GoogleSheetsHandler,使用axois取得匯率api,接著做塞入資料的取得,接著就是針對取得的資料寫入google sheet 跟取得google sheet最後一行的處理,而這邊寫入是如果最後一行沒資料會從第二行開始A2~D2寫入,主要是因為我的Google Sheet有設置標題。

yarn add ​moment
raw-image

註:spreadsheetId統一使用process.env的方式額外放在.env環境變數檔,方便統一管理,而取得process.env環境設定資料,得先修正serverless.yml設定,才能在process.env包含這個資料,一開始你可以先試著console.log(process.env)印出裡面包含的檔案內容,會發現無SPREADSHEET_ID這個值。

raw-image

接著設定serverless.yml,增加useDotenv: true,這代表在serverless會自動將命名為.env環境變數自動加載,接著設定region,避免到時候被部署到其他地區,接著我設定了events增加schedule來產生一個cron排程,時間是每天的8點跑這個function,這裡啟動時間會根據region時區,應該是Tokyo,台灣和日本的時差為+1小時。 當台灣早上9點,日本是10點。

而這邊的profile是設定你的AWS Credentials的,可以參考這裡的指令,而default是我自己設定的profile name,你可以使用aws configure list 查看。

serverless config credentials --provider provider --key key --secret secret
raw-image

大致上這些就差不多完成了,接著我們跑一次本地測試sls invoke local -f getRateApi,可以看到數據成功寫入 Google Sheets的console.log

raw-image

接著查看Google Sheet,也有正常寫入

raw-image

開始部署

確定都沒有問題之後我們就要開始執行第一次部署,而第一次部署時會創建一個.serverless的資料夾,之後部署完畢後,則可以針對單一function來部署

// 第一次部署
sls deplo

// 單一 function 部署
sls deploy function -f getRateApi
raw-image

部署時如果沒有配置好 AWS Credentials 則可能會出現錯誤訊息,像我就是忘記設定好,因為IAM要包含以下列出的權限,最簡單的方式在IAM設定時,Permissions policies增加AWSLambda_FullAccess權限,就會至少包含以下這些。

lambda:CreateFunction:允許建立 Lambda 函數。

lambda:UpdateFunctionCode:允許更新 Lambda 函數的程式碼。

lambda:UpdateFunctionConfiguration:允許更新 Lambda 函數的設定。

lambda:InvokeFunction:允許呼叫 Lambda 函數。

lambda:ListFunctions:允許列出 Lambda 函數。

部署完畢

部署完畢後可以看到Lambda的服務新增了一個function。

raw-image

接著我們點擊進去,可以看到產生了一個lamba的服務跟一個EventBridge

raw-image

而對Configuration點擊到Trigger可以看到設定資料,DailyRateUpdate是我在serverless.yaml檔設定的命名名稱,點擊進去可以看到設定好的時間內容

raw-image

點擊DailyRateUpdate進入,可以看到每日執行時間。

raw-image

而在部署時會在這些檔案資料會被打包放到S3裡面

raw-image

修改一下排程時間試著對單一function重新部署,接著我只改了serverless.yaml檔的排程時間,發現一切都沒有變化,故單一function部署應該是只針對index.js檔案部分

raw-image

最後使用 sls deploy部署才有重新修改排程時間

raw-image

以上就是一個創建Serverless with NodeJS的練習,但實務上的設定可能又更複雜了些,例如使用SQS服務,創建Queue,然後在 trigger lambda function,這還沒研究到,可能要等下回合研究SQS服務的運作,才能在融會貫通,而我的之前的文章:

python 爬蟲玉山匯率並部署到aws lambda,這個教學主要是配合docker ECR的方式操作lambda,這個有一個問題就是ECR很容易超流量收費,後來就被我關掉了XDDD









留言
avatar-img
留言分享你的想法!
avatar-img
DDDDD的沙龍
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
DDDDD的沙龍的其他內容
2023/12/13
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
2023/12/13
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
2023/12/09
現在AI工具太多,且框架對於資安支援及處理也越來越方便,反而開始會容易忽略最底層的知識,這邊回顧MySQL的鎖,順便記錄一下找到的一些影片資源,並整理筆記
Thumbnail
2023/12/09
現在AI工具太多,且框架對於資安支援及處理也越來越方便,反而開始會容易忽略最底層的知識,這邊回顧MySQL的鎖,順便記錄一下找到的一些影片資源,並整理筆記
Thumbnail
2023/12/05
這邊主要是遇到功能需要處理時區,雖然主管給的筆記已經寫得很完美了,但覺得還是得理解吸收後並記錄自己的筆記後,好像才能有效吸收到腦袋裡
Thumbnail
2023/12/05
這邊主要是遇到功能需要處理時區,雖然主管給的筆記已經寫得很完美了,但覺得還是得理解吸收後並記錄自己的筆記後,好像才能有效吸收到腦袋裡
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
從 JavaScript 到 Python
Thumbnail
從 JavaScript 到 Python
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
Serverless,也被稱為無伺服器架構,是一種現代雲計算模型,允許開發者專注於代碼,而不必擔心基礎架構和伺服器的管理。它通常與Function as a Service (FaaS)相關聯。
Thumbnail
Serverless,也被稱為無伺服器架構,是一種現代雲計算模型,允許開發者專注於代碼,而不必擔心基礎架構和伺服器的管理。它通常與Function as a Service (FaaS)相關聯。
Thumbnail
AWS 佈署簡單操作以及 RDS 建立篇
Thumbnail
AWS 佈署簡單操作以及 RDS 建立篇
Thumbnail
1.首先 這是 “AWS 上的工作負載發現” 的解決方案,我嘗試了一下,覺得很方便,所以介紹一下~ https://aws.amazon.com/tw/solutions/implementations/workload-discovery-on-aws/ 2. 部署 官方提供 CloudF
Thumbnail
1.首先 這是 “AWS 上的工作負載發現” 的解決方案,我嘗試了一下,覺得很方便,所以介紹一下~ https://aws.amazon.com/tw/solutions/implementations/workload-discovery-on-aws/ 2. 部署 官方提供 CloudF
Thumbnail
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
Thumbnail
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News