本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS SAM 運作方式
使用 AWS SAM 建立無伺服器應用程式時,您將與下列元件互動:
-
AWS SAM 範本 – 定義 AWS 資源的重要檔案。此範本包含AWS SAM 範本規格 – 開放原始碼架構,隨附您用來定義無伺服器應用程式的函數、事件、APIs、組態和許可的簡化速記語法。此檔案位於 AWS SAM 專案中,這是在您執行 sam init命令時建立的應用程式資料夾。
-
AWS SAM CLI – 命令列工具,可與 AWS SAM 專案和支援的第三方整合搭配使用,以建置和執行無伺服器應用程式。 AWS SAMCLI 是您用來在 AWS SAM 專案上執行命令,最終將其轉換為無伺服器應用程式的工具。
若要表達定義無伺服器應用程式的資源、事件來源映射和其他屬性,您可以在 AWS SAM 範本和 AWS SAM 專案中的其他檔案中定義資源和開發應用程式。您可以使用 AWS SAMCLI 在 AWS SAM 專案上執行命令,這是初始化、建置、測試和部署無伺服器應用程式的方式。
第一次使用無伺服器?
範本 AWS SAM 規格是什麼?
AWS SAM 範本規格是一種開放原始碼架構,可用來定義和管理無伺服器應用程式基礎設施程式碼。 AWS SAM 範本規格為:
-
建置於 AWS CloudFormation - 您可以直接在 AWS SAM 範本中使用 CloudFormation 語法,充分利用其對資源和屬性組態的廣泛支援。如果您已經熟悉 CloudFormation,就不必學習新的服務來管理您的應用程式基礎設施程式碼。
-
的延伸 CloudFormation AWS SAM 提供自己的唯一語法,特別著重於加速無伺服器開發。您可以在相同的範本中使用 AWS SAM CloudFormation 和 語法。
-
抽象的速記語法 – 使用 AWS SAM 語法,您可以快速定義基礎設施、減少程式碼行,並降低錯誤的機率。其語法經過特別策劃,可消除定義無伺服器應用程式基礎設施的複雜性。
-
轉換 – AWS SAM 執行將範本轉換為透過 佈建基礎設施所需的程式碼的複雜工作 CloudFormation。
什麼是 AWS SAM 專案和 AWS SAM 範本?
AWS SAM 專案包含範本 AWS SAM ,其中包含 AWS SAM 範本規格。此規格是您用來定義無伺服器應用程式基礎設施的開放原始碼架構 AWS,還有一些額外的元件,可讓您更輕鬆地使用。在此意義上, AWS SAM 範本是 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: nodejs20.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。
-
使用 Amazon DynamoDB 服務的資料庫。
-
這些服務彼此互動所需的 AWS Identity and Access Management (IAM) 許可。
若要佈建此基礎設施,會部署 範本 CloudFormation。在部署期間, 會將 23 行程式碼 AWS SAM 轉換為產生這些資源所需的 CloudFormation 語法 AWS。轉換後的 CloudFormation 範本包含超過 200 行程式碼!
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "getAllItemsFunction": { "Type": "AWS::Lambda::Function", "Metadata": { "SamResourceId": "getAllItemsFunction" }, "Properties": { "Code": { "S3Bucket": "amzn-s3-demo-source-bucket-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 多行 CloudFormation 程式碼。
什麼是 AWS SAMCLI?
AWS SAMCLI 是命令列工具,您可以搭配 AWS SAM 範本和支援的第三方整合使用,以建置和執行無伺服器應用程式。使用 AWS SAMCLI來:
-
快速初始化新的應用程式專案。
-
建置您的應用程式以進行部署。
-
執行本機偵錯和測試。
-
部署您的應用程式。
-
設定 CI/CD 部署管道。
-
在雲端中監控您的應用程式並進行疑難排解。
-
在您開發時同步本機變更至雲端。
-
還有更多!
與 AWS SAM 和 CloudFormation 範本搭配使用時, AWS SAMCLI最適合使用 。它也適用於第三方產品,例如 Terraform。
初始化新專案
從入門範本中選取 ,或選擇自訂範本位置以開始新的專案。
在這裡,我們使用 sam init命令來初始化新的應用程式專案。我們選取要開始的 Hello World 範例專案。會 AWS SAMCLI下載入門範本並建立專案資料夾目錄結構。
如需詳細資訊,請參閱在 中建立您的應用程式 AWS SAM。
建置您的應用程式以進行部署
封裝您的函數相依性,並組織專案程式碼和資料夾結構以準備部署。
在這裡,我們使用 sam build命令來準備我們的應用程式以進行部署。 AWS SAMCLI 會建立.aws-sam目錄,並在其中組織我們的應用程式相依性和檔案以進行部署。
如需詳細資訊,請參閱建置您的應用程式。
執行本機偵錯和測試
在本機機器上,模擬事件、測試 APIs、叫用 函數等,以偵錯和測試您的應用程式。
在這裡,我們使用 sam local invoke命令在HelloWorldFunction本機叫用 。為了達成此目的, AWS SAMCLI會建立本機容器、建置函數、叫用它,並輸出結果。您可以使用 Docker 之類的應用程式在機器上執行容器。
部署您的應用程式
設定應用程式的部署設定,並部署到 AWS 雲端以佈建您的 資源。
在這裡,我們使用 sam deploy --guided命令透過互動式流程部署我們的應用程式。 AWS SAMCLI 會引導我們設定應用程式的部署設定、將範本轉換為 CloudFormation,以及將 範本部署至 CloudFormation 以建立資源。
如需詳細資訊,請參閱部署您的應用程式和資源。
設定 CI/CD 部署管道
使用支援的 CI/CD 系統建立安全的持續整合和交付 (CI/CD) 管道。
在這裡,我們使用 sam pipeline init --bootstrap命令來設定應用程式的 CI/CD 部署管道。 AWS SAMCLI 會引導我們完成選項,並產生 AWS 資源和組態檔案,以搭配我們的 CI/CD 系統使用。
如需詳細資訊,請參閱使用 CI/CD 系統和管道部署。
在雲端中監控您的應用程式並進行故障診斷
檢視已部署資源的重要資訊、收集日誌,以及利用內建監控工具,例如 AWS X-Ray。
在這裡,我們使用 sam list命令來檢視我們部署的資源。我們取得 API 端點並叫用它,這會觸發我們的函數。然後,我們使用 sam logs 來檢視函數的日誌。
如需詳細資訊,請參閱監控您的應用程式。
在您開發時同步本機變更至雲端
當您在本機電腦上開發 時, 會自動將變更同步至雲端。快速查看您的變更,並在雲端中執行測試和驗證。
在這裡,我們使用 sam sync --watch命令來監 AWS SAMCLI看本機變更。我們會修改HelloWorldFunction程式碼,而 AWS SAMCLI會自動偵測變更,並將我們的更新部署到雲端。
在雲端測試支援的資源
叫用事件並將其傳遞至雲端中支援的資源。
在這裡,我們使用 sam remote invoke命令來測試雲端中部署的 Lambda 函數。我們調用 Lambda 函數並接收其日誌和回應。設定 Lambda 函數以串流回應時, AWS SAMCLI 會即時將其回應串流回去。
進一步了解
若要繼續了解 AWS SAM,請參閱下列資源:
-
完成 AWS SAM 研討會
– 旨在教導您許多 AWS SAM 提供的主要功能的研討會。 -
使用 SAM 的工作階段
– 由我們的 AWS Serverless Developer Advocate 團隊在使用 時建立的影片系列 AWS SAM。 -
無伺服器土地
– 網站,匯集無 AWS 伺服器的最新資訊、部落格、影片、程式碼和學習資源。
後續步驟
如果這是您第一次使用 AWS SAM,請參閱 入門 AWS SAM。