什麼是 AWS Serverless Application Model (AWS SAM)? - AWS Serverless Application Model

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

什麼是 AWS Serverless Application Model (AWS SAM)?

AWS Serverless Application Model (AWS SAM) 是改善開發人員在 AWS上建置和執行無伺服器應用程式的體驗的工具組。 AWS SAM 提供多種好處:

使用更少的程式碼,快速定義應用程式基礎架構

撰寫 AWS SAM 範本以定義無伺服器應用程式基礎結構程式碼。直接部署範本 AWS CloudFormation 以佈建資源。

在整個開發生命週期中管理無伺服器應用程式

透過開發生命週期的編寫、建置、部署、測試和監控階段,使用 AWS SAMCLI來管理您的無伺服器應用程式。如需詳細資訊,請參閱 使用 AWS SAMCLI

使用 AWS SAM 連接器在資源之間快速佈建權

在 AWS SAM 範本中使用 AWS SAM 連接器來定義 AWS 資源之間的權限。 AWS SAM 將您的程式碼轉換為促進您意圖所需的 IAM 許可。如需詳細資訊,請參閱 使用AWS SAM連接器管理資源權限

在開發過程中持續將本機變更同步至雲端

使用此指 AWS SAMCLIsam sync令自動將本機變更同步至雲端,加速開發和雲端測試工作流程。如需詳細資訊,請參閱 使用 sam sync

管理Terraform無伺服器應用程式

使用可 AWS SAMCLI對 Lambda 函數和層執行本機偵錯和測試。如需詳細資訊,請參閱 AWS SAMCLITerraform支持

基本概念

AWS SAM 由三個主要部分組成:

  1. AWS SAM 範本規格 — 可用來定義無伺服器應用程式基礎結構的開放原始碼架構。 AWS這個框架是通過 AWS SAM 模板訪問。

  2. AWS SAM template — 您用來存取 AWS SAM 範本規格的內容,也就是可用來定義無伺服器應用程式基礎結構的開放原始碼架構。 AWS AWS SAM 模板是模 AWS CloudFormation 板的擴展與一些額外的組件,使他們更容易使用。

  3. 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

什麼是 AWS SAM 模板?

AWS SAM 範本是您用來存取 AWS SAM 範本規格的原始碼架構,也就是您可以用來定義無伺服器應用程式基礎結構的開放原始碼架構 AWS,還有一些額外的元件可讓您更輕鬆地使用範本。從這個意義上說, AWS SAM 模板是 AWS CloudFormation 模板的擴展。

以下是基本無伺服器應用程式的範例。此應用程序處理請求,以通過 HTTP 請求從數據庫中獲取所有項目。它由以下部分組成:

  1. 包含處理要求之邏輯的函數。

  2. 用來做為用戶端 (要求程式) 與應用程式之間的通訊的 HTTP API。

  3. 儲存項目的資料庫。

  4. 應用程式安全執行的權限。

簡單無伺服器應用程式的應用程式架構

此應用程式的基礎結構程式碼可以在下列 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 服務的功能。

  • 使用 Amazon API Gateway 服務的 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 SAMCLI?

這 AWS SAMCLI是一個命令列工具,您可以搭配 AWS SAM 範本和支援的第三方整合使用,以建置和執行無伺服器應用程式。使用 AWS SAMCLI來:

  • 快速初始化新的應用程式專案。

  • 建置用於部署的應用程式。

  • 執行本地調試和測試。

  • 部署您的應用程式。

  • 設定 CI/CD 部署管線。

  • 監控雲端中的應用程式並進行疑難排解。

  • 在開發過程中將本機變更同步至雲端。

  • 以及更多!

與 AWS SAM 和 AWS CloudFormation 範本搭配使用時, AWS SAMCLI最好使用。它還適用於第三方產品,例如Terraform.

初始化新專案

從初學者模板中選擇或選擇自定義模板位置以開始新項目。

在這裡,我們使用命sam init令來初始化一個新的應用程序項目。我們選擇你好世界範例項目開始。下 AWS SAMCLI載入門範本並建立我們的專案資料夾目錄結構。

用sam init來啟動新的應用程式專案 AWS SAMCLI。

建置用於部署的應用程式

打 Package 您的函數依賴關係,並組織您的項目代碼和文件夾結構以準備部署。

在這裡,我們使用命sam build令來準備我們的應用程序進行部署。 AWS SAMCLI創建一個.aws-sam目錄並組織我們的應用程序依賴關係和文件在那裡進行部署。

用sam build來準備要部署的應用程式。

執行本地調試和測試

在您的本機電腦上,模擬事件、測試 API、叫用函數等,以偵錯和測試應用程式。

在這裡,我們使用命sam local invoke令來調用我們的HelloWorldFunction本地。為了做到這一點, AWS SAMCLI創建一個本地容器,構建我們的函數,調用它,並輸出結果。

使用命 AWS SAMCLIsam local invoke令在本地調用函數。

部署您的應用程式

設定應用程式的部署設定,並部署至 AWS 雲端以佈建資源。

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

使用命 AWS SAMCLIsam deploy令將應用程式部署到 AWS 雲端。

設定 CI/CD 部署管線

使用支援的 CI/CD 系統,建立安全的持續整合與傳遞 (CI/CD) 管線。

在這裡,我們使用命sam pipeline init --bootstrap令為我們的應用程序配置 CI/CD 部署管道。這會 AWS SAMCLI引導我們完成我們的選項,並生成與我們的 CI/CD 系統一起使用的 AWS 資源和配置文件。

使用指 AWS SAMCLIsam pipeline init --bootstrap令使用我們偏好的 CI/CD 系統來設定 CI/CD 管線。

監控雲端中的應用程式並進行疑難排解

檢視已部署資源的相關重要資訊、收集記錄,以及使用內建的監視工具,例如 AWS X-Ray.

在這裡,我們使用命sam list令來查看我們部署的資源。我們得到我們的 API 端點並調用它,這會觸發我們的功能。然後,我們用sam logs來查看函數的日誌。

使用命 AWS SAMCLIsam list令獲取我們的 API 端點。然後,用sam logs於查看我們函數的日誌。

在開發過程中將本機變更同步至雲端

當您在本機電腦上進行開發時,會自動將變更同步到雲端。快速查看您的變更,並在雲端執行測試和驗證。

在這裡,我們使用sam sync --watch命令來 AWS SAMCLI監視本地更改。我們會修改HelloWorldFunction程式碼,並 AWS SAMCLI自動偵測變更,並將更新部署到雲端。

使用指 AWS SAMCLIsam sync令將本機變更同步至 AWS 雲端。

測試雲端中支援的資源

呼叫事件並將其傳遞至雲端中支援的資源。

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

使用命 AWS SAMCLIsam remote invoke令來測試我們在 AWS 雲中部署的功能。

進一步了解

若要繼續學習 AWS SAM,請參閱下列資源:

  • 完整的 AWS SAM 工作坊 — 旨在教您 AWS SAM 提供許多主要功能的工作坊。

  • 與 SAM 的會話 — 由我們的 AWS 無伺服器開發人員倡導團隊建立的影片系列,內容包括 AWS SAM

  • 無伺服器 Land — 整合無 AWS 伺服器的最新資訊、部落格、影片、程式碼和學習資源的網站。

後續步驟

如果這是您第一次使用 AWS SAM,請參閱AWS SAM 入門