

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

# 如何 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)。