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
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
最近看到一些網路教學AWS S3可以部署靜態網頁,就想說那不如試試看將local swagger部署上去,之後還可以透過github action 自動部署swagger到s3上,於是花點時間看個影片並搭配chatgpt來實現
在專案開發的時候,專案架構搭建時團隊就會設定 php code style 檢查,避免整個開發團隊大家走出自己的風格,尤其是兩格空白還是四格空白,總是會有不同意見,這時候定義出團隊code style,並透過配置Github Action CI(Continuous Integration)
為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
最近剛好分配一個需求,要批次更新一些基礎設定資料,而新系統基礎設定資料都統一由別的團隊維護在Google Sheet 上,一開始是要我寫 Laravel Seeder 塞資料表,後來發現也太多數據要批次更新了,數據要對到何時何年,乾脆來研究串 Google Sheet API 整批塞入在對總行數就好
在撰寫專案時,有時候可能需要做一些特定Exceptions 來拋出error message的情況,而在不同公司任職,大家配置的流程可能就有些不同,這邊將簡單練習如何配置自定義的Exception。
作為一個純後端,不會前端也是正常的事(誤),但該練習的技能線還是得每天練習一點,尤其我是一個前端小廢物,那既然要用Laravel 9 版本來做開發,那就得先試試看vite這個新的工具,基本上這邊就簡單介紹使用方式,另一篇在額外說明Laravel Mix 與 Vite 差別。
最近看到一些網路教學AWS S3可以部署靜態網頁,就想說那不如試試看將local swagger部署上去,之後還可以透過github action 自動部署swagger到s3上,於是花點時間看個影片並搭配chatgpt來實現
在專案開發的時候,專案架構搭建時團隊就會設定 php code style 檢查,避免整個開發團隊大家走出自己的風格,尤其是兩格空白還是四格空白,總是會有不同意見,這時候定義出團隊code style,並透過配置Github Action CI(Continuous Integration)
為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
最近剛好分配一個需求,要批次更新一些基礎設定資料,而新系統基礎設定資料都統一由別的團隊維護在Google Sheet 上,一開始是要我寫 Laravel Seeder 塞資料表,後來發現也太多數據要批次更新了,數據要對到何時何年,乾脆來研究串 Google Sheet API 整批塞入在對總行數就好
在撰寫專案時,有時候可能需要做一些特定Exceptions 來拋出error message的情況,而在不同公司任職,大家配置的流程可能就有些不同,這邊將簡單練習如何配置自定義的Exception。
作為一個純後端,不會前端也是正常的事(誤),但該練習的技能線還是得每天練習一點,尤其我是一個前端小廢物,那既然要用Laravel 9 版本來做開發,那就得先試試看vite這個新的工具,基本上這邊就簡單介紹使用方式,另一篇在額外說明Laravel Mix 與 Vite 差別。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
隨著全球數位化浪潮的推進,企業正面臨著前所未有的挑戰和機遇。數位轉型已成為企業保持競爭力的關鍵策略。在這個過程中,平台即服務(PaaS)作為一種強大的雲端解決方案,正在扮演著不可或缺的角色。本文將探討PaaS在數位轉型中的重要作用,並說明其如何幫助企業實現數位化目標。 簡化開發與部署 Paa
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
對 AWS Certified Cloud Practitioner 證照考試難度的看法、學習方法和考試內容的介紹。
Thumbnail
  前陣子我花了一些時間學習 SageMaker 的相關使用,但除了 SageMaker外,AWS 中尚有大量的機器學習相關服務,剛好趁此機會好好的統整分類一下,後續也能作為選擇學習目標的依據。
Thumbnail
  先前在中國的工作環境相對封閉,並沒有使用雲端產品進行AI訓練及部屬,只有在本機端進行建置調試,但如今回到台灣了,該是時候接觸一下這些雲端的 AI 服務,而在 AWS 中,深度學習相關的服務鈴瑯滿目,但聽到有人提到 SageMaker ,這次就來看看它是個什麼樣的服務吧。
Thumbnail
IaaS 以虛擬化原理運作,企業可從雲端服務商那裡獲得運算、儲存和資料庫等服務,不再需要自己購買設備、管理設備,或託管設備的空間。
Thumbnail
實踐AWS中使用Lambda來負責登入簽核及與OpenAI API溝通,並利用S3容器託管一個靜態網頁做為前端
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
隨著全球數位化浪潮的推進,企業正面臨著前所未有的挑戰和機遇。數位轉型已成為企業保持競爭力的關鍵策略。在這個過程中,平台即服務(PaaS)作為一種強大的雲端解決方案,正在扮演著不可或缺的角色。本文將探討PaaS在數位轉型中的重要作用,並說明其如何幫助企業實現數位化目標。 簡化開發與部署 Paa
Thumbnail
Node.js是一個JavaScript運行環境。它使用了一個非阻塞、事件驅動的I/O模型,使其非常適合用於數據密集型的即時應用程序。簡單來說,Node.js允許你使用JavaScript來編寫伺服器端代碼。 nvm 安裝nvm Windows : 點擊 Releases · coreybut
Thumbnail
對 AWS Certified Cloud Practitioner 證照考試難度的看法、學習方法和考試內容的介紹。
Thumbnail
  前陣子我花了一些時間學習 SageMaker 的相關使用,但除了 SageMaker外,AWS 中尚有大量的機器學習相關服務,剛好趁此機會好好的統整分類一下,後續也能作為選擇學習目標的依據。
Thumbnail
  先前在中國的工作環境相對封閉,並沒有使用雲端產品進行AI訓練及部屬,只有在本機端進行建置調試,但如今回到台灣了,該是時候接觸一下這些雲端的 AI 服務,而在 AWS 中,深度學習相關的服務鈴瑯滿目,但聽到有人提到 SageMaker ,這次就來看看它是個什麼樣的服務吧。
Thumbnail
IaaS 以虛擬化原理運作,企業可從雲端服務商那裡獲得運算、儲存和資料庫等服務,不再需要自己購買設備、管理設備,或託管設備的空間。
Thumbnail
實踐AWS中使用Lambda來負責登入簽核及與OpenAI API溝通,並利用S3容器託管一個靜態網頁做為前端