我发现很难理解SAM模板和Cloudformation模板之间的区别。我知道SAM模板可以用来定义像Lambda这样的无服务器应用程序,但是这与Cloudformation模板有什么不同呢?语法是否不同?我仍然可以在cloudformation模板中指定Lambda定义。所以,我的问题是,我为什么要关心SAM?仅仅知道云形成模板还不够吗?
发布于 2018-05-03 02:34:24
从CloudFormation的角度来看,SAM是一种转换。含义: SAM模板在语法上是等价的,但它们允许您更简洁地定义您的无服务器应用程序。SAM模板最终在幕后扩展为完整的CFN。如果您已经了解CFN,但又想编写更少的YAML代码,那么SAM可能对您有好处。这个想法是为了减少你的努力。
发布于 2020-04-14 10:14:18
正如@Luis Colon所说,SAM是一种转变。这意味着,在SAM模板的顶部有一条Transform语句,它让CloudFormation知道要在这个SAM模板上运行内部函数Transform,以将其转换为CloudFormation模板。因此,所有SAM模板最终都会转换为CF模板,但对于最终用户来说,在大多数情况下,只使用SAM模板会更容易。例如,对于一个由您创建的新应用程序接口触发的带有Lambdas的简单应用程序,SAM模板将允许您用比CloudFormation更少的行数来完成此操作。
为了扩展这一点,无服务器框架的行为类似。Serverless设计为跨平台工作(AWS、Azure等)。它的语法看起来非常类似于SAM,它也将模板转换成目标平台的(即。AWS)模板的完整版本(即CloudFormation模板)。
发布于 2021-06-28 05:38:57
SAM模板是Cloudformation的超集。任何Cloudformation模板都可以不加更改地通过SAM运行,并且它将工作。SAM支持Cloudformation模板中的所有类型,因此您可以将其视为"CloudFormation++“。
但是,SAM还为您提供了额外的“转换”,允许您简洁地定义某些概念,SAM将弄清楚您的意思,并填充缺失的部分,以创建一个完整的、扩展的、合法的Cloudformation模板。
示例:对于主要处理Lambda函数的SAM (和无服务器框架)用户,最有用的转换之一是Lambda函数的Events属性-- SAM将通过API Gateway中的API路径添加访问该函数所需的所有对象。
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: HelloWorldFunction
Handler: app.lambdaHandler
Runtime: nodejs12.x
Events: # <--- "Events" property is not a real Cloudformation Lambda property
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get上面显示的SAM模板片段被转换/扩展为几个API Gateway对象(一个RestApi、一个部署和一个stage)。这段代码中使用的AWS::Serverless::Function类型不是真正的CloudFormation型别--您在文档中找不到它。SAM将其扩展为一个Cloudformation模板,其中包含一个AWS::Lambda::Function对象和几个Cloudformation可以理解的不同AWS::ApiGateway::*对象。
为了让您了解这为您节省了多少手动编码,下面是上述SAM模板的扩展版本作为完整Cloudformation模板的样子:
Resources:
HelloWorldFunctionHelloWorldPermissionProd:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
Principal: apigateway.amazonaws.com
FunctionName:
Ref: HelloWorldFunction
SourceArn:
Fn::Sub:
- arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/hello
- __Stage__: "*"
__ApiId__:
Ref: ServerlessRestApi
HelloWorldFunctionRole:
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:
- Value: SAM
Key: lambda:createdBy
ServerlessRestApiProdStage:
Type: AWS::ApiGateway::Stage
Properties:
DeploymentId:
Ref: ServerlessRestApiDeployment_NNN
RestApiId:
Ref: ServerlessRestApi
StageName: Prod
ServerlessRestApiDeployment_NNN:
Type: AWS::ApiGateway::Deployment
Properties:
RestApiId:
Ref: ServerlessRestApi
Description: 'RestApi deployment id: ???'
StageName: Stage
ServerlessRestApi:
Type: AWS::ApiGateway::RestApi
Properties:
Body:
info:
version: '1.0'
title:
Ref: AWS::StackName
paths:
"/hello":
get:
x-amazon-apigateway-integration:
httpMethod: POST
type: aws_proxy
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HelloWorldFunction.Arn}/invocations
responses: {}
swagger: '2.0'
HelloWorldFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: aws-sam-cli-managed-default-samclisourcebucket-???
S3Key: temp/???
Tags:
- Value: SAM
Key: lambda:createdBy
Handler: app.lambdaHandler
Role:
Fn::GetAtt:
- HelloWorldFunctionRole
- Arn
Timeout: 3
Runtime: nodejs12.x以前,如果您要编写纯Cloudformation,则必须为您想要创建的每个API Gateway端点一遍又一遍地手工编写所有这些代码。现在,使用SAM模板,您可以将API定义为Lambda函数的"Event“属性,然后SAM (或Serverless Framework)将负责这项苦差事。
在过去,当我们不得不手工完成所有这些工作时,它完全是糟糕透顶。但现在,一切都变得光彩照人。
https://stackoverflow.com/questions/50140885
复制相似问题