本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Serverless Application Model(Amazon SAM) 是什么?
Amazon Serverless Application Model(Amazon SAM) 是一个工具包,可改善开发人员在上Amazon构建和运行无服务器应用程序的体验。 Amazon SAM由两个主要部分组成:
-
Amazon SAM模板规范 — 一个开源框架,您可以使用它来定义您的无服务器应用程序基础Amazon架构。
-
Amazon SAM命令行接口 (Amazon SAMCLI) — 一种命令行工具,您可以将其与Amazon SAM模板和支持的第三方集成一起使用,以构建和运行您的无服务器应用程序。
你是无服务器的新手吗?
Amazon SAM模板规范是什么?
Amazon SAM模板规范是一个开源框架,您可以使用它来定义和管理您的无服务器应用程序基础架构代码。Amazon SAM模板规范是:
-
内@@ 建 Amazon CloudFormation — 利用Amazon SAM模板对资源和属性配置的广泛支持,直接在模板中使用Amazon CloudFormation语法。如果您已经熟悉Amazon CloudFormation,则无需学习新服务即可管理应用程序基础架构代码。
-
Amazon CloudFormation-的扩展Amazon SAM提供了自己独特的语法,专门用于加快无服务器开发。可以在同一个模板中同时使用Amazon CloudFormation和Amazon SAM语法。
-
抽象、简短的语法-使用该Amazon SAM语法,您可以使用更少的代码行快速定义基础架构,同时降低出错几率。它的语法经过特别精心设计,可以抽象出定义无服务器应用程序基础架构的复杂性。
-
Amazon SAMT@@ ran sformational — 完成将模板转换为调配基础架构所需的代码的复杂工作。Amazon CloudFormation
以下是基本的无服务器应用程序的示例。此应用程序处理通过 HTTP 请求从数据库获取所有项目的请求。它由以下部分组成:
-
一个包含处理请求的逻辑的函数。
-
一个 HTTP API,用作客户端(请求者)和应用程序之间的通信。
-
用于存储物品的数据库。
-
应用程序安全运行的权限。

可以在以下Amazon 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 行代码中,定义了以下基础架构:
-
使用Amazon Lambda服务的函数。
-
使用亚马逊 API 网关服务的 HTTP API。
-
使用亚马逊 DynamoDB 服务的数据库。
-
这些服务相互交互所需的 Amazon Identity and Access Management (IAM) 权限。
要配置此基础架构,需要将模板部署到Amazon CloudFormation。在部署期间,将 23 行代码Amazon SAM转换为生成这些资源所需的Amazon CloudFormation语法Amazon。转换后的Amazon 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" } ] } } } }
通过使用Amazon SAM,您可以定义 23 行基础架构代码。 Amazon SAM将您的代码转换为预置应用程序所需的 200 多行Amazon CloudFormation代码。
Amazon SAMCLI 是什么?
Amazon SAMCLI 是一种命令行工具,您可以将其与Amazon SAM模板和支持的第三方集成一起使用来构建和运行您的无服务器应用程序。使用 Amazon SAM CLI 可以:
-
快速初始化新的应用程序项目。
-
构建您的应用程序以供部署。
-
进行本地调试和测试。
-
部署您的应用程序。
-
配置 CI/CD 部署管道。
-
监控您的云端应用程序并对其进行故障排除。
-
开发时将本地更改同步到云端。
-
还有更多!
与Amazon SAM和Amazon CloudFormation模板一起使用时,Amazon SAMCLI 最适合使用。它还适用于第三方产品,例如Terraform。
初始化一个新项目
从入门模板中选择或选择自定义模板位置以开始新项目。
在这里,我们使用sam init命令来初始化一个新的应用程序项目。我们首先选择 Hello World 示例项目。C Amazon SAM LI 下载入门模板并创建我们的项目文件夹目录结构。

构建您的应用程序以供部署
打包函数依赖关系并整理项目代码和文件夹结构,为部署做好准备。
在这里,我们使用sam build命令来准备要部署的应用程序。C Amazon SAM LI 创建了一个.aws-sam
目录并将我们的应用程序依赖关系和文件整理到那里进行部署。

进行本地调试和测试
在本地计算机上,模拟事件、测试 API、调用函数等,以调试和测试应用程序。
在这里,我们使用sam local invoke命令HelloWorldFunction
在本地调用我们的命令。为此,Amazon SAMCLI 创建了一个本地容器,构建了我们的函数,调用它并输出结果。

部署您的应用程序
配置应用程序的部署设置并部署到Amazon云端以预置您的资源。
在这里,我们使用sam deploy --guided命令通过交互式流程部署应用程序。C Amazon SAM LI 指导我们配置应用程序的部署设置,将模板转换为Amazon CloudFormation,然后部署到Amazon CloudFormation以创建资源。

配置 CI/CD 部署管道
使用支持的 CI/CD 系统创建安全的持续集成和交付 (CI/CD) 管道。
在这里,我们使用sam pipeline init --bootstrap命令为我们的应用程序配置 CI/CD 部署管道。C Amazon SAM LI 指导我们完成选项并生成Amazon资源和配置文件以用于 CI/CD 系统。

监控您的云端应用程序并对其进行故障排除
查看有关已部署资源的重要信息,收集日志,并使用内置监控工具,例如Amazon X-Ray。
在这里,我们使用sam list命令来查看我们部署的资源。我们获取 API 端点并调用它,这会触发我们的函数。然后,我们使用sam logs来查看函数的日志。

开发时将本地更改同步到云端
当你在本地计算机上开发时,自动将更改同步到云端。快速查看您的更改并在云端进行测试和验证。
在这里,我们使用sam sync --watch命令让 Amazon SAM CLI 监视本地更改。我们修改HelloWorldFunction
代码,Amazon SAMCLI 会自动检测到更改并将我们的更新部署到云端。

在云端测试您的 Lambda 函数
调用事件并将其传递给云中的 Lambda 函数。
在这里,我们使用sam remote invoke命令在云中测试已部署的 Lambda 函数。我们调用 Lambda 函数并接收其日志和响应。将我们的 Lambda 函数配置为流式传输响应后,Amazon SAMCLI 会将其响应实时传输回流。

使用 Amazon SAM 的好处
以下是一些你可以完成的任务的示例Amazon SAM:
- 使用更少的代码快速定义应用程序基础架构代码
-
创作Amazon SAM模板以定义您的无服务器应用程序基础架构代码。将您的模板直接部署到Amazon CloudFormation以预置您的资源。
- 在您的无服务器应用程序的整个开发生命周期中对其进行管理
-
使用 Amazon SAM CLI 在开发生命周期的创作、构建、部署、测试和监控阶段管理您的无服务器应用程序。有关更多信息,请参阅使用 Amazon SAM CLI:
- 使用Amazon SAM连接器在资源之间快速配置权限
-
在Amazon SAM模板中使用Amazon SAM连接器来定义Amazon资源之间的权限。 Amazon SAM将您的代码转换为实现您的意图所需的 IAM 权限。有关更多信息,请参阅使用Amazon SAM连接器管理资源权限:
- 开发时持续将本地更改同步到云端
-
使用 Amazon SAM CLI sam sync 命令自动将本地更改同步到云端,加快开发和云测试工作流程。有关更多信息,请参阅使用 sam sync:
- 管理您的Terraform无服务器应用程序
-
使用 Amazon SAM CLI 对 Lambda 函数和层执行本地调试和测试。有关更多信息,请参阅Amazon SAMCLI Terraform 支持:
了解更多信息
要继续了解Amazon SAM,请参阅以下资源:
-
完整Amazon SAM研讨会
—旨在向您传授所Amazon SAM提供的许多主要功能的研讨会。 -
与SAM的会话
—由我们的Amazon无服务器开发者倡导者团队创建的关于使用的Amazon SAM视频系列. -
Serverless Land — 汇集了有关无
Amazon服务器的最新信息、博客、视频、代码和学习资源的站点。
后续步骤
如果这是您第一次使用Amazon SAM,请参阅Amazon SAM 入门。