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
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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
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
Thumbnail
什麼是 serverless (無伺服器運算)? 無伺服器運算是一種開發架構,允許開發者在不用管理伺服器的情況下建置部署和執行應用程式。無伺服器運算裡仍然有伺服器,只是伺服器是由雲端服務供應商負責處理配置、維護、拓展伺服器基礎設施的日常工作,開發者可以專注於開發程式碼。
Thumbnail
什麼是 serverless (無伺服器運算)? 無伺服器運算是一種開發架構,允許開發者在不用管理伺服器的情況下建置部署和執行應用程式。無伺服器運算裡仍然有伺服器,只是伺服器是由雲端服務供應商負責處理配置、維護、拓展伺服器基礎設施的日常工作,開發者可以專注於開發程式碼。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News