AWS Serverless Application Model
前言
無伺服器架構是一種無須管理基礎設施即可建立和執行應用程式及服務的方法,可讓您的應用程式擁有更高的敏捷度以及更低的總成本。該架構讓開發人員專注於應用程式的開發,減輕開發人員的負擔,使他們得以開發更可靠、優質的產品。
AWS Serverless Application Model(AWS SAM)為開放原始碼的框架,您可以運用此框架在AWS平台上建立無伺服器應用程式。 無伺服器應用程式由多個Lambda函數、事件、資料庫、API⋯等其他資源共同組成以實作出系統功能。
AWS SAM由以下兩種元素組成:
-
AWS SAM template specification: Template specification提供簡潔的語法定義無伺服器應用程式所使用到的Lambda函數、APIs、權限、事件⋯等資源。
-
AWS SAM命令列介面 (AWS SAM CLI): 您可以使用此工具建立無伺服器應用程式。SAM CLI指令可讓您驗證Template specification所定義的內容、在本地端測試Lambda函數、打包與部署應用程式至AWS平台上。
情境
在本實驗中,您將使用AWS SAM建立無伺服器的網頁應用程式。以Amazon Cloud9作為開發環境,透過AWS SAM template specification定義應用程式所需的資源,最後使用AWS SAM CLI測試、部署應用程式。該網頁應用程式可將資料寫入DynamoDB的資料表並從中讀取資料顯示於網頁。
步驟
建立Cloud9環境
我們需使用Cloud9作為應用程式的開發環境。
- 在Service選單中,點選Cloud9,接著選擇Create environment。
-
在Name environment頁面,於Name欄位輸入應用程式名稱,點選Next step。
-
於Configure settings頁面:(保留預設值)
- Environment type:請選擇Create a new instance for environment (EC2);
- Instance Type:請選擇t2.micro (1 GiB RAM + 1 vCPU);
- Cost-saving setting:請選擇Cost-saving setting。
-
點選Next Step。
-
於Review頁面,點選Create environment。
-
開發環境將被建立、設定並且連線,請等待約1分鐘。
設定
在這個章節中,您將下載本實驗所需的原始碼並修改它。
-
在Cloud9的終端機上,輸入下列指令:
$ git clone https://github.com/ecloudvalley/Getting-start-AWS-SAM.git
該指令將clone本實驗所需的原始碼,並將路徑更改至指定的資料夾下。
-
請輸入下列指令來查看檔案template.yaml的內容:
$ cd ~/environment/aws-serverless-application-model $ cat template.yaml
我們使用yaml語法來定義執行應用程式所需的資源,程式中定義了兩個Lambda函數:PostItemFunction和GetItemFunction;此外,我們也定義了DynamoDB資料表來儲存使用者輸入的資料。
-
接下來的步驟,我們將修改定義於程式碼內的資料表名稱,以確保資料表名稱不會重複。
-
請開啟位於目錄serverless-application-model/Lambda底下的檔案Lambda1.py和Lambda2.py。
-
請開啟位於目錄serverless-application-model底下的檔案template.yaml。
Lambda1.py 會將資料寫進資料庫;
Lambda2.py 會從資料庫讀取所有資料;
template.py 定義了DyanmoDB的資料表。
-
請取代上述三個檔案內的字串
<YOUR_TABLE_NAME>
為資料表名稱,名稱可自行命名,取代位置如下圖所示:- Lambda1.py
- Lambda2.py
- template.yaml
-
請記得儲存上述修改過的檔案。
建置與部署
在這個章節中,您將使用AWS SAM建立網頁應用程式並且透過AWS SAM CLI部署至AWS平台。
-
請輸入下列指令以安裝相依套件及建立子資料夾,該資料夾包含應用程式的程式碼與相依套件。
$ sam build –use-container
要安裝的相依套件被設置在目錄 ~/environment/aws-serverless-application-model/Lambda 底下的檔案requirement.txt。
-
輸入下列指令新增S3 Bucket,請替換指令中的
<YOUR_BUCKET_NAME>
為自己的Bucket名字,名字不得重複。aws s3 mb s3://
S3 Bucket將被用來放置靜態網頁以及部署應用程式所需的套件。
-
輸入下列指令建立部署應用程式所需的套件,請將指令中的
<YOUR_BUCKET_NAME>
替換為上一步所新增的Bucket名字。$ sam package –output-template-file package.yaml –s3-bucket
輸入指令後,package.yaml會被新增至”aws-serverless-application-model”資料夾底下。
-
請輸入下列指令,Cloudformation會依據定義在template的內容建立資源。請將指令中的
<YOUR_BUCKET_NAME>
替換為自己的Bucket名字。$ sam deploy –template-file package.yaml –stack-name
–capabilities CAPABILITY_IAM –region us-east-1
由CloudFormation建立的資源集合被稱為stack。
-
請稍待片刻,Cloudformation正在建立應用程式所需的資源。建立完成後,您將會看到訊息”Successfully created/updated stack”,如下圖所示:
整合API至網頁
在這個章節中,您將使用S3建立靜態網站,並且整合API endpoint至網頁中。
-
在Service選單中,點選Cloudformation;於Filter欄位輸入stack的名字,並點選你的stack。
點選你的stack後,將會看到stack的狀態為”CREATE_COMPLETE”,表示所有資源已建立完成。
-
在Outputs中,找到GetItemApi和PostItemApi的值,將其複製到剪貼簿中,以便後續使用。
-
在Cloud9中,打開檔案index.html,該檔案位於aws-serverless-application-model資料夾底下。
-
在下半部的程式碼,請取代
<EDNPOINT_FOR_POST_ITEM>
為PostItemApi的值;以及取代<ENDPOINT_FOR_GET_ITEM>
為GetItemApi的值,如下圖所示:
這個步驟讓網頁得以透過API呼叫Lambda Function。
-
儲存檔案index.html
-
於Cloud9的終端機上,請取代下列指令中的
<YOUR_BUCKET_NAME>
為自己的Bucket名字,並輸入指令至終端機:$ aws s3 cp ~/environment/aws-serverless-application-model/index.html s3://
該指令會將index.html複製到S3 Bucket。
設置靜態網頁
在本章節中,您將使用S3設置靜態網頁。
-
在Service選單中,點選S3;於Search for buckets欄位輸入你的Bucket名字,點選你的Bucket。
-
點選index.html,選擇Permissions分頁。
-
在Public access區塊,選取Everyone。
-
於彈跳出的視窗中,選取Read object並點選Save。
到目前的步驟,index.html已可被公開存取。
-
返回至前一頁,如下圖所示,點擊Bucket名字。
-
點選Properties分頁。
-
點選Static web hosting,接著選取Use this bucket to host a website。
-
在index document欄位輸入index.html。
-
複製區塊上方的endpoint,點選Save。
-
最後,將endpoint貼上至瀏覽器,按下Enter,您將看到以下畫面:
-
您可以於User Name、Address、Phone number欄位輸入資料,並按下按鈕Submit,資料將被寫入DynamoDB;按下按鈕Retrieve可從DynamoDB讀取所有資料,並顯示於網頁上。如下圖所示:
結論
恭喜!您已經可以使用AWS SAM建立無伺服器應用程式,您在本實驗中學到:
-
使用Cloud9建立開發環境;
-
使用AWS SAM CLI建置部署所需的套件;
-
利用指令將應用程式部署至AWS Cloud;
-
將endpoint整合進網頁,並使用S3建立靜態網站。
您使用上述方式所建立的無伺服器網頁應用程式,讓您可更快速地進行測試與部署。此外,無伺服器的架構將可協助您降低執行所需的成本,您只需支付程式執行時的費用。
Tag:SAM, serverless