AWS SAM 無伺服器應用程式, Serverless Application Model
到現在還無法確認我是否完整了解 Serverless 的概念。字面上說「無伺服器」但其實只代表使用者和開發團隊不需要考慮伺服器,將伺服器的管理完全託管而不需要伺服器。這個定義跟 PaaS(Platform as a Service) 很像但似乎又有所不同,個人䦆的最大的差異應該是在程式的執行、Serverless只在需要的時候執行而非長期待機(?)。
這裡會簡單介紹開源無伺服器程式 AWS SAM 、安裝 AWS SAM CLI、使用 SAM 來部署 Cloud Resume Challenge - Part 3 所需要的 API Gateway + Lambda 組合。
SAM (AWS Serverless Application Model) 是什麼? #
Serverless Application Model SAM 被開發出來的主要用意是要讓開發者能很容易的開發 serverless application 是 AWS IaC 服務 CloudFormation的延伸。透過 SAM CLI 命令列介面可以用幾行指令就快速產生定義資源所需要的 YAML 模板 Template,建置所需要的任何 AWS 資源。
在 AWS 上、無伺服器應用程式是結合 Lambda 、程式和其他服務的組合(如 API Gateway等)來共同執行。使用上則包含兩個部分:1)SAM Template 模板,2)SAM CLI 命令列介面。模板 Template可以參考官方的文件定義需要的資源,或者使用CLI 命令列介面設定、驗證、打包等等。下面會安裝 AWS SAM CLI ,然後設置需要的AWS資源。
- Terminal安裝AWS SAM CLI
- 給予 IAM 權限
- 用 SAM CLI 設置 Template 模板給 CloudFormation
- CloudFormation 幫我們建置 API Gateway 和 Lambda
SAM 是 AWS 自己開發的功能,所以非常適合在 AWS上使用。但若同時擁有自己管理的機房或同時使用其他服務如GCP、Azure 等,可以考慮使用開源中立的 Terraform來同時管理所有的雲端資源。
安裝AWS SAM CLI #
在 macOS 上官方推薦使用 Homebrew 來安裝 SAM CLI,還沒安裝的可以到安裝、很久沒使用的記得進行更新。安裝時也記得要到 IAM 給使用者相對的權限,這邊偷懶就給CLI使用者操作部分資源所需的全部權限。
驗證Homebrew已安裝:
brew --version
使用Homebrew安裝AWS SAM CLI
brew tap aws/tap
brew install aws-sam-cli
驗證 SAM 已安裝完成:
sam --version
給予AWS CLI 相對應的使用者認證:
$ aws configure
AWS Access Key ID [None]: your_access_key_id
AWS Secret Access Key [None]: your_secret_access_key
Default region name [None]:
Default output format [None]:
用 SAM CLI 範例部署 API 所需資源 #
下載AWS SAM範例 #
sam init
1 - AWS Quick Start Templates
1 - Hello World Example
Use the most popular runtime and package type? (Nodejs and zip) [y/N]: n
10 - python3.8
1 - Zip
Project name [sam-app]: {your-pj-name}
完成上述設定後,SAM 會在電腦裡建立 {your-pj-name} 資料夾,內部會有我們所需要進行修正的文件。其中有三個特別重要:
hello_world/app.py #
包含 Lambda 處理程式,範例檔案會回覆 {“message”: “hello world”},可以用Python來定義我們希望Lambda執行的程式。
template.yaml #
包含AWS SAM模板,需要注意的是resources、定義我們 Serverless Function 所需要設置的AWS服務。Type部分是由AWS定義許多快捷設定,中間所顯示的Serverless其實就是設置API Gateway和Lambda的快捷設定,同時把兩者做連結。
Properties則是對資源做詳細的設定:
- CodeUri 為程式儲存在 S3中的Bucket位址
- Handler 協助程式指向:app.lambda_handler 表示 app.py 文件中的 def lambda_handler
- Runtime 標註所使用的語言和版本
- Event 說明這個程式使用API、並指定路徑為 /hello 使用 GET 請求
構建程式封包 #
完成 app.py 和 template.yaml 的修正後,會使用 SAM CLI 指令將定義在 template.yaml
模板的內容轉換成 SAM 和 CloudFormation 能解讀的格式、整理成封包。
cd {your-pj-name}
sam build
將準備好的程式上傳到 AWS Cloud #
sam deploy --guided
第一次使用 SAM 時推薦使用 guided 指令,讓 AWS SAM 幫助我們進行初期設定。之後會開始確認需要建立的資源,確認後沒有問題則選擇 Y 讓 SAM 將設定檔上傳到新建立的S3 Bucket 、再將設定傳到 CloudFormation 幫我們建立程式所需要的資源。
這邊可以看到我們希望建立建立的API Gateway和Lambda,選擇確認後就可以躺著讓 CloudFormation 替我們完成後續的作業。不只是 Terminal 中,到 Management Console > CloudFormation 也能看到剛剛 SAM 透過 CloudFormation 幫我們完成的批次資源建立作業。
存取建構在 API Gateway 上火熱的 API #
在 API Gateway 的部分會提供存取程式的端點網址,使用 curl
指令後應該能獲得我們在 app.py
所設定的訊息:”Hello World(預設)”。
curl {apigateway-value-starts-with-HTTP}
結論 #
Infrastructure as Code 的確讓建置後端系統變得非常快速且系統化,除了免去一個個設置資源的煩惱,也讓後續維護或調查變得比較容易。但相對於 GUI 介面,學習並瞭解 CLI 介面、對 YAML 進行設定等都是學習曲線較艱辛的路程,先苦後甘。另外一個優點是在「除錯」上,SAM CLI 能告訴我們問題出在權限或是否個服務資源的設置上,直接指出問題而不需要去重新檢視所有的資源、一個個尋找錯誤。
本來希望能在進行 Cloud Resume Challenge 時同時用SAM來進行佈置,但光是理解各個服務如何使用就讓我耗盡心力。雖然無法完全遵循這個挑戰的每個步驟,但能實際操作設定各個服務、理解個別差異和如何合作,這就有符合挑戰的核心價值了吧。
- 什麼是AWS Serverless Application Model(AWS SAM)? - AWS Documents
- macOS上安裝AWS SAM CLI - AWS Documentation
- 教學課程:部署 Hello World 應用程式 - AWS Documentation
⚙️ 設置
macOS version 12.1
Terminal 2.12(443)
Homebrew 3.3.12
SAM CLI, version 1.37.0
Python 3.8.7