

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 什麼是 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 Gateway APIs、Amazon DynamoDB 資料表，以及其他程式碼最少的無伺服器資源。
+ **CloudFormation 增強功能：**您可以將 SAM 與現有的 CloudFormation 範本結合，將無伺服器元件新增至傳統基礎設施。SAM 資源可與相同範本中的標準 CloudFormation 資源搭配使用。
+ **本機開發和測試：**您可以使用 SAM CLI 在本機測試 Lambda 函數、模擬 API Gateway 端點，以及在部署至 之前在開發機器上偵錯無伺服器應用程式 AWS。
+ **無伺服器 CI/CD：**您可以使用 SAM 範本建置部署管道，自動產生預備和生產環境所需的 CloudFormation 基礎設施。
+ **從主控台建立的資源遷移：**您可以使用 SAM 範本，將 AWS 在 管理主控台中建立的 Lambda 函數和 API Gateway 資源轉換為基礎設施做為程式碼。

** AWS SAM 與其他 IaC 工具比較**
+ 使用 SAM 而非 CloudFormation 來簡化無伺服器資源定義，同時維持範本相容性。
+  AWS CDK 如果您偏好使用宣告式方法來描述基礎設施，而不是以程式設計方式描述基礎設施，請使用 SAM。
+  AWS CDK 使用 SAM CLI 的本機測試功能來增強 CDK 應用程式，以將 SAM 與 結合。

## 主要功能
<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 SAM CLI**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 SAM CLI 是您用來在 AWS SAM 專案上執行命令並最終將其轉換為無伺服器應用程式的工具。

若要表達定義無伺服器應用程式的資源、事件來源映射和其他屬性，您可以在 AWS SAM 範本和 AWS SAM 專案中的其他檔案中定義資源和開發應用程式。您可以使用 在 AWS SAM CLI 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 提供自己的唯一語法，特別著重於加速無伺服器開發。您可以在相同的範本中使用 AWS SAM CloudFormation 和 語法。
+ **抽象的速記語法** – 使用 AWS SAM 語法，您可以快速定義基礎設施、減少程式碼行，並降低錯誤的機率。其語法經過特別策劃，可消除定義無伺服器應用程式基礎設施的複雜性。
+ **轉換** – AWS SAM 執行將範本轉換為透過 佈建基礎設施所需的程式碼的複雜工作 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_tw/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。在部署期間， 會將 23 行程式碼 AWS SAM 轉換為產生這些資源所需的 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 SAM CLI？
<a name="what-is-sam-cli"></a>

 AWS SAM CLI 是命令列工具，您可以搭配 AWS SAM 範本和支援的第三方整合使用，以建置和執行無伺服器應用程式。使用 AWS SAM CLI來：
+ 快速初始化新的應用程式專案。
+ 建置您的應用程式以進行部署。
+ 執行本機偵錯和測試。
+ 部署您的應用程式。
+ 設定 CI/CD 部署管道。
+ 在雲端中監控您的應用程式並進行疑難排解。
+ 在您開發時同步本機變更至雲端。
+ 還有更多！

與 AWS SAM CLI AWS SAM 和 CloudFormation 範本搭配使用時，最適合使用 。它也適用於第三方產品，例如 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_tw/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_tw/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 SAM CLIsam local invoke命令在本機叫用 函數。\]](http://docs.aws.amazon.com/zh_tw/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 SAM CLI引導我們設定應用程式的部署設定、將範本轉換為 CloudFormation，以及將 範本部署至 CloudFormation 以建立資源。

![\[使用 AWS SAM CLI sam deploy命令將應用程式部署到 AWS 雲端。\]](http://docs.aws.amazon.com/zh_tw/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 部署管道。會引導我們完成選項，並產生要用於 CI/CD AWS SAM CLI系統 AWS 的資源和組態檔案。

![\[使用 AWS SAM CLIsam pipeline init --bootstrap命令，使用我們偏好的 CI/CD 系統來設定 CI/CD 管道。\]](http://docs.aws.amazon.com/zh_tw/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 SAM CLIsam list命令來取得我們的 API 端點。然後， sam logs 用於檢視函數的日誌。\]](http://docs.aws.amazon.com/zh_tw/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 SAM CLIsam sync命令將本機變更同步至 AWS 雲端。\]](http://docs.aws.amazon.com/zh_tw/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 SAM CLIsam remote invoke命令在 AWS 雲端中測試我們部署的 函數。\]](http://docs.aws.amazon.com/zh_tw/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 Serverless Developer Advocate 團隊在使用 時建立的影片系列 AWS SAM。
+ **[無伺服器土地](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 服務，例如 AWS Lambda 用於運算的 和用於資料庫管理的 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 雲端開發套件 (AWS CDK)**  
透過 [AWS CDK](https://aws.amazon.com/cdk/)，您可以使用熟悉的程式設計語言定義無伺服器基礎設施，例如 TypeScript、Python、Java、C\$1/。Net 或 Go。您可以使用迴圈和條件等程式設計建構來定義基礎設施，並 AWS CDK 產生用於部署的 CloudFormation 範本。您可以使用 在 AWS SAM CLI本機測試和偵錯使用 建立的應用程式 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 SAM CLI 進行測試 | 當您需要程式設計基礎設施定義或複雜的資源組態邏輯時 | 

**注意**  
雖然本指南著重於原生 IaC AWS工具，但 Terraform 是另一個常用的 IaC 解決方案，可用於定義無伺服器應用程式。支援本機測試 Terraform AWS SAM CLI中定義的 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)
+ 如需搭配不同 IaC 工具使用 Lambda 的資訊，請參閱[搭配基礎設施做為程式碼使用 Lambda (IaC)](https://docs.aws.amazon.com/lambda/latest/dg/foundation-iac.html)