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 SAMT@@ ran sformational — 完成将模板转换为调配基础架构所需的代码的复杂工作。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服务的函数。

  • 使用亚马逊 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 init用于通过 Amazon SAM CLI 启动新的应用程序项目。

构建您的应用程序以供部署

打包函数依赖关系并整理项目代码和文件夹结构,为部署做好准备。

在这里,我们使用sam build命令来准备要部署的应用程序。C Amazon SAM LI 创建了一个.aws-sam目录并将我们的应用程序依赖关系和文件整理到那里进行部署。


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

进行本地调试和测试

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

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


					使用 C Amazon SAM LI sam local invoke 命令在本地调用函数。

部署您的应用程序

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

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


					使用 C Amazon SAM LI sam deploy 命令将应用程序部署到Amazon云端。

配置 CI/CD 部署管道

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

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


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

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

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

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


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

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

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

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


					使用 C Amazon SAM LI sam sync 命令将本地更改同步到Amazon云端。

在云端测试您的 Lambda 函数

调用事件并将其传递给云中的 Lambda 函数。

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


					使用 C Amazon SAM LI sam remote invoke 命令测试我们在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 CLI sam sync 命令自动将本地更改同步到云端,加快开发和云测试工作流程。有关更多信息,请参阅使用 sam sync

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

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

了解更多信息

要继续了解Amazon SAM,请参阅以下资源:

后续步骤

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