SAM模板和Cloudformation模板之间的区别

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可能对您有益.这个想法是减少你的努力.

  • 绝对地。在此处查看规范、操作指南和示例:https://github.com/awslabs/serverless-application-model/tree/master (4认同)
  • 如果您只需要这些资源(Lambda、APIGW、DDB),那么从 SAM 开始。如果您稍后需要其他资源(VPC、CloudWatch 等),那么“过渡”到可同时使用 SAM 和非 SAM 资源的更通用的 Cloudformation 模板并不困难。 (3认同)

小智 7

就像@Luis Colon 所说,SAM 是一种变换。这意味着,在 SAM 模板的顶部有一个 Transform 语句,它让 CloudFormation 知道在此 SAM 模板上运行内部函数 Transform 以将其转换为 CloudFormation 模板。因此,所有 SAM 模板最终都会转换为 CF 模板,但对于最终用户而言,在大多数情况下,仅使用 SAM 模板会更容易。例如,对于包含由您正在创建的新 API 触发的 Lambda 的简单应用程序,SAM 模板将使您能够以比 CloudFormation 更少的行数完成此操作。

为了扩展这一点,无服务器框架的行为类似。无服务器旨在跨平台(AWS、Azure 等)工作。它的语法看起来与 SAM 非常相似,它也将模板转换为目标平台(即 AWS)的更完整版本的模板(即 CloudFormation 模板)。