AWS SAM 的工作原理
AWS SAM 由用于创建无服务器应用程序的两个主要组件组成:
-
AWS SAM 项目 – 运行 sam init 命令时创建的文件夹和文件。此目录包含 AWS SAM 模板,这是定义您的 AWS 资源的重要文件。此模板包含 AWS SAM 模板规范 – 附带简化的简写语法的开源框架,您可以使用它来定义无服务器应用程序的函数、事件、API、配置和权限。
-
AWS SAMCLI – 一个命令行工具,可与 AWS SAM 项目和受支持的第三方集成结合使用,用于构建和运行无服务器应用程序。AWS SAM CLI 是用于在 AWS SAM 项目上运行命令并最终将其转换为无服务器应用程序的工具。
要表达定义无服务器应用程序的资源、事件源映射和其他属性,您需要在 AWS SAM 模板和 AWS SAM 项目中的其他文件中定义资源并开发应用程序。您可以使用 AWS SAM CLI 在 AWS SAM 项目上运行命令,这就是初始化、构建、测试和部署无服务器应用程序的方式。
无服务器技术的新手?
什么是 AWS SAM 模板规范?
AWS SAM 模板规范是一个开源框架,可用于定义和管理无服务器应用程序基础设施代码。AWS SAM 模板规范具有以下特点:
-
基于 AWS CloudFormation 构建 - 您可以直接在 AWS SAM 模板中使用 AWS CloudFormation 语法,利用其对资源和属性配置的广泛支持。如果您已经熟悉 AWS CloudFormation,则无需了解新服务即可管理应用程序基础设施代码。
-
是 AWS CloudFormation 的扩展 - AWS SAM 提供自己独有的语法,专门用于加快无服务器开发。可以在同一个模板中使用 AWS CloudFormation 和 AWS SAM 语法。
-
是一种抽象的速记语法 - 借助 AWS SAM 语法,您可以用更少的代码行快速定义基础设施,而且出错的可能性更低。它的语法经过特别精心设计,可消除定义无服务器应用程序基础设施的复杂性。
-
可转换 - AWS SAM 通过 AWS CloudFormation 来完成将模板转换为配置基础设施所需的代码这项复杂工作。
什么是 AWS SAM 项目和 AWS SAM 模板?
AWS SAM 项目包括 AWS SAM 模板,其中包含 AWS SAM 模板规范。此规范是用于在 AWS 上定义无服务器应用程序基础设施的开源框架,并且附带一些使其更易于使用的其他组件。从这个意义上讲,AWS SAM 模板是 AWS CloudFormation 模板的扩展。
以下是基本无服务器应用程序的示例:此应用程序处理想要通过 HTTP 请求从数据库获取所有项目的请求。它由以下几个部分组成:
-
包含用于处理请求的逻辑的函数。
-
HTTP API,用作客户端(请求程序)和应用程序之间的通信。
-
用于存储项目的数据库。
-
应用程序安全运行所需的权限。
可以在以下 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: nodejs20.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 中生成这些资源所需的 AWS CloudFormation 语法。转换后的 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 SAM CLI 是一个命令行工具,可与 AWS SAM 模板和受支持的第三方集成结合使用,用于构建和运行无服务器应用程序。使用 AWS SAM CLI 来:
-
快速初始化新的应用程序项目。
-
构建应用程序以进行部署。
-
执行本地调试和测试。
-
部署您的应用程序。
-
配置 CI/CD 部署管道。
-
对云端应用程序进行监控和问题排查。
-
在开发时将本地更改同步到云端。
-
还有更多!
AWS SAM CLI 与 AWS SAM 和 AWS CloudFormation 模板配合使用时效果最好。它还可与 Terraform 等第三方产品配合使用。
初始化新项目
从入门模板中进行选择或选择自定义模板位置以开始新项目。
在这里,我们使用 sam init 命令来初始化新的应用程序项目。首先选择 Hello World 示例项目。AWS SAM CLI 会下载入门模板并创建项目文件夹目录结构。
有关更多详细信息,请参阅在 AWS SAM 中创建应用程序。
构建应用程序以进行部署
打包函数依赖项并整理项目代码和文件夹结构,为部署做准备。
在这里,我们使用 sam build 命令来准备应用程序以进行部署。AWS SAM CLI 会创建 .aws-sam
目录并在其中整理应用程序依赖项和文件,以进行部署。
有关更多详细信息,请参阅构建应用程序。
执行本地调试和测试。
在本地计算机上模拟事件,测试 API,调用函数以及进行其他操作,以调试和测试应用程序。
在这里,我们使用 sam local invoke 命令在本地调用 HelloWorldFunction
。为此,AWS SAM CLI 会创建本地容器,构建函数,调用函数,然后输出结果。您可以使用 Docker 之类的应用程序在计算机上运行容器。
部署您的应用程序
配置应用程序的部署设置并将应用程序部署到 AWS Cloud,以配置资源。
在这里,我们使用 sam deploy --guided 命令通过交互式流程部署应用程序。AWS SAM CLI 会指导我们配置应用程序的部署设置,将模板转换为 AWS CloudFormation,并将应用程序部署到 AWS CloudFormation,以创建资源。
有关更多详细信息,请参阅部署应用程序和资源。
配置 CI/CD 部署管道
使用受支持的 CI/CD 系统创建安全的持续集成和持续交付 (CI/CD) 管道。
在这里,我们使用 sam pipeline init --bootstrap 命令为应用程序配置 CI/CD 部署管道。AWS SAM CLI 会指导我们选择各个选项,并生成要与 CI/CD 系统结合使用的 AWS 资源和配置文件。
有关更多详细信息,请参阅使用 CI/CD 系统和管线进行部署。
对云端应用程序进行监控和问题排查
查看有关已部署资源的重要信息,收集日志,并使用 AWS X-Ray 等内置监控工具。
在这里,我们使用 sam list 命令查看已部署的资源。我们获取 API 端点并调用它,这会触发函数。然后,使用 sam logs 查看函数的日志。
有关更多详细信息,请参阅监控应用程序。
在开发时将本地更改同步到云端
在本地计算机上开发时,自动将更改同步到云端。快速查看您所做的更改,并在云端执行测试和验证。
在这里,我们使用 sam sync --watch 命令来让 AWS SAM CLI 监控本地更改。我们修改 HelloWorldFunction
代码,然后 AWS SAM CLI 自动检测更改并将更新部署到云端。
测试云端受支持的资源
调用事件并将事件传递给云端受支持的资源。
在这里,我们使用 sam remote invoke 命令测试部署在云端的 Lambda 函数。我们调用 Lambda 函数并接收其日志和响应。将 Lambda 函数配置为流式传输响应后,AWS SAM CLI 会实时流式传回其响应。
了解更多
要进一步了解 AWS SAM 的更多信息,请参阅以下资源:
-
完整 AWS SAM 研讨会
- 旨在指导您使用 AWS SAM 提供的许多主要功能的研讨会。 -
使用 SAM 的会话
– 由 AWS 无服务器开发人员支持团队制作的关于使用 AWS SAM 的视频系列。 -
Serverless Land
- 汇集了关于 AWS 无服务器项目的最新信息、博客、视频、代码和学习资源的网站。
后续步骤
如果这是您首次使用 AWS SAM,请参阅开始使用 AWS SAM。