本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Serverless Application Model (AWS SAM) 是什么?
AWS Serverless Application Model (AWS SAM) 是一个工具包,可改善开发人员在上 AWS构建和运行无服务器应用程序的体验。 AWS SAM 提供多种好处:
- 使用更少的代码快速定义应用程序基础设施代码
-
编写 AWS SAM 模板来定义您的无服务器应用程序基础架构代码。将模板直接部署 AWS CloudFormation 到以配置资源。
- 在无服务器应用程序的整个开发生命周期中对其进行管理
-
使用 AWS SAM CLI 在开发生命周期的编写、构建、部署、测试和监控阶段管理无服务器应用程序。有关更多信息,请参阅 使用 AWS SAM CLI。
- 使用 AWS SAM 连接器在资源之间快速配置权限
-
在 AWS SAM 模板中使用 AWS SAM 连接器来定义 AWS 资源之间的权限。 AWS SAM 将您的代码转换为实现您的意图所需的 IAM 权限。有关更多信息,请参阅 使用 AWS SAM 连接器管理资源权限。
- 在开发时持续将本地更改同步到云端
-
使用该 AWS SAMCLIsam sync命令自动将本地更改同步到云端,从而加快开发和云测试工作流程。有关更多信息,请参阅 使用 sam sync。
- 管理 Terraform 无服务器应用程序
-
使用 AWS SAM CLI 对 Lambda 函数和层执行本地调试和测试。有关更多信息,请参阅 AWS SAM CLI Terraform 支持。
基本概念
AWS SAM 由三个主要部分组成:
-
AWS SAM 模板规范 — 一个开源框架,可用于在其上 AWS定义无服务器应用程序基础架构。该框架可通过 AWS SAM 模板进行访问。
-
AWS SAM t emplate — 用于访问 AWS SAM 模板规范的内容,即可用于定义无服务器应用程序基础 AWS架构的开源框架。 AWS SAM 模板是 AWS CloudFormation 模板的扩展,带有一些额外的组件,使它们更易于使用。
-
AWS SAM 命令行接口 (AWS SAMCLI)-一种命令行工具,您可以将其与 AWS SAM 模板和支持的第三方集成一起使用,以构建和运行您的无服务器应用程序。
无服务器新手?
我们建议您查看无服务器概念。
AWS SAM 模板规格是什么?
AWS SAM 模板规范是一个开源框架,可用于定义和管理您的无服务器应用程序基础架构代码。 AWS SAM 模板规格为:
-
Bu ild On AWS CloudFormation— 利用 AWS SAM 模板对资源和属性配置的广泛支持,直接在模板中使用该 AWS CloudFormation 语法。如果您已经熟悉 AWS CloudFormation,则无需学习新服务即可管理您的应用程序基础架构代码。
-
AWS CloudFormation— 的扩展 AWS SAM 提供了自己独特的语法,专门用于加快无服务器开发。可以在同一个模板中同时使用 AWS CloudFormation 和 AWS SAM 语法。
-
是一种抽象的速记语法 - 借助 AWS SAM 语法,您可以用更少的代码行快速定义基础设施,而且出错的可能性更低。它的语法经过特别精心设计,可消除定义无服务器应用程序基础设施的复杂性。
-
Tran AWS SAM sformational — 完成 AWS CloudFormation将模板转换为配置基础架构所需的代码的复杂工作。
AWS SAM 模板是什么?
AWS SAM 模板是您用来访问 AWS SAM 模板规范、可用于定义无服务器应用程序基础架构的开源框架 AWS,还有一些额外的组件可以让它们更易于使用。从这个意义上讲, AWS SAM 模板是 AWS CloudFormation 模板的扩展。
以下是基本无服务器应用程序的示例:此应用程序处理想要通过 HTTP 请求从数据库获取所有项目的请求。它由以下几个部分组成:
-
包含用于处理请求的逻辑的函数。
-
HTTP API,用作客户端(请求程序)和应用程序之间的通信。
-
用于存储项目的数据库。
-
应用程序安全运行所需的权限。
![简单无服务器应用程序的应用程序架构。](images/what-is-sam-06.png)
可以在以下 AWS 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 行代码中,定义了以下基础设施:
-
使用该 AWS Lambda 服务的函数。
-
使用 Amazon API Gateway 服务的 HTTP API。
-
使用 Amazon DynamoDB 服务的数据库。
-
这些服务相互交互所必需的 AWS Identity and Access Management (IAM) 权限。
要配置此基础设施,需要将模板部署到 AWS CloudFormation。在部署期间, AWS SAM 将 23 行代码转换为在中生成这些资源所需的 AWS CloudFormation 语法。 AWS转换后的 AWS 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" } ] } } } }
通过使用 AWS SAM,您可以定义 23 行基础架构代码。 AWS SAM 将您的代码转换为配置应用程序所需的 200 多行 AWS CloudFormation 代码。
那是什么 AWS SAMCLI?
AWS SAMCLI是一个命令行工具,您可以将其与 AWS SAM 模板和支持的第三方集成一起使用,以构建和运行您的无服务器应用程序。使用 AWS SAM CLI 来:
-
快速初始化新的应用程序项目。
-
构建应用程序以进行部署。
-
执行本地调试和测试。
-
部署您的应用程序。
-
配置 CI/CD 部署管道。
-
对云端应用程序进行监控和问题排查。
-
在开发时将本地更改同步到云端。
-
还有更多!
与 AWS SAM 和 AWS CloudFormation 模板一起使用时最能利用。 AWS SAMCLI它还可与 Terraform 等第三方产品配合使用。
初始化新项目
从入门模板中进行选择或选择自定义模板位置以开始新项目。
在这里,我们使用 sam init 命令来初始化新的应用程序项目。首先选择 Hello World 示例项目。 AWS SAM CLI 会下载入门模板并创建项目文件夹目录结构。
![使用 sam init 和 AWS SAM CLI 启动新的应用程序项目。](images/what-is-sam-01.gif)
构建应用程序以进行部署
打包函数依赖项并整理项目代码和文件夹结构,为部署做准备。
在这里,我们使用 sam build 命令来准备应用程序以进行部署。 AWS SAM CLI 会创建 .aws-sam
目录并在其中整理应用程序依赖项和文件,以进行部署。
![使用 sam build 准备应用程序以进行部署。](images/what-is-sam-02.gif)
执行本地调试和测试。
在本地计算机上模拟事件,测试 API,调用函数以及进行其他操作,以调试和测试应用程序。
在这里,我们使用 sam local invoke 命令在本地调用 HelloWorldFunction
。为此, AWS SAM CLI 会创建本地容器,构建函数,调用函数,然后输出结果。
![使用 AWS SAMCLIsam local invoke命令在本地调用函数。](images/what-is-sam-04.gif)
部署您的应用程序
配置应用程序的部署设置并部署到 AWS 云端以配置您的资源。
在这里,我们使用 sam deploy --guided 命令通过交互式流程部署应用程序。它 AWS SAMCLI指导我们配置应用程序的部署设置,将我们的模板转换为 AWS CloudFormation,然后部署 AWS CloudFormation 到以创建我们的资源。
![使用 AWS SAMCLIsam deploy命令将应用程序部署到 AWS 云端。](images/what-is-sam-03.gif)
配置 CI/CD 部署管道
使用受支持的 CI/CD 系统创建安全的持续集成和持续交付 (CI/CD) 管道。
在这里,我们使用 sam pipeline init --bootstrap 命令为应用程序配置 CI/CD 部署管道。它引 AWS SAMCLI导我们完成选项,并生成 AWS 资源和配置文件以用于我们的 CI/CD 系统。
![使用 AWS SAMCLIsam pipeline init --bootstrap命令使用我们首选的 CI/CD 系统配置 CI/CD 管道。](images/what-is-sam-07.gif)
对云端应用程序进行监控和问题排查
查看有关已部署资源的重要信息,收集日志,并使用 AWS X-Ray等内置监控工具。
在这里,我们使用 sam list 命令查看已部署的资源。我们获取 API 端点并调用它,这会触发函数。然后,使用 sam logs 查看函数的日志。
![使用 AWS SAMCLIsam list命令获取我们的 API 端点。然后,使用 sam logs 查看函数的日志。](images/what-is-sam-08.gif)
在开发时将本地更改同步到云端
在本地计算机上开发时,自动将更改同步到云端。快速查看您所做的更改,并在云端执行测试和验证。
在这里,我们使用 sam sync --watch 命令来让 AWS SAM CLI 监控本地更改。我们修改 HelloWorldFunction
代码,然后 AWS SAM CLI 自动检测更改并将更新部署到云端。
![使用 AWS SAMCLIsam sync命令将本地更改同步到 AWS 云端。](images/what-is-sam-05.gif)
测试云端受支持的资源
调用事件并将事件传递给云端受支持的资源。
在这里,我们使用 sam remote invoke 命令测试部署在云端的 Lambda 函数。我们调用 Lambda 函数并接收其日志和响应。将 Lambda 函数配置为流式传输响应后, AWS SAM CLI 会实时流式传回其响应。
![使用 AWS SAMCLIsam remote invoke命令测试我们在 AWS 云端部署的功能。](images/what-is-sam-09.gif)
了解更多信息
要继续了解 AWS SAM,请参阅以下资源:
-
完整 AWS SAM 研讨会
—旨在向您传授所 AWS SAM 提供的许多主要功能的研讨会. -
与 SAM 的会话
— 由我们的 AWS 无服务器开发者倡导者团队制作的关于使用的 AWS SAM视频系列。 -
Serverless Land — 汇集了无
AWS 服务器的最新信息、博客、视频、代码和学习资源的网站。
后续步骤
如果这是您第一次使用 AWS SAM,请参阅开始使用 AWS SAM。