首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAM模板与Cloudformation模板的区别

问SAM模板与Cloudformation模板的区别
EN

Stack Overflow用户
提问于 2018-05-03 02:02:11
回答 3查看 13.5K关注 0票数 48

我发现很难理解SAM模板和Cloudformation模板之间的区别。我知道SAM模板可以用来定义像Lambda这样的无服务器应用程序,但是这与Cloudformation模板有什么不同呢?语法是否不同?我仍然可以在cloudformation模板中指定Lambda定义。所以,我的问题是,我为什么要关心SAM?仅仅知道云形成模板还不够吗?

EN

回答 3

Stack Overflow用户

发布于 2018-05-03 02:34:24

从CloudFormation的角度来看,SAM是一种转换。含义: SAM模板在语法上是等价的,但它们允许您更简洁地定义您的无服务器应用程序。SAM模板最终在幕后扩展为完整的CFN。如果您已经了解CFN,但又想编写更少的YAML代码,那么SAM可能对您有好处。这个想法是为了减少你的努力。

票数 39
EN

Stack Overflow用户

发布于 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模板)。

票数 9
EN

Stack Overflow用户

发布于 2021-06-28 05:38:57

SAM模板是Cloudformation的超集。任何Cloudformation模板都可以不加更改地通过SAM运行,并且它将工作。SAM支持Cloudformation模板中的所有类型,因此您可以将其视为"CloudFormation++“。

但是,SAM还为您提供了额外的“转换”,允许您简洁地定义某些概念,SAM将弄清楚您的意思,并填充缺失的部分,以创建一个完整的、扩展的、合法的Cloudformation模板。

示例:对于主要处理Lambda函数的SAM (和无服务器框架)用户,最有用的转换之一是Lambda函数的Events属性-- SAM将通过API Gateway中的API路径添加访问该函数所需的所有对象。

代码语言:javascript
复制
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模板的样子:

代码语言:javascript
复制
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)将负责这项苦差事。

在过去,当我们不得不手工完成所有这些工作时,它完全是糟糕透顶。但现在,一切都变得光彩照人。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50140885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档