

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS Serverless Application Model (AWS SAM) 是什么？
<a name="what-is-sam"></a>

AWS Serverless Application Model (AWS SAM) 是一个开源框架，用于使用基础设施即代码 (IaC) 构建无服务器应用程序。使用 AWS SAM速记语法，开发人员可以声明[CloudFormation](https://aws.amazon.com/cloudformation)资源和专门的无服务器资源，这些资源和在部署期间转换为基础架构的无服务器资源。使用时 AWS SAM，您将与以下人员互动：

1. AWS SAM CLI-一款命令行工具，可帮助您开发、本地测试和部署无服务器应用程序。

1. AWS SAM 模板-其扩展提供了用于定义无服务器资源的简化语法。 CloudFormation 

当您使用该**sam init**命令时，它会创建一个项目目录，我们将其称为 AWS SAM 项目，该目录通常包含您的 AWS SAM 模板、应用程序代码和其他配置文件。

## 何时使用 AWS SAM
<a name="when-to-use-sam"></a>

AWS SAM 是理想的 IaC 解决方案，适用于您希望借助的全部功能简化无服务器开发的场景。 CloudFormation例如，您可以在以下情况中使用 SAM：
+ **无服务器应用程序：您可以使用 SAM 使用最少**的代码快速定义 AWS Lambda 函数、Lambda 持久函数、Amazon API APIs Gateway、Amazon DynamoDB 表和其他无服务器资源。
+ **CloudFormation 增强：**您可以将 SAM 与现有 CloudFormation 模板相结合，向传统基础架构中添加无服务器组件。在同一个模板中，SAM CloudFormation 资源与标准资源一起使用。
+ **本地开发和测试：**您可以使用 SAM CLI 在本地测试 Lambda 函数、模拟 API 网关端点，并在部署到 AWS之前在开发计算机上调试无服务器应用程序。
+ **适用于无服务器的 CI/CD：**您可以使用 SAM 模板构建部署管道，这些模板会自动生成暂存和 CloudFormation 生产环境所需的基础架构。
+ **从控制台创建的资源迁移：**您可以使用 SAM 模板将 AWS Management Console 中创建的 Lambda 函数和 API 网关资源转换为“基础设施即代码”。

** AWS SAM 与其他 IaC 工具的比较**
+ 改用 SAM CloudFormation 来简化无服务器资源定义，同时保持模板兼容性。
+  AWS CDK 如果您更喜欢使用声明式方法而不是编程方式来描述您的基础架构，请改用 SAM。
+ 使用 SAM CLI 的本地测试功能将 SAM 与 AWS CDK ，增强您的 CDK 应用程序。

## 主要 功能
<a name="what-is-sam-feature"></a>

AWS SAM 提供多种好处，通过允许您执行以下操作来改善开发者体验：

**使用更少的代码快速定义应用程序基础设施代码**  
编写 AWS SAM 模板来定义您的无服务器应用程序基础架构代码。将模板直接部署 CloudFormation 到以配置资源。

**在无服务器应用程序的整个开发生命周期中对其进行管理**  
使用 AWS SAM CLI 在开发生命周期的编写、构建、部署、测试和监控阶段管理无服务器应用程序。有关更多信息，请参阅 [AWS SAM CLI](using-sam-cli.md)。

**使用 AWS SAM 连接器在资源之间快速配置权限**  
在 AWS SAM 模板中使用 AWS SAM 连接器来定义 AWS 资源之间的权限。 AWS SAM 将您的代码转换为实现您的意图所需的 IAM 权限。有关更多信息，请参阅 [使用 AWS SAM 连接器管理资源权限](managing-permissions-connectors.md)。

**在开发时持续将本地更改同步到云端**  
使用该 AWS SAMCLI**sam sync**命令自动将本地更改同步到云端，从而加快开发和云测试工作流程。有关更多信息，请参阅 [使用同步sam sync到的简介 AWS 云](using-sam-cli-sync.md)。

**管理 Terraform 无服务器应用程序**  
使用 AWS SAM CLI 对 Lambda 函数和层执行本地调试和测试。有关更多信息，请参阅 [AWS SAM CLI Terraform 支持](terraform-support.md)。

## 相关信息
<a name="w2aab5c15"></a>
+ 有关 AWS SAM 工作原理的信息，请参阅[如何 AWS SAM 运作](what-is-sam-overview.md)。
+ 要开始使用 AWS SAM，请参阅[入门 AWS SAM](serverless-getting-started.md)。
+ 有关如何使用创建无服务器应用程序 AWS SAM 的概述，请参阅[如何使用 AWS SAM](chapter-using-sam.md#chapter-using-sam.title)。

# 如何 AWS SAM 运作
<a name="what-is-sam-overview"></a>

使用 AWS SAM 创建您的无服务器应用程序时，您将与以下组件进行交互：

1. **[AWS SAM 模板](sam-specification.md)**— 定义您的 AWS 资源的重要文件。此模板包括**AWS SAM 模板规范**，即开源框架，带有简化的简短语法，用于定义无服务器应用程序的函数 APIs、事件、配置和权限。此文件位于 AWS SAM 项目中，该项目是运行**sam init**命令时创建的应用程序文件夹。

1. **[AWS SAM CLI](using-sam-cli.md)**— 一种命令行工具，您可以将其与 AWS SAM 项目和支持的第三方集成一起使用，以构建和运行您的无服务器应用程序。 AWS SAMCLI是您用来在 AWS SAM 项目上运行命令并最终将其转换为无服务器应用程序的工具。

要表达定义无服务器应用程序的资源、事件源映射和其他属性，您需要在 AWS SAM 模板和项目中的其他文件中定义资源并开发应用程序。 AWS SAM 您可以使用在 AWS SAMCLI AWS SAM 项目上运行命令，这就是初始化、构建、测试和部署无服务器应用程序的方式。

**无服务器技术的新手？**  
我们建议您查看[的无服务器概念 AWS Serverless Application Model](what-is-concepts.md)。

## AWS SAM 模板规格是什么？
<a name="what-is-sam-template-spec"></a>

 AWS SAM 模板规范是一个开源框架，可用于定义和管理您的无服务器应用程序基础架构代码。 AWS SAM 模板规格为：
+ **构建 AWS CloudFormation** — 您可以直接在 AWS SAM 模板中使用该 CloudFormation 语法，充分利用其对资源和属性配置的广泛支持。如果您已经熟悉 CloudFormation，则无需学习新服务即可管理您的应用程序基础架构代码。
+  CloudFormation— **的扩展** AWS SAM 提供了自己独特的语法，专门用于加快无服务器开发。可以在同一个模板中同时使用 CloudFormation 和 AWS SAM 语法。
+ **是一种抽象的速记语法** - 借助 AWS SAM 语法，您可以用更少的代码行快速定义基础设施，而且出错的可能性更低。它的语法经过特别精心设计，可消除定义无服务器应用程序基础设施的复杂性。
+ **Tran AWS SAM sformational** — 完成 CloudFormation将模板转换为配置基础架构所需的代码的复杂工作。

## AWS SAM 项目和 AWS SAM 模板是什么？
<a name="what-is-sam-template"></a>

该 AWS SAM 项目包括包含 AWS SAM 模板规范的 AWS SAM 模板。该规范是您用来定义无服务器应用程序基础架构的开源框架 AWS，还有一些额外的组件可以让它们更易于使用。从这个意义上讲， AWS SAM 模板是 CloudFormation 模板的扩展。

以下是基本无服务器应用程序的示例：此应用程序处理想要通过 HTTP 请求从数据库获取所有项目的请求。它由以下几个部分组成：

1. 包含用于处理请求的逻辑的函数。

1. HTTP API，用作客户端（请求程序）和应用程序之间的通信。

1. 用于存储项目的数据库。

1. 应用程序安全运行所需的权限。

![\[简单无服务器应用程序的应用程序架构。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-06.png)


可以在以下 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) 权限。

要配置此基础设施，需要将模板部署到 CloudFormation。在部署期间， AWS SAM 将 23 行代码转换为在中生成这些资源所需的 CloudFormation 语法。 AWS转换后的 CloudFormation 模板包含 200 多行代码！

### 转换后的 CloudFormation 模板
<a name="what-is-sam-template-example-cfn"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "getAllItemsFunction": {
      "Type": "AWS::Lambda::Function",
      "Metadata": {
        "SamResourceId": "getAllItemsFunction"
      },
      "Properties": {
        "Code": {
          "S3Bucket": "amzn-s3-demo-source-bucket-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 多行 CloudFormation 代码。

## 那是什么 AWS SAMCLI？
<a name="what-is-sam-cli"></a>

 AWS SAMCLI是一个命令行工具，您可以将其与 AWS SAM 模板和支持的第三方集成一起使用，以构建和运行您的无服务器应用程序。使用 AWS SAM CLI 来：
+ 快速初始化新的应用程序项目。
+ 构建应用程序以进行部署。
+ 执行本地调试和测试。
+ 部署您的应用程序。
+ 配置 CI/CD 部署管道。
+ 对云端应用程序进行监控和问题排查。
+ 在开发时将本地更改同步到云端。
+ 还有更多！

与 AWS SAM 和 CloudFormation 模板一起使用时最能利用。 AWS SAMCLI它还可与 Terraform 等第三方产品配合使用。

### 初始化新项目
<a name="what-is-sam-cli-init"></a>

从入门模板中进行选择或选择自定义模板位置以开始新项目。

在这里，我们使用 **sam init** 命令来初始化新的应用程序项目。首先选择 **Hello World 示例**项目。 AWS SAM CLI 会下载入门模板并创建项目文件夹目录结构。

![\[使用 sam init 和 AWS SAM CLI 启动新的应用程序项目。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-01.gif)


有关更多详细信息，请参阅[在中创建您的应用程序 AWS SAM](using-sam-cli-init.md)。

### 构建应用程序以进行部署
<a name="what-is-sam-cli-build"></a>

打包函数依赖项并整理项目代码和文件夹结构，为部署做准备。

在这里，我们使用 **sam build** 命令来准备应用程序以进行部署。 AWS SAM CLI 会创建 `.aws-sam` 目录并在其中整理应用程序依赖项和文件，以进行部署。

![\[使用 sam build 准备应用程序以进行部署。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-02.gif)


有关更多详细信息，请参阅[构建应用程序](serverless-building.md)。

### 执行本地调试和测试。
<a name="what-is-sam-cli-local"></a>

在本地计算机上，模拟事件、测试 APIs、调用函数等，以调试和测试您的应用程序。

在这里，我们使用 **sam local invoke** 命令在本地调用 `HelloWorldFunction`。为此， AWS SAM CLI 会创建本地容器，构建函数，调用函数，然后输出结果。您可以使用 Docker 之类的应用程序在计算机上运行容器。

![\[使用 AWS SAMCLIsam local invoke命令在本地调用函数。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-04.gif)


有关更多详细信息，请参阅 [测试您的应用程序](serverless-test-and-debug.md) 和 [调试应用程序](debug-application.md)。

### 部署您的应用程序
<a name="what-is-sam-cli-deploy"></a>

配置应用程序的部署设置并部署到 AWS 云端以配置您的资源。

在这里，我们使用 **sam deploy --guided** 命令通过交互式流程部署应用程序。它 AWS SAMCLI指导我们配置应用程序的部署设置，将我们的模板转换为 CloudFormation，然后部署 CloudFormation 到以创建我们的资源。

![\[使用 AWS SAMCLIsam deploy命令将应用程序部署到 AWS 云端。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-03.gif)


有关更多详细信息，请参阅[部署应用程序和资源](serverless-deploying.md)。

### 配置 CI/CD 部署管道
<a name="what-is-sam-cli-cicd"></a>

使用支持的 CI/CD 系统创建安全的*持续集成和交付 (CI/CD)* 管道。

在这里，我们使用 **sam pipeline init --bootstrap** 命令为应用程序配置 CI/CD 部署管道。它引 AWS SAMCLI导我们完成选项，并生成 AWS 资源和配置文件以用于我们的 CI/CD 系统。

![\[使用 AWS SAMCLIsam pipeline init --bootstrap命令使用我们的首选 CI/CD 系统配置 CI/CD 管道。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-07.gif)


有关更多详细信息，请参阅[使用 CI/CD 系统和管道进行部署](deploying-options.md#serverless-deploying-ci-cd)。

### 对云端应用程序进行监控和问题排查
<a name="what-is-sam-cli-monitor"></a>

查看有关已部署资源的重要信息，收集日志，并使用 AWS X-Ray等内置监控工具。

在这里，我们使用 **sam list** 命令查看已部署的资源。我们获取 API 端点并调用它，这会触发函数。然后，使用 **sam logs** 查看函数的日志。

![\[使用 AWS SAMCLIsam list命令获取我们的 API 端点。然后，使用 sam logs 查看函数的日志。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-08.gif)


有关更多详细信息，请参阅[监控应用程序](serverless-monitoring.md)。

### 在开发时将本地更改同步到云端
<a name="what-is-sam-cli-sync"></a>

在本地计算机上开发时，自动将更改同步到云端。快速查看您所做的更改，并在云端执行测试和验证。

在这里，我们使用 **sam sync --watch** 命令来让 AWS SAM CLI 监控本地更改。我们修改 `HelloWorldFunction` 代码，然后 AWS SAM CLI 自动检测更改并将更新部署到云端。

![\[使用 AWS SAMCLIsam sync命令将本地更改同步到 AWS 云端。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-05.gif)


### 测试云端受支持的资源
<a name="what-is-sam-cli-remote-invoke"></a>

调用事件并将事件传递给云端受支持的资源。

在这里，我们使用 **sam remote invoke** 命令测试部署在云端的 Lambda 函数。我们调用 Lambda 函数并接收其日志和响应。将 Lambda 函数配置为流式传输响应后， AWS SAM CLI 会实时流式传回其响应。

![\[使用 AWS SAMCLIsam remote invoke命令测试我们在 AWS 云端部署的功能。\]](http://docs.aws.amazon.com/zh_cn/serverless-application-model/latest/developerguide/images/what-is-sam-09.gif)


## 了解详情
<a name="what-is-sam-learn"></a>

要继续了解 AWS SAM，请参阅以下资源：
+ **[完整 AWS SAM 研讨会—该](https://s12d.com/sam-ws-en-intro)**研讨会旨在向您传授所 AWS SAM 提供的许多主要功能.
+ **[与 SAM 的会话](https://www.youtube.com/playlist?list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd)** — 由我们的 AWS 无服务器开发者倡导者团队制作的关于使用的 AWS SAM视频系列。
+ **[Serverless Land — 汇集了无](https://serverlessland.com/)** AWS 服务器的最新信息、博客、视频、代码和学习资源的网站。

## 后续步骤
<a name="what-is-sam-next"></a>

如果这是您第一次使用 AWS SAM，请参阅[入门 AWS SAM](serverless-getting-started.md)。

# 的无服务器概念 AWS Serverless Application Model
<a name="what-is-concepts"></a>

在使用 AWS Serverless Application Model (AWS SAM) 之前，请先了解基本的无服务器概念。

## 无服务器概念
<a name="what-is-concepts-terms"></a>

**事件驱动型架构**  <a name="what-is-concepts-terms-eda"></a>
无服务器应用程序由单独的服务组成，例如 AWS Lambda 用于计算的 AWS 服务和用于数据库管理的 Amazon DynamoDB，每个服务都扮演一个专门的角色。然后，这些服务通过事件驱动型架构相互松散地集成。要了解有关事件驱动型架构的更多信息，请参阅[什么是事件驱动型架构？](https://aws.amazon.com/event-driven-architecture/)。

**基础设施即代码（IaC）**  <a name="what-is-concepts-terms-iac"></a>
基础设施即代码（IaC）是一种以开发人员对待代码的方式对待基础设施的方法，将与应用程序代码开发相同的严密性应用于基础设施配置。您可以在模板文件中定义基础架构，将其部署到模板文件中 AWS，然后为您 AWS 创建资源。使用 IaC，您可以在代码中定义 AWS 要配置的内容。有关可用的 IaC 工具的比较 AWS，请参阅[基础设施即代码（IaC）](what-is-iac.md)。

**无服务器技术**  <a name="what-is-concepts-terms-serverless"></a>
借助 AWS 无服务器技术，您无需管理自己的服务器即可构建和运行应用程序。所有服务器管理都是通过完成的 AWS，它提供了许多好处，例如自动扩展和内置的高可用性，使您可以将自己的想法快速付诸实践。使用无服务器技术，您可以专注于产品的核心，而不必担心服务器的管理和操作。要了解有关无服务器的更多信息，请参阅以下内容：  
+ [无服务器开启 AWS](https://aws.amazon.com/serverless/)
+ [《无服务器开发人员指南》](https://docs.aws.amazon.com/serverless/latest/devguide/serverless-preface.html)：提供 AWS 云中无服务器开发的概念性概述。
*有关核心 AWS 无服务器服务的基本介绍，请参阅 Serverless [101：了解 Serverless Land 中的无服务器服务](https://serverlessland.com/learn/serverless-101)。*

**无服务器应用程序**  <a name="what-is-concepts-terms-serverless"></a>
使用时 AWS SAM，您可以在应用程序中管理相关资源，该应用程序由您的 AWS SAM 项目和模板组成。您的应用程序中的所有资源都是在您的 AWS SAM 模板中定义或引用的。在 AWS SAM 处理您的模板时，它会创建 CloudFormation 资源。在中 CloudFormation，资源在称为堆栈的单个单元中进行管理，堆栈中的所有资源均由堆栈的 CloudFormation 模板定义。

# 基础设施即代码（IaC）
<a name="what-is-iac"></a>

借助基础设施即代码 (IaC)，您可以自动部署和管理 AWS 资源，包括无服务器应用程序。IaC 让您可以使用代码来定义基础设施，从而更轻松地对您的部署进行版本控制、共享和复制。这种方法可以帮助您：
+ 加快您的开发周期
+ 简化的配置管理
+ 提升您部署的可靠性和一致性

## 适用于 AWS 无服务器应用程序的 IaC 工具
<a name="iac-tools-aws"></a>

AWS 提供了多种 IaC 工具，可帮助您构建、部署和管理云资源。本节说明了如何 AWS SAM 融入该生态系统以及如何与其他 AWS IaC 工具配合使用。

**AWS CloudFormation**  
使用 [CloudFormation](https://aws.amazon.com/cloudformation/)，您可以使用 YAML 或 JSON 模板对整个 AWS 基础设施进行建模和配置。 CloudFormation 自动处理资源的创建、更新和删除。部署 AWS SAM 应用程序时， CloudFormation 处理转换后的模板以创建和管理您的资源。

**AWS Serverless Application Model (AWS SAM)**  
AWS SAM 使用用于定义无服务器资源的简化语法，帮助您构建无服务器应用程序。您可以使用 AWS SAM 模板使用简洁的 YAML 语法来配置 Lambda 函数 APIs、数据库和事件源。 AWS SAM 在部署期间将这些 CloudFormation 模板转换为模板。  
虽然 AWS SAM 专门研究无服务器应用程序，但您可以在 AWS SAM 模板中使用任何 CloudFormation 资源类型。这使您能够根据需要灵活地加入非无服务器资源。

**AWS Cloud 开发套件 (AWS CDK)**  
使用 [AWS CDK](https://aws.amazon.com/cdk/)，您可以使用熟悉的编程语言（例如 Python TypeScript、Java、C\$1/Net 或 Go）来定义您的无服务器基础架构。您可以使用诸如循环和条件之类的编程结构来定义基础架构，并 AWS CDK 生成用于部署的 CloudFormation 模板。您可以使用在 AWS SAMCLI本地测试和调试使用创建的应用程序 AWS CDK。要了解更多信息，请参阅[在本地测试 CDK 应用程序](https://docs.aws.amazon.com/cdk/v2/guide/testing-locally.html)。

## 比较适用于无服务器应用程序的 IaC 工具
<a name="comparing-iac-tools"></a>

在为无服务器应用程序选择 IaC 工具时，需综合考量团队偏好、项目需求及现有工作流。下表比较了用于无服务器开发的 AWS IaC 工具的主要特征：


| **工具** | **主要用途** | **适用于** | **适用于 AWS SAM** | **何时选择** | 
| --- | --- | --- | --- | --- | 
| **CloudFormation** | 管理复杂 AWS 的基础架构 | 需要对 AWS 资源进行详细控制的应用程序 | AWS SAM 模板在部署期间转换为 CloudFormation 模板 | 用于对非无服务器资源进行精细控制 | 
| **AWS SAM** | 无服务器应用程序开发 | 使用 Lambda 构建无服务器应用程序的团队 | 原生功能 | 主要关注具有 Lambda 函数、API Gateway 和其他无服务器 APIs资源的无服务器架构时 | 
| **AWS CDK** | 使用编程语言定义基础设施 | 偏好类型化语言和代码优先方法的团队 | 生成 AWS SAM 模板并 AWS SAMCLI用于测试 | 当您需要程序化基础设施定义或复杂资源配置逻辑时 | 

**注意**  
虽然本指南侧重于 AWS原生 IaC 工具，但 Terraform 是另一种可用于定义无服务器应用程序的流行的 IaC 解决方案。 AWS SAM CLI 支持对 Terraform 中定义的 Lambda 函数进行本地测试。有关更多信息，请参阅 [AWS SAM CLI Terraform 支持](terraform-support.md)。

## 了解详情
<a name="iac-learn-more"></a>
+ 要了解有关 DevOps 操作的更多信息 AWS，请参阅[ DevOps 上的简介 AWS](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)
+ 有关将 Lambda 与不同的 IaC 工具结合使用的更多信息，请参阅[将 Lambda 与基础设施即代码（IaC）结合使用](https://docs.aws.amazon.com/lambda/latest/dg/foundation-iac.html)