Sch*_*eir 15 amazon-web-services aws-cloudformation aws-lambda serverless-framework
我发现很难理解SAM模板和Cloudformation模板之间的区别.我知道SAM模板可用于定义像Lambda这样的无服务器应用程序,但是它如何使它与Cloudformation模板不同?语法不同吗?我仍然可以在cloudformation模板中指定Lambda定义.所以,我的问题是我为什么要关心SAM?不知道只是云形成模板就足够了吗?
Pat*_*Chu 33
SAM 模板是 Cloudformation 的超集。任何 Cloudformation 模板都可以通过 SAM 运行,无需更改,并且可以正常工作。SAM 支持 Cloudformation 模板中可用的所有类型,因此您可以将 SAM 视为“CloudFormation++”。
然而,SAM 还为您提供了额外的“转换”,允许您简洁地定义某些概念,并且 SAM 将弄清楚您的意思并填写缺失的部分以创建完整的、扩展的、合法的 Cloudformation 模板。
示例:对于主要处理 Lambda 函数的 SAM(和无服务器框架)用户来说,最有用的转换之一是EventsLambda 函数上的属性 - SAM 将添加通过 API 路径访问该函数所需的所有对象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
Run Code Online (Sandbox Code Playgroud)
上面显示的 SAM 模板片段被转换/扩展为多个 API 网关对象(RestApi、部署和阶段)。此代码片段中使用的类型AWS::Serverless::Function不是真正的 Cloudformation 类型 - 您在文档中找不到它。SAM 将其扩展为 Cloudformation 模板,其中包含一个AWS::Lambda::Function对象和AWS::ApiGateway::*Cloudformation 理解的多个不同对象。
为了让您了解这可以节省多少手动编码工作,以下是上述 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
Run Code Online (Sandbox Code Playgroud)
以前,如果您编写纯 Cloudformation,则必须为要创建的每个 API 网关端点一遍又一遍地手动编写所有这些代码。现在,使用 SAM 模板,您可以将 API 定义为 Lambda 函数的“事件”属性,然后 SAM(或无服务器框架)负责处理这项苦差事。
在过去,当我们必须手动完成所有这些工作时,这非常糟糕。但现在,一切又恢复了辉煌。
Lui*_*lon 13
从CloudFormation的角度来看,SAM是一种转型.含义:SAM模板在语法上是等效的,但它们允许您更简洁地定义无服务器应用程序.SAM模板最终在幕后扩展为完整的CFN.如果您已经了解CFN,但想要编写更少的YAML代码,SAM可能对您有益.这个想法是减少你的努力.
小智 7
就像@Luis Colon 所说,SAM 是一种变换。这意味着,在 SAM 模板的顶部有一个 Transform 语句,它让 CloudFormation 知道在此 SAM 模板上运行内部函数 Transform 以将其转换为 CloudFormation 模板。因此,所有 SAM 模板最终都会转换为 CF 模板,但对于最终用户而言,在大多数情况下,仅使用 SAM 模板会更容易。例如,对于包含由您正在创建的新 API 触发的 Lambda 的简单应用程序,SAM 模板将使您能够以比 CloudFormation 更少的行数完成此操作。
为了扩展这一点,无服务器框架的行为类似。无服务器旨在跨平台(AWS、Azure 等)工作。它的语法看起来与 SAM 非常相似,它也将模板转换为目标平台(即 AWS)的更完整版本的模板(即 CloudFormation 模板)。
| 归档时间: |
|
| 查看次数: |
3563 次 |
| 最近记录: |