本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
如何 AWS SAM 工作
AWS SAM 由您用來建立無伺服應用程式的兩個主要元件組成:
-
該 AWS SAM 項目— 執行sam init命令時建立的資料夾和檔案。此目錄包含AWS SAM 範本,這是定義 AWS 資源的重要檔案。此範本包含範AWS SAM 本規格 — 開放原始碼架構,其中包含簡化的簡短語法,可用來定義無伺服器應用程式的函數、事件、API、組態和權限。
-
該 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 請求從數據庫中獲取所有項目。它由以下部分組成:
-
包含處理要求之邏輯的函數。
-
用來做為用戶端 (要求程式) 與應用程式之間的通訊的 HTTP API。
-
儲存項目的資料庫。
-
應用程式安全執行的權限。
![簡單無伺服器應用程式的應用程式架構](images/what-is-sam-06.png)
此應用程式的基礎結構程式碼可以在下列 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。](images/what-is-sam-01.gif)
如需詳細資訊,請參閱使用sam init指令建立您的應用程式。
建置用於部署的應用程式
打 Package 您的函數依賴關係,並組織您的項目代碼和文件夾結構以準備部署。
在這裡,我們使用命sam build令來準備我們的應用程序進行部署。 AWS SAMCLI創建一個.aws-sam
目錄並組織我們的應用程序依賴關係和文件在那裡進行部署。
![用sam build來準備要部署的應用程式。](images/what-is-sam-02.gif)
如需詳細資訊,請參閱建置應用程式。
執行本地調試和測試
在您的本機電腦上,模擬事件、測試 API、叫用函數等,以偵錯和測試應用程式。
在這裡,我們使用命sam local invoke令來調用我們的HelloWorldFunction
本地。為了做到這一點, AWS SAMCLI創建一個本地容器,構建我們的函數,調用它,並輸出結果。您可以使用 Docker 之類的應用程序在計算機上運行容器。
![使用命 AWS SAMCLIsam local invoke令在本地調用函數。](images/what-is-sam-04.gif)
部署您的應用程式
設定應用程式的部署設定,並部署至 AWS 雲端以佈建資源。
在這裡,我們使用命sam deploy --guided令通過交互式流程部署我們的應用程序。引 AWS SAMCLI導我們完成配置應用程序的部署設置 AWS CloudFormation,將模板轉換為並部署 AWS CloudFormation 以創建我們的資源。
![使用命 AWS SAMCLIsam deploy令將應用程式部署到 AWS 雲端。](images/what-is-sam-03.gif)
如需詳細資訊,請參閱部署您的應用程式和資源。
設定 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 管線。](images/what-is-sam-07.gif)
如需詳細資訊,請參閱使用 CI/CD 系統和管線進行部署。
監控雲端中的應用程式並進行疑難排解
檢視已部署資源的相關重要資訊、收集記錄,以及使用內建的監視工具,例如 AWS X-Ray.
在這裡,我們使用命sam list令來查看我們部署的資源。我們得到我們的 API 端點並調用它,這會觸發我們的功能。然後,我們用sam logs來查看函數的日誌。
![使用命 AWS SAMCLIsam list令獲取我們的 API 端點。然後,用sam logs於查看我們函數的日誌。](images/what-is-sam-08.gif)
如需詳細資訊,請參閱監控您的應用。
在開發過程中將本機變更同步至雲端
當您在本機電腦上進行開發時,會自動將變更同步到雲端。快速查看您的變更,並在雲端執行測試和驗證。
在這裡,我們使用sam sync --watch命令來 AWS SAMCLI監視本地更改。我們會修改HelloWorldFunction
程式碼,並 AWS SAMCLI自動偵測變更,並將更新部署到雲端。
![使用指 AWS SAMCLIsam sync令將本機變更同步至 AWS 雲端。](images/what-is-sam-05.gif)
測試雲端中支援的資源
呼叫事件並將其傳遞至雲端中支援的資源。
在這裡,我們使用sam remote invoke命令來測試雲端中部署的 Lambda 函數。我們叫用 Lambda 函數並接收其記錄和回應。我們的 Lambda 函數設定為 AWS SAMCLI串流回應後,即時串流回應。
![使用命 AWS SAMCLIsam remote invoke令來測試我們在 AWS 雲中部署的功能。](images/what-is-sam-09.gif)
進一步了解
若要繼續學習 AWS SAM,請參閱下列資源:
-
完整的 AWS SAM 工作坊
— 旨在教您 AWS SAM 提供許多主要功能的工作坊。 -
與 SAM 的會話
— 由我們的 AWS 無伺服器開發人員倡導團隊建立的影片系列,內容包括 AWS SAM -
無伺服器 Land
— 將無 AWS 伺服器的最新資訊、部落格、影片、程式碼和學習資源整合在一起的網站。
後續步驟
如果這是您第一次使用 AWS SAM,請參閱開始使用 AWS SAM。