本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
什麼是 AWS Serverless Application Model (AWS SAM)?
AWS Serverless Application Model(AWS SAM) 是改善開發人員在AWS上建置和執行無伺服器應用程式的體驗的工具組。 AWS SAM由兩個主要部分組成:
-
AWS SAM範本規格 — 可用來定義無伺服器應用程式基礎結構的開放原始碼架構。AWS
-
AWS SAM命令列介面 (AWS SAMCLI) — 命令列工具,可搭配AWS SAM範本和支援的第三方整合使用,以建置和執行無伺服器應用程式。
您是無伺服器的新手嗎?
什麼是模AWS SAM板規範?
範AWS SAM本規格是開放原始碼架構,可用來定義和管理無伺服器應用程式基礎結構程式碼。模AWS SAM板規範是:
-
建立在 AWS CloudFormation-直接在AWS SAM模板中使用AWS CloudFormation語法,利用其對資源和屬性配置的廣泛支持。如果您已經熟悉AWS CloudFormation,就不需要學習管理應用程式基礎結構程式碼的新服務。
-
的延伸 AWS CloudFormation — AWS SAM 提供了自己獨特的語法,特別著重於加速無伺服器開發。您可以在同一個範本中使用AWS CloudFormation和AWS SAM語法。
-
抽象的簡短語法 — 使用AWS SAM語法,您可以用更少的代碼行快速定義基礎結構,並降低發生錯誤的機會。其語法經過特別精心策劃,以抽象化定義無伺服器應用程式基礎結構的複雜性。
-
轉型 — AWS SAM 將範本轉換為透過佈建基礎結構所需的程式碼進行複雜的工作。AWS CloudFormation
以下是基本無伺服器應用程式的範例。此應用程序處理請求,以通過 HTTP 請求從數據庫中獲取所有項目。它由以下部分組成:
-
包含處理要求之邏輯的函數。
-
用來做為用戶端 (要求程式) 與應用程式之間的通訊的 HTTP API。
-
儲存項目的資料庫。
-
應用程式安全執行的權限。

此應用程式的基礎結構程式碼可以在下列AWS SAM範本中定義:
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Runtime: nodejs12.x Events: Api: Type: HttpApi Properties: Path: / Method: GET Connectors: MyConn: Properties: Destination: Id: SampleTable Permissions: - Read SampleTable: Type: AWS::Serverless::SimpleTable
在 23 行代碼中,定義了以下基礎結構:
-
使用該AWS Lambda服務的功能。
-
使用亞馬遜 API 閘道服務的 HTTP API。
-
使用亞馬遜動態 B 服務的資料庫。
-
這些服務彼此互動所需的 AWS Identity and Access Management (IAM) 許可。
若要佈建此基礎結構,範本會部署至AWS CloudFormation。在部署期間,AWS SAM將 23 行程式碼轉換為在中產生這些資源所需的AWS CloudFormation語法AWS。轉換後的AWS CloudFormation模板包含超過 200 行代碼!
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "getAllItemsFunction": { "Type": "AWS::Lambda::Function", "Metadata": { "SamResourceId": "getAllItemsFunction" }, "Properties": { "Code": { "S3Bucket": "aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr", "S3Key": "what-is-app/a6f856abf1b2c4f7488c09b367540b5b" }, "Handler": "src/get-all-items.getAllItemsHandler", "Role": { "Fn::GetAtt": [ "getAllItemsFunctionRole", "Arn" ] }, "Runtime": "nodejs12.x", "Tags": [ { "Key": "lambda:createdBy", "Value": "SAM" } ] } }, "getAllItemsFunctionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": [ "sts:AssumeRole" ], "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] } } ] }, "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" ], "Tags": [ { "Key": "lambda:createdBy", "Value": "SAM" } ] } }, "getAllItemsFunctionApiPermission": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Ref": "getAllItemsFunction" }, "Principal": "apigateway.amazonaws.com", "SourceArn": { "Fn::Sub": [ "arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", { "__ApiId__": { "Ref": "ServerlessHttpApi" }, "__Stage__": "*" } ] } } }, "ServerlessHttpApi": { "Type": "AWS::ApiGatewayV2::Api", "Properties": { "Body": { "info": { "version": "1.0", "title": { "Ref": "AWS::StackName" } }, "paths": { "/": { "get": { "x-amazon-apigateway-integration": { "httpMethod": "POST", "type": "aws_proxy", "uri": { "Fn::Sub": "arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${getAllItemsFunction.Arn}/invocations" }, "payloadFormatVersion": "2.0" }, "responses": {} } } }, "openapi": "3.0.1", "tags": [ { "name": "httpapi:createdBy", "x-amazon-apigateway-tag-value": "SAM" } ] } } }, "ServerlessHttpApiApiGatewayDefaultStage": { "Type": "AWS::ApiGatewayV2::Stage", "Properties": { "ApiId": { "Ref": "ServerlessHttpApi" }, "StageName": "$default", "Tags": { "httpapi:createdBy": "SAM" }, "AutoDeploy": true } }, "SampleTable": { "Type": "AWS::DynamoDB::Table", "Metadata": { "SamResourceId": "SampleTable" }, "Properties": { "AttributeDefinitions": [ { "AttributeName": "id", "AttributeType": "S" } ], "KeySchema": [ { "AttributeName": "id", "KeyType": "HASH" } ], "BillingMode": "PAY_PER_REQUEST" } }, "getAllItemsFunctionMyConnPolicy": { "Type": "AWS::IAM::ManagedPolicy", "Metadata": { "aws:sam:connectors": { "getAllItemsFunctionMyConn": { "Source": { "Type": "AWS::Serverless::Function" }, "Destination": { "Type": "AWS::Serverless::SimpleTable" } } } }, "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:BatchGetItem", "dynamodb:ConditionCheckItem", "dynamodb:PartiQLSelect" ], "Resource": [ { "Fn::GetAtt": [ "SampleTable", "Arn" ] }, { "Fn::Sub": [ "${DestinationArn}/index/*", { "DestinationArn": { "Fn::GetAtt": [ "SampleTable", "Arn" ] } } ] } ] } ] }, "Roles": [ { "Ref": "getAllItemsFunctionRole" } ] } } } }
透過使用AWS SAM,您可以定義 23 行基礎結構程式碼。 AWS SAM將您的代碼轉換為佈建應用程序所需的 200 多行AWS CloudFormation代碼。
什麼是 AWS SAM CLI?
AWS SAMCLI 是命令列工具,可搭配AWS SAM範本和支援的第三方整合使用,以建置和執行無伺服器應用程式。使用 AWS SAM CLI 執行下列作業:
-
快速初始化新的應用程式專案。
-
建置用於部署的應用程式。
-
執行本地調試和測試。
-
部署您的應用程式。
-
設定 CI/CD 部署管線。
-
監控雲端中的應用程式並進行疑難排解。
-
在開發過程中將本機變更同步至雲端。
-
以及更多!
與AWS SAM和AWS CloudFormation範本一起使用時,AWS SAMCLI 最好使用。它還適用於第三方產品,例如Terraform.
初始化新專案
從初學者模板中選擇或選擇自定義模板位置以開始新項目。
在這裡,我們使用命sam init令來初始化一個新的應用程序項目。我們選擇你好世界範例項目開始。AWS SAMCLI 會下載入門範本,並建立我們的專案資料夾目錄結構。

建置用於部署的應用程式
打包您的函數依賴關係,並組織您的項目代碼和文件夾結構以準備部署。
在這裡,我們使用命sam build令來準備我們的應用程序部署。AWS SAMCLI 會建立一個.aws-sam
目錄,並將我們的應用程式相依性和檔案組織在那裡進行部署。

執行本地調試和測試
在您的本機電腦上,模擬事件、測試 API、叫用函數等,以偵錯和測試應用程式。
在這裡,我們使用命sam local invoke令來調用我們的HelloWorldFunction
本地。為了做到這一點,AWS SAMCLI 創建一個本地容器,構建我們的函數,調用它,並輸出結果。

部署您的應用程式
設定應用程式的部署設定,並部署至AWS雲端以佈建資源。
在這裡,我們使用命sam deploy --guided令通過交互式流程部署我們的應用程序。AWS SAMCLI 引導我們完成配置應用程序的部署設置AWS CloudFormation,將模板轉換為並部署AWS CloudFormation以創建我們的資源。

設定 CI/CD 部署管線
使用支援的 CI/CD 系統,建立安全的持續整合與傳遞 (CI/CD) 管線。
在這裡,我們使用命sam pipeline init --bootstrap令為我們的應用程序配置 CI/CD 部署管道。AWS SAMCLI 會引導我們完成我們的選項,並生成與 CI/CD 系統一起使用的AWS資源和配置文件。

監控雲端中的應用程式並進行疑難排解
檢視已部署資源的重要資訊、收集記錄,以及使用內建的監視工具,例如AWS X-Ray.
在這裡,我們使用命sam list令來查看我們部署的資源。我們得到我們的 API 端點並調用它,這會觸發我們的功能。然後,我們用sam logs來查看函數的日誌。

在開發過程中將本機變更同步至雲端
當您在本機電腦上進行開發時,會自動將變更同步到雲端。快速查看您的變更,並在雲端執行測試和驗證。
在這裡,我們使用sam sync --watch命令讓 AWS SAM CLI 監視本地更改。我們會修改HelloWorldFunction
程式碼,AWS SAMCLI 會自動偵測變更並將更新部署到雲端。

在雲端測試您的 Lambda 函數
叫用事件並將其傳遞至雲端中的 Lambda 函數。
在這裡,我們使用sam remote invoke命令來測試雲端中部署的 Lambda 函數。我們叫用 Lambda 函數並接收其記錄和回應。藉由設定為串流回應的 Lambda 函數,AWS SAMCLI 會即時串流回應。

使用 AWS SAM 的優勢
以下是您可以完成的一些示例AWS SAM:
- 使用更少的程式碼,快速定義應用程式基礎架構
-
撰寫AWS SAM範本以定義無伺服器應用程式基礎結構程式碼。直接部署範本AWS CloudFormation以佈建資源。
- 在整個開發生命週期中管理無伺服器應用程式
-
透過開發生命週期的編寫、建置、部署、測試和監控階段,使用 AWS SAM CLI 來管理您的無伺服器應用程式。如需詳細資訊,請參閱使用 AWS SAM CLI。
- 使用AWS SAM連接器在資源之間快速佈建權
-
使用AWS SAM範本中的AWS SAM連接器來定義AWS資源之間的權限。 AWS SAM將您的程式碼轉換為促進您意圖所需的 IAM 許可。如需詳細資訊,請參閱使用AWS SAM連接器管理資源權限。
- 在開發過程中持續將本機變更同步至雲端
-
使用 AWS SAM CLI sam sync 指令自動將本機變更同步至雲端,加速開發和雲端測試工作流程。如需詳細資訊,請參閱使用 sam sync。
- 管理Terraform無伺服器應用程式
-
使用 AWS SAM CLI 對 Lambda 函數和層執行本機偵錯和測試。如需詳細資訊,請參閱AWS SAMCLI Terraform 支援。
進一步了解
若要繼續學習AWS SAM,請參閱下列資源:
-
完整的AWS SAM工作坊
— 旨在教您AWS SAM提供許多主要功能的工作坊。 -
與 SAM 的會話
— 由我們的AWS無伺服器開發人員倡導團隊建立的影片系列,內容包括 AWS SAM -
無伺服器 Land
— 整合無AWS伺服器的最新資訊、部落格、影片、程式碼和學習資源的網站。
後續步驟
如果這是您第一次使用AWS SAM,請參閱AWS SAM 入門。