如何 AWS SAM 工作 - AWS Serverless Application Model

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

如何 AWS SAM 工作

AWS SAM 由您用來建立無伺服應用程式的兩個主要元件組成:

  1. 該 AWS SAM 項目— 執行sam init命令時建立的資料夾和檔案。此目錄包含AWS SAM 範本,這是定義 AWS 資源的重要檔案。此範本包含範AWS SAM 本規格 — 開放原始碼架構,其中包含簡化的簡短語法,可用來定義無伺服器應用程式的函數、事件、API、組態和權限。

  2. 該 AWS SAMCLI— 命令列工具,可用於 AWS SAM 專案和受支援的第三方整合,以建置和執行無伺服器應用程式。 AWS SAMCLI) 是您用來在 AWS SAM 專案上執行命令,並最終將其轉換為無伺服器應用程式的工具。

若要表示定義無伺服器應用程式的資源、事件來源對應及其他屬性,您可以在 AWS SAM 範本和 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 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 SAM 範本和支援的第三方整合使用,以建置和執行無伺服器應用程式。 AWS SAMCLI使用 AWS SAMCLI來:

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

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

  • 執行本地調試和測試。

  • 部署您的應用程式。

  • 設定 CI/CD 部署管線。

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

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

  • 以及更多!

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

初始化新專案

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

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

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

如需詳細資訊,請參閱使用sam init指令建立您的應用程式

建置用於部署的應用程式

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

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

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

如需詳細資訊,請參閱建置應用程式

執行本地調試和測試

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

在這裡,我們使用命sam local invoke令來調用我們的HelloWorldFunction本地。為了做到這一點, AWS SAMCLI創建一個本地容器,構建我們的函數,調用它,並輸出結果。您可以使用 Docker 之類的應用程序在計算機上運行容器。

使用命 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 管線。

如需詳細資訊,請參閱使用 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