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 模板规格为:

  • Bu ild On Amazon CloudFormation— 利用 Amazon SAM 模板对资源和属性配置的广泛支持,直接在模板中使用 Amazon CloudFormation 语法。如果您已经熟悉 Amazon CloudFormation,则无需学习新服务即可管理您的应用程序基础架构代码。

  • Amazon CloudFormation— 的扩展 Amazon SAM 提供了自己独特的语法,专门用于加快无服务器开发。可以在同一个模板中同时使用 Amazon CloudFormation 和 Amazon SAM 语法。

  • 是一种抽象的速记语法 - 借助 Amazon SAM 语法,您可以用更少的代码行快速定义基础设施,而且出错的可能性更低。它的语法经过特别精心设计,可消除定义无服务器应用程序基础设施的复杂性。

  • Tran Amazon SAM 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 服务的函数。

  • 使用 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 SAMCLI?

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

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

  • 构建应用程序以进行部署。

  • 执行本地调试和测试。

  • 部署您的应用程序。

  • 配置 CI/CD 部署管道。

  • 对云端应用程序进行监控和问题排查。

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

  • 还有更多!

与 Amazon SAM 和 Amazon CloudFormation 模板一起使用时最能利用。 Amazon SAMCLI它还可与 Terraform 等第三方产品配合使用。

初始化新项目

从入门模板中进行选择或选择自定义模板位置以开始新项目。

在这里,我们使用 sam init 命令来初始化新的应用程序项目。首先选择 Hello World 示例项目。 Amazon SAM CLI 会下载入门模板并创建项目文件夹目录结构。


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

构建应用程序以进行部署

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

在这里,我们使用 sam build 命令来准备应用程序以进行部署。 Amazon SAM CLI 会创建 .aws-sam 目录并在其中整理应用程序依赖项和文件,以进行部署。


					使用 sam build 准备应用程序以进行部署。

执行本地调试和测试。

在本地计算机上模拟事件,测试 API,调用函数以及进行其他操作,以调试和测试应用程序。

在这里,我们使用 sam local invoke 命令在本地调用 HelloWorldFunction。为此, Amazon SAM CLI 会创建本地容器,构建函数,调用函数,然后输出结果。


					使用 Amazon SAMCLIsam local invoke命令在本地调用函数。

部署您的应用程序

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

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


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

配置 CI/CD 部署管道

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

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


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

对云端应用程序进行监控和问题排查

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

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


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

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

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

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


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

测试云端受支持的资源

调用事件并将事件传递给云端受支持的资源。

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


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

管理 Terraform 无服务器应用程序

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

了解更多信息

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

后续步骤

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