Amazon Serverless Application Model(Amazon SAM) 是什么? - Amazon Serverless Application Model
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Serverless Application Model(Amazon SAM) 是什么?

Amazon Serverless Application Model(Amazon SAM) 是一个工具包,可改善开发人员在上构建和运行无服务器应用程序的体验Amazon。 Amazon SAM由两个主要部分组成:

  1. Amazon SAM模板规范 — 一个开源框架,可用于在其上定义无服务器应用程序基础架构Amazon。

  2. 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 SAM — 完成将模板转换为配置基础架构所需的代码的复杂工作Amazon CloudFormation。

下面是一个基本的无服务器应用程序示例。此应用程序处理通过 HTTP 请求从数据库获取所有项目的请求。它由以下部分组成:

  1. 一个包含处理请求的逻辑的函数。

  2. 一个 HTTP API,用作客户端(请求者)和应用程序之间的通信。

  3. 用于存储物品的数据库。

  4. 应用程序安全运行的权限。


				简单无服务器应用程序的应用程序架构。

可以在以下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服务的函数。

  • 使用Amazon API Gateway 服务的 HTTP API。

  • 使用Amazon DynamoDB 服务的数据库。

  • 这些服务相互交互所需的Amazon Identity and Access Management (IAM) 权限。

要配置此基础架构,将模板部署到Amazon CloudFormation。在部署期间,Amazon SAM将 23 行代码转换为生成这些资源所需的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 SAM CLI?

Amazon SAMCLI 是一种命令行工具,您可以将其与Amazon SAM模板和支持的第三方集成一起使用,以构建和运行您的无服务器应用程序。使用Amazon SAM CLI 可以:

  • 快速初始化新的应用程序项目。

  • 生成要部署的应用程序。

  • 执行本地调试和测试。

  • 部署您的应用程序。

  • 配置 CI/CD 部署管道。

  • 监控云中的应用程序并对其进行故障排除。

  • 在开发时将本地更改同步到云端。

  • 还有更多!

CAmazon SAM LI 与Amazon SAM和Amazon CloudFormation模板一起使用时效果最佳。它也可以与第三方产品一起使用,例如Terraform.

初始化新项目

从起始模板中选择或选择自定义模板位置以开始新项目。

在这里,我们使用该sam init命令来初始化一个新的应用程序项目。我们选择 Hello World 示例项目作为开始。CAmazon SAM LI 下载入门模板并创建我们的项目文件夹目录结构。


					sam init用于使用Amazon SAM CLI 启动新的应用程序项目。

生成要部署的应用程序

Package 函数依赖关系并组织项目代码和文件夹结构,为部署做准备。

在这里,我们使用sam build命令来准备应用程序以进行部署。CAmazon SAM LI 创建一个.aws-sam目录并在其中组织我们的应用程序依赖关系和文件以进行部署。


					用于准备sam build要部署的应用程序。

执行本地调试和测试

在本地计算机上,模拟事件、测试 API、调用函数等,以调试和测试应用程序。

在这里,我们使用sam local invoke命令HelloWorldFunction在本地调用。为此,Amazon SAMCLI 创建了一个本地容器,构建我们的函数,调用它并输出结果。


					使用 CAmazon SAM LIsam local invoke 命令在本地调用函数。

部署您的应用程序

配置应用程序的部署设置并部署到Amazon云端以配置您的资源。

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


					使用 CAmazon SAM LIsam deploy 命令将应用程序部署到Amazon云端。

配置 CI/CD 部署管道

使用支持的 C I/CD 系统创建安全的持续集成和交付 (CI/CD) 管道。

在这里,我们使用sam pipeline init --bootstrap命令为我们的应用程序配置 CI/CD 部署管道。CAmazon SAM LI 指导我们了解我们的选项,并生成用于我们的 CI/CD 系统的Amazon资源和配置文件。


					使用Amazon SAM CLIsam pipeline init --bootstrap 命令使用我们的首选 CI/CD 系统配置 CI/CD 管道。

监控云中的应用程序并对其进行故障排除

查看有关已部署资源的重要信息,收集日志,并使用内置监控工具,例如Amazon X-Ray。

在这里,我们使用sam list命令来查看我们部署的资源。我们获取我们的 API 端点并调用它,这会触发我们的函数。然后,我们sam logs用来查看函数的日志。


					使用Amazon SAM CLIsam list 命令获取我们的 API 终端节点。然后,sam logs用于查看我们函数的日志。

在开发时将本地更改同步到云端

在本地计算机上开发时,自动将更改同步到云端。快速查看您的更改并在云端执行测试和验证。

在这里,我们使用sam sync --watch命令让Amazon SAM CLI 监视本地更改。我们会修改我们的HelloWorldFunction代码,Amazon SAMCLI 会自动检测更改并将我们的更新部署到云端。


					使用 CAmazon SAM LIsam sync 命令将本地更改同步到Amazon云端。

使用 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 CLIsam sync 命令自动将本地更改同步到云端,从而加快开发和云测试工作流程。有关更多信息,请参阅使用 sam sync

管理您的Terraform无服务器应用程序

使用Amazon SAM CLI 对您的 Lambda 函数和层进行本地调试和测试。有关更多信息,请参阅Amazon SAMCLI Terraform 支持

了解更多信息

要继续了解有关的更多信息Amazon SAM,请参阅以下资源:

后续步骤

如果这是您第一次使用Amazon SAM,请参阅Amazon SAM 入门