AWS SAM 簡化了無伺服器應用程式的開發、測試和佈署流程,其範本語法比 CloudFormation 更簡潔易用,同時完全相容 CloudFormation 的所有功能。開發者可以利用 SAM CLI 在本地建置、測試和除錯應用程式,並直接佈署到 AWS 雲端。SAM 範本定義了無伺服器應用程式所需的資源,例如 Lambda 函式、API Gateway、DynamoDB 表格等,並透過轉換成 CloudFormation 範本進行佈署。這使得開發者可以專注於業務邏輯的開發,而無需管理底層基礎設施。SAM 還支援本地測試和除錯,可以有效縮短開發週期。對於複雜的應用程式,SAM 提供了模組化和可重複使用的機制,方便團隊協作和程式碼管理。
使用AWS SAM佈署無伺服器應用程式
介紹AWS SAM
在深入瞭解AWS SAM之前,讓我們快速瞭解一下什麼是無伺服器。無伺服器是一種開發、執行和操作應用程式的方式,而無需管理其底層基礎設施。你可能會想知道主要區別是什麼,因為你在AWS中不管理任何基礎設施,你的想法是正確的。
在AWS中,你不需要管理任何物理基礎設施,但是如果你執行一個EC2例項,你需要負責其底層作業系統、安全、補丁和更新。
然後,你需要考慮AWS的託管關聯式資料函式庫服務(RDS),你不需要擔心底層作業系統,但是你仍然需要調整其引數,透過重新組織查詢和表格以及建立資料函式庫索引來進行效能調優。
無伺服器並不保證不需要任何操作工作,但是例項型服務(如EC2、RDS、EMR和MSK)與無伺服器服務(如S3、SNS、SQS、Lambda和DynamoDB)之間存在多個差異。
使用無伺服器服務時,以下幾點是成立的:
- 你只需為服務使用付費,例如儲存($ per GB)和實際計算操作(請求數量)
- 你不操作例項,而是操作計算和儲存單元
- 你使用特定的實體(例如函式而不是整個執行環境,或表格而不是整個資料函式庫)
這些核心概念使得無伺服器計算在許多業務案例中具有成本效益。
AWS SAM的推出是為了完全支援使用IaC方法開發、封裝和佈署無伺服器應用程式。
AWS SAM由兩個部分組成:
- 實際的框架(執行所有操作的CLI)
- 一個範本,其規範與CloudFormation類別似
與CDK類別似,AWS SAM可以在不需要額外操作的情況下執行所有操作,例如構建、在本地測試和向AWS提供無伺服器堆積疊。
AWS SAM範本範例
Transform: AWS::Serverless-2016-10-31
Resources:
DynamoDb:
Type: "AWS::Serverless::SimpleTable"
Properties:
TableName: "myTable"
PrimaryKey:
Name: "id"
Type: "string"
內容解密:
此範本定義了一個簡單的DynamoDB表格。Transform
行指定了這是一個AWS SAM範本,它將被CloudFormation處理。Resources
部分定義了資源,在這裡是一個名為DynamoDb
的簡單表格。Type
欄位指定了資源型別為AWS::Serverless::SimpleTable
,這是AWS SAM中的一個簡化資源型別。Properties
部分定義了表格的屬性,包括表格名稱和主鍵。
與CloudFormation的比較
讓我們比較一下AWS SAM和CloudFormation,以便我們可以充分利用兩者。
AWS SAM範本在寫作上更容易,因為其功能受到限制。例如,DynamoDB表格定義如前所示。
經過轉換後,前面的範本將如下所示:
{
"Resources": {
"DynamoDb": {
"Type": "AWS::DynamoDB::Table",
"Properties": {
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "id"
}
],
"TableName": "myTable",
"AttributeDefinitions": [
{
"AttributeName": "id",
"AttributeType": "S"
}
],
"BillingMode": "PAY_PER_REQUEST"
}
}
}
}
內容解密:
這個JSON範本是經過轉換後的結果。可以看到,DynamoDb
資源被轉換為AWS::DynamoDB::Table
型別,並且其屬性被轉換為CloudFormation所需的格式。這表明AWS SAM範本最終會被轉換為CloudFormation範本。
無伺服器應用程式開發
AWS SAM為開發無伺服器應用程式提供了一種簡化的方法。透過使用AWS SAM,開發人員可以輕鬆地開發、構建、測試和佈署無伺服器應用程式。
使用AWS SAM的主要優點包括:
- 簡化的範本語法
- 與CloudFormation的相容性
- 對無伺服器應用程式的原生支援
問題
- 什麼是AWS SAM?
- AWS SAM與CloudFormation的主要區別是什麼?
- 如何使用AWS SAM定義無伺服器資源?
- AWS SAM範本與CloudFormation範本之間的關係是什麼?
- 使用AWS SAM的主要優點是什麼?
graph LR A[開始] --> B{AWS SAM範本} B -->|轉換| C[CloudFormation範本] C --> D[佈署] D --> E[無伺服器應用程式]
圖表翻譯: 此圖表展示了使用AWS SAM開發無伺服器應用程式的流程。首先,我們建立一個AWS SAM範本,然後該範本被轉換為CloudFormation範本。最後,CloudFormation範本被佈署,從而建立無伺服器應用程式。
使用AWS SAM佈署無伺服器應用程式
瞭解AWS SAM與CloudFormation的差異
首先,AWS SAM範本是專為無伺服器應用程式和服務設計的。目前,AWS SAM範本參考支援以下資源型別:
- AWS::Serverless::API:建立API閘道器及相關資源
- AWS::Serverless::Application:建立無伺服器應用程式
- AWS::Serverless::Function:建立Lambda函式及相關資源
- AWS::Serverless::HttpApi:建立HTTP API閘道器及相關資源
- AWS::Serverless::LayerVersion:建立Lambda層
- AWS::Serverless::SimpleTable:建立簡化的DynamoDB表(僅主鍵無排序鍵)
仍然可以將CloudFormation的資源與AWS SAM的資源結合使用。例如,如果我們想建立一個S3儲存桶與SimpleTable結合,可以透過新增CloudFormation資源來實作,如下程式碼所示:
Transform: AWS::Serverless-2016-10-31
Resources:
DynamoDb:
Type: AWS::Serverless::SimpleTable
Properties:
TableName: "myTable"
PrimaryKey:
Name: "id"
Type: "string"
Bucket:
Type: "AWS::S3::Bucket"
我們只需要指定CloudFormation特定的資源型別。
其次,當我們想要透過CLI佈署AWS SAM應用程式且不使用互動式對話方塊時,必須擁有一個S3儲存桶。原因是AWS SAM應用程式由原始碼和範本組成。AWS SAM CLI將負責構建應用程式(如果需要編譯),並將Lambda函式的工件上傳到S3。
最後,AWS SAM允許透過建立本地API閘道器或針對應用程式執行測試事件來進行本地測試。
內容解密:
上述範本展示瞭如何混合使用AWS SAM和CloudFormation資源。Transform
段指定了使用AWS SAM的版本。Resources
段定義了兩個資源:一個是使用AWS SAM的SimpleTable
,另一個是使用CloudFormation的S3儲存桶。SimpleTable
資源簡化了DynamoDB表的建立過程,而S3儲存桶則是透過CloudFormation資源直接建立的。
使用AWS SAM編寫您的第一個無伺服器應用程式
在本文中,我們將建立幾個無伺服器應用程式,以涵蓋AWS SAM的大部分功能。第一個應用程式——“Hello, World”——將使用AWS Quick Start範本建立,以便我們能夠快速上手AWS SAM。
步驟1:安裝AWS SAM CLI
在開始之前,我們需要在本地機器上安裝AWS SAM CLI及其依賴項。安裝步驟根據作業系統的不同而有所不同。以下是macOS上的安裝步驟:
- 確保您已安裝Docker和Homebrew。
- 透過以下命令安裝AWS SAM CLI:
$ brew tap aws/tap
$ brew install aws-sam-cli
- 透過執行以下命令檢查安裝:
$ sam --version
如果沒有錯誤輸出,那麼您就可以開始使用了。
步驟2:建立Hello World應用程式
- 初始化專案:
$ sam init
- 按照對話方塊的提示進行操作。選擇1 - AWS Quick Start Templates。
- 選擇執行時環境,例如python3.8。
- 輸入應用程式名稱,例如hello-world。
- 選擇Hello World Example範本。
AWS SAM將生成一個應用程式並提供下一步的指示。
檢查生成的目錄結構
生成的目錄結構如下:
.
├── README.md
├── __init__.py
├── events
│ └── event.json
├── hello_world
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
├── template.yaml
└── tests
├── __init__.py
└── unit
├── __init__.py
└── test_handler.py
分析範本檔案
Globals:
Function:
Timeout: 3
Globals
段用於定義多個資源分享的屬性。例如,如果您正在構建一個包含多個Lambda函式的應用程式,並且它們都使用相同的執行時和超時設定,那麼可以在Globals
中定義這些屬性,以避免在每個資源中重複定義。
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Resources
段定義了一個名為HelloWorldFunction
的Lambda函式。它指定了函式的程式碼位置、處理程式、執行時以及觸發器事件。
內容解密:
上述範本定義了一個Lambda函式HelloWorldFunction
。CodeUri
指定了函式程式碼的位置,Handler
指定了處理函式入口,Runtime
指定了函式的執行時環境。Events
段定義了一個API閘道器觸發器,當收到GET請求時觸發Lambda函式。
隨著無伺服器架構的持續發展,AWS SAM將繼續扮演重要的角色。透過進一步探索其功能和最佳實踐,我們可以更好地利用AWS SAM來構建高效、可擴充套件的無伺服器應用程式。
圖表示例
graph LR A[開始] --> B[sam init] B --> C[選擇範本] C --> D[選擇執行時] D --> E[輸入應用程式名稱] E --> F[生成應用程式] F --> G[分析範本] G --> H[佈署應用程式]
圖表翻譯:
此圖示展示了使用AWS SAM建立無伺服器應用程式的流程。首先,透過sam init
命令初始化專案,然後按照提示選擇範本和執行時,輸入應用程式名稱。完成這些步驟後,AWS SAM將生成應用程式。接下來,可以分析生成的範本檔案,並最終佈署應用程式。
技術深度分析
AWS SAM透過簡化無伺服器應用程式的開發流程,提供了諸多優勢。首先,其特定的資源型別(如AWS::Serverless::Function
)簡化了Lambda函式的建立和組態。其次,AWS SAM與CloudFormation的相容性允許開發者利用CloudFormation的強大功能,同時享受無伺服器架構的優勢。
效能最佳化
在使用AWS SAM時,效能最佳化是一個重要的考量。透過合理組態Lambda函式的記憶體和超時設定,可以最佳化函式的效能。此外,利用AWS SAM的本地除錯功能,可以在佈署前發現並修復效能問題。
安全性考量
安全性是無伺服器應用程式開發中的一個關鍵方面。AWS SAM透過與IAM(身份和存取管理)整合,提供了細粒度的存取控制。開發者應確保為Lambda函式組態適當的IAM角色和許可權,以避免不必要的安全風險。
使用AWS SAM佈署無伺服器應用程式
隨著雲端運算技術的快速發展,無伺服器架構(Serverless Architecture)已成為現代軟體開發的主流趨勢之一。AWS SAM(Serverless Application Model)是AWS提供的一種開源框架,用於簡化無伺服器應用程式的開發、測試和佈署過程。本篇文章將探討如何使用AWS SAM來佈署無伺服器應用程式,並透過實際案例展示其強大的功能。
AWS SAM簡介
AWS SAM是一種根據AWS CloudFormation的框架,旨在簡化無伺服器應用程式的開發流程。它提供了一種簡單的語法來定義無伺服器應用程式的資源,如AWS Lambda函式、Amazon API Gateway、Amazon DynamoDB表等。透過使用AWS SAM,開發者可以更快速地開發和佈署無伺服器應用程式,並更好地管理相關資源。
關鍵特性
- 簡化無伺服器應用程式的定義和佈署
- 與AWS CloudFormation緊密整合,提供強大的資源管理能力
- 支援多種AWS服務,包括AWS Lambda、Amazon API Gateway、Amazon DynamoDB等
- 提供本地測試和除錯功能,加速開發流程
建立第一個無伺服器應用程式
讓我們從建立一個簡單的「Hello, World」應用程式開始,逐步瞭解如何使用AWS SAM來開發和佈署無伺服器應用程式。
步驟1:初始化專案
首先,我們需要安裝AWS SAM CLI工具。安裝完成後,可以透過以下命令初始化一個新的AWS SAM專案:
sam init
步驟2:檢視範本檔案
初始化完成後,開啟template.yaml
檔案,可以看到以下內容:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
HelloWorldFunction:
Type: 'AWS::Serverless::Function'
Properties:
Handler: app.lambda_handler
Runtime: python3.8
CodeUri: hello_world/
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Outputs:
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
#### 內容解密:
AWSTemplateFormatVersion
和Transform
定義了範本的版本和使用的AWS SAM轉換器。Resources
部分定義了無伺服器應用程式的資源,包括一個名為HelloWorldFunction
的AWS Lambda函式。Properties
部分定義了Lambda函式的屬性,如處理程式(Handler)、執行環境(Runtime)和程式碼位置(CodeUri)。Events
部分定義了觸發Lambda函式的事件源,在此例中是一個API Gateway事件。Outputs
部分定義了佈署後輸出的值,包括API Gateway的端點URL和Lambda函式的ARN。
建置和佈署應用程式
步驟1:建置應用程式
使用以下命令建置應用程式:
sam build --use-container
這個命令會在容器中建置應用程式,確保所有相依性都被正確安裝。
#### 內容解密:
--use-container
引數指示SAM CLI使用Docker容器來建置應用程式,以確保建置環境的一致性。- 建置完成後,相關的建置產物將被儲存在
.aws-sam/build
目錄下。
步驟2:本地測試
建置完成後,可以使用以下命令進行本地測試:
sam local invoke
或者啟動本地API Gateway進行測試:
sam local start-api
#### 內容解密:
sam local invoke
命令允許開發者在本地呼叫Lambda函式,無需佈署到AWS雲端。sam local start-api
命令啟動一個本地API Gateway,模擬實際佈署後的API端點。
佈署到AWS雲端
完成本地測試後,可以使用以下命令將應用程式佈署到AWS雲端:
sam deploy --stack-name hello-world --capabilities CAPABILITY_IAM --resolve-s3
#### 內容解密:
--stack-name
引數指定了CloudFormation堆積疊的名稱。--capabilities CAPABILITY_IAM
引數允許SAM建立必要的IAM角色。--resolve-s3
引數自動處理S3儲存桶的建立,用於存放佈署包。
檢視日誌和分析
AWS SAM提供了檢視日誌的功能,可以使用以下命令檢視Lambda函式的日誌:
sam logs -n HelloWorldFunction --stack-name hello-world --tail
#### 內容解密:
-n
引數指定了要檢視日誌的Lambda函式名稱。--stack-name
引數指定了相關的CloudFormation堆積疊名稱。--tail
引數表示持續檢視最新的日誌記錄。
建立複雜應用程式
在掌握了基本的AWS SAM應用程式開發和佈署流程後,我們可以進一步建立更複雜的應用程式。例如,建立一個小型派對企劃應用程式,用於處理和儲存派對和嘉賓的相關資訊。
設計考量
- 使用AWS Lambda處理業務邏輯。
- 使用Amazon DynamoDB儲存派對和嘉賓的資料。
- 使用Amazon API Gateway提供RESTful API介面。
實作步驟
- 定義AWS SAM範本,描述相關資源。
- 編寫Lambda函式程式碼,處理業務邏輯。
- 使用AWS SAM CLI建置和佈署應用程式。
- 進行本地測試和除錯。
- 佈署到AWS雲端並進行驗證。