本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 SAM — 完成将模板转换为配置基础架构所需的代码的复杂工作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服务的函数。
-
使用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 下载入门模板并创建我们的项目文件夹目录结构。
生成要部署的应用程序
Package 函数依赖关系并组织项目代码和文件夹结构,为部署做准备。
在这里,我们使用sam build命令来准备应用程序以进行部署。CAmazon SAM LI 创建一个.aws-sam目录并在其中组织我们的应用程序依赖关系和文件以进行部署。
执行本地调试和测试
在本地计算机上,模拟事件、测试 API、调用函数等,以调试和测试应用程序。
在这里,我们使用sam local invoke命令HelloWorldFunction在本地调用。为此,Amazon SAMCLI 创建了一个本地容器,构建我们的函数,调用它并输出结果。
部署您的应用程序
配置应用程序的部署设置并部署到Amazon云端以配置您的资源。
在这里,我们使用sam deploy --guided命令通过交互式流程部署我们的应用程序。CAmazon SAM LI 指导我们配置应用程序的部署设置,将模板转换为Amazon CloudFormation,然后部署Amazon CloudFormation到创建资源。
配置 CI/CD 部署管道
使用支持的 C I/CD 系统创建安全的持续集成和交付 (CI/CD) 管道。
在这里,我们使用sam pipeline init --bootstrap命令为我们的应用程序配置 CI/CD 部署管道。CAmazon SAM LI 指导我们了解我们的选项,并生成用于我们的 CI/CD 系统的Amazon资源和配置文件。
监控云中的应用程序并对其进行故障排除
查看有关已部署资源的重要信息,收集日志,并使用内置监控工具,例如Amazon X-Ray。
在这里,我们使用sam list命令来查看我们部署的资源。我们获取我们的 API 端点并调用它,这会触发我们的函数。然后,我们sam logs用来查看函数的日志。
在开发时将本地更改同步到云端
在本地计算机上开发时,自动将更改同步到云端。快速查看您的更改并在云端执行测试和验证。
在这里,我们使用sam sync --watch命令让Amazon SAM CLI 监视本地更改。我们会修改我们的HelloWorldFunction代码,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 CLIsam 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 入门。