

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

# 使用 的預設建置 AWS SAM
<a name="serverless-sam-cli-using-build"></a>

若要建置無伺服器應用程式，請使用 `sam build`命令。此命令也會收集應用程式相依性的建置成品，並將其置於適當的格式和位置，以供後續步驟使用，例如本機測試、封裝和部署。

您可以在資訊清單檔案中指定應用程式的相依性，例如 `requirements.txt`(Python) 或 `package.json`(Node.js)，或使用函數資源的 `Layers` 屬性。`Layers` 屬性包含 Lambda 函數所依賴的[AWS Lambda 層](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)資源清單。

應用程式建置成品的格式取決於每個函數的 `PackageType` 屬性。此屬性的選項為：
+ **`Zip`** – .zip 檔案封存，其中包含您的應用程式程式碼及其相依性。如果您將程式碼封裝為 .zip 檔案封存，則必須為函數指定 Lambda 執行時間。
+ **`Image`** – 容器映像，除了您的應用程式程式碼及其相依性之外，還包括基本作業系統、執行時間和擴充功能。

如需 Lambda 套件類型的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的 [Lambda 部署套件](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html)。

**Topics**
+ [

## 建置 .zip 檔案封存
](#build-zip-archive)
+ [

## 建置容器映像
](#build-container-image)
+ [

## 容器環境變數檔案
](#serverless-sam-cli-using-container-environment-file)
+ [

## 在來源資料夾中建置您的專案，以加快建置時間
](#serverless-sam-cli-using-build-in-source)
+ [

## 範例
](#building-applications-examples)
+ [

## 在 外部建置 函數 AWS SAM
](#building-applications-skip)

## 建置 .zip 檔案封存
<a name="build-zip-archive"></a>

若要將無伺服器應用程式建置為 .zip 檔案封存，`PackageType: Zip`請為無伺服器函數宣告 。

AWS SAM 會為您指定的[架構](sam-resource-function.md#sam-function-architectures)建置您的應用程式。如果您未指定 架構， `x86_64` 預設 AWS SAM 會使用 。

如果您的 Lambda 函數取決於具有原生編譯程式的套件，請使用 `--use-container`旗標。此旗標會在本機編譯容器中的函數，其行為類似於 Lambda 環境，因此當您將函數部署到 AWS 雲端時，其格式正確。

當您使用 `--use-container`選項時，預設會從 [Amazon ECR Public](https://docs.aws.amazon.com/AmazonECR/latest/public/what-is-ecr.html) AWS SAM 提取容器映像。如果您想要從另一個儲存庫或特定版本的 CLI AWS SAM 提取容器映像，您可以使用 `--build-image`選項並提供替代容器映像的 URI。以下是使用來自特定 CLI AWS SAM 版本之容器映像建置應用程式的兩個範例命令：

```
# Build a Node.js 20 application using a container image for a specific version of AWS SAM CLI (1.136.0)
sam build --use-container --build-image public.ecr.aws/sam/build-nodejs22.x:1.136.0

# Build a function resource using the Python 3.13 container image from a specific version of AWS SAM CLI (1.136.0)(
sam build --use-container --build-image Function1=public.ecr.aws/sam/build-python3.13:1.136.0
```

如需建置 .zip 檔案封存應用程式的其他範例，請參閱本主題稍後的範例一節。

## 建置容器映像
<a name="build-container-image"></a>

若要將無伺服器應用程式建置為容器映像，`PackageType: Image`請為無伺服器函數宣告 。您還必須使用下列項目宣告`Metadata`資源屬性：

`Dockerfile`  
與 Lambda 函數相關聯的 Dockerfile 名稱。

`DockerContext`  
Dockerfile 的位置。

`DockerTag`  
（選用） 要套用至建置映像的標籤。

`DockerBuildArgs`  
建置組建的引數。  
 AWS SAM CLI 不會修訂或混淆您在`DockerBuildArgs`引數中包含的任何資訊。我們強烈建議您不要使用此區段來儲存機密資訊，例如密碼或秘密。

以下是範例`Metadata`資源屬性區段：

```
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: v1
```

若要下載使用 `Image`套件類型設定的範例應用程式，請參閱 [教學課程：使用 部署 Hello World 應用程式 AWS SAM](serverless-getting-started-hello-world.md)。在詢問您要安裝的套件類型的提示中，選擇 `Image`。

**注意**  
如果您在 Dockerfile 中指定多架構基礎映像， 會為主機機器的架構 AWS SAM 建置容器映像。若要為不同的架構建置 ，請指定使用特定目標架構的基礎映像。

## 容器環境變數檔案
<a name="serverless-sam-cli-using-container-environment-file"></a>

若要提供包含建置容器環境變數的 JSON 檔案，請使用 `--container-env-var-file`引數搭配 `sam build`命令。您可以提供套用至所有無伺服器資源的單一環境變數，或每個資源的不同環境變數。

### 格式
<a name="serverless-sam-cli-using-container-environment-file-format"></a>

將環境變數傳遞至建置容器的格式取決於您為 資源提供的環境變數數量。

若要為所有資源提供單一環境變數，請指定如下所示的`Parameters`物件：

```
{
  "Parameters": {
    "GITHUB_TOKEN": "TOKEN_GLOBAL"
  }
}
```

若要為每個資源提供不同的環境變數，請為每個資源指定物件，如下所示：

```
{
  "MyFunction1": {
    "GITHUB_TOKEN": "TOKEN1"
  },
  "MyFunction2": {
    "GITHUB_TOKEN": "TOKEN2"
  }
}
```

將您的環境變數儲存為 檔案，例如，名為 `env.json`。下列命令使用此檔案將環境變數傳遞至建置容器：

```
sam build --use-container --container-env-var-file env.json
```

### 優先順序
<a name="serverless-sam-cli-using-container-environment-file-precedence"></a>
+ 您提供給特定資源的環境變數優先於所有資源的單一環境變數。
+ 您在命令列提供的環境變數優先於檔案中的環境變數。

## 在來源資料夾中建置您的專案，以加快建置時間
<a name="serverless-sam-cli-using-build-in-source"></a>

對於支援的執行時間和建置方法，您可以使用 `--build-in-source`選項直接在來源資料夾中建置專案。根據預設， 會在暫存目錄中 AWS SAM CLI建置，這涉及透過原始程式碼和專案檔案進行複製。使用 `--build-in-source`時， AWS SAM 會直接在您的來源資料夾中CLI建置，而不需要將檔案複製到暫時目錄，即可加速建置程序。

如需支援的執行時間和建置方法清單，請參閱 `--build-in-source`。

## 範例
<a name="building-applications-examples"></a>

### 範例 1：.zip 檔案封存
<a name="examples-zip-archives"></a>

下列`sam build`命令會建置 .zip 檔案封存：

```
# Build all functions and layers, and their dependencies
sam build

# Run the build process inside a Docker container that functions like a Lambda environment
sam build --use-container

# Build a Node.js 20 application using a container image for a specific version of AWS SAM CLI (1.136.0)
sam build --use-container --build-image public.ecr.aws/sam/build-nodejs22.x:1.136.0

# Build a function resource using the Python 3.13 container image from a specific version of AWS SAM CLI (1.136.0)(
sam build --use-container --build-image Function1=public.ecr.aws/sam/build-python3.13:1.136.0

# Build and run your functions locally
sam build && sam local invoke

# For more options
sam build --help
```

### 範例 2：容器映像
<a name="examples-container-image-1"></a>

下列 AWS SAM 範本建置為容器映像：

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      ImageConfig:
        Command: ["app.lambda_handler"]
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: v1
```

以下是 Dockerfile 範例：

```
FROM public.ecr.aws/lambda/python:3.12

COPY app.py requirements.txt ./

RUN python3.12 -m pip install -r requirements.txt

# Overwrite the command by providing a different command directly in the template.
CMD ["app.lambda_handler"]
```

### 範例 3：npm ci
<a name="examples-npm-ci"></a>

對於 Node.js 應用程式，您可以使用 `npm ci`而不是 `npm install` 安裝相依性。若要使用 `npm ci`，請在 Lambda 函數`Metadata`的資源屬性`BuildProperties`中指定 `UseNpmCi: True` 下的 。若要使用 `npm ci`，您的應用程式必須在 Lambda 函數`CodeUri`的 中具有 `package-lock.json`或 `npm-shrinkwrap.json` 檔案。

當您執行 時`npm ci`，下列範例會使用 安裝相依性`sam build`：

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.handler
      Runtime: nodejs20.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      BuildProperties:
        UseNpmCi: True
```

### Python 父系套件
<a name="building-applications-python-parent-packages"></a>

對於 Python 應用程式，您可以在建置過程中保留套件結構，以啟用絕對匯入。若要保留套件結構，請在 Lambda 函數`Metadata`的資源屬性`BuildProperties`中指定 `ParentPackageMode` 下的 。

當您執行 時，下列範例會保留`app`套件結構`sam build`：

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.main.handler
      Runtime: python3.12
      Architectures:
        - x86_64
    Metadata:
      BuildProperties:
        ParentPackageMode: explicit
        ParentPackages: app
```

透過此組態，您的程式碼可以使用 等絕對匯入`from app.utils import logger`，而不是 等相對匯入`from .utils import logger`。

## 在 外部建置 函數 AWS SAM
<a name="building-applications-skip"></a>

根據預設，當您執行 時**sam build**， 會 AWS SAM 建置您的所有函數資源。其他選項包括：
+ **在 之外建置所有函數資源 AWS SAM** – 如果您手動或透過其他工具建置所有函數資源，**sam build**則不需要 。您可以略過**sam build**並繼續進行程序的下一個步驟，例如執行本機測試或部署應用程式。
+ 在 **外部建置一些函數資源 AWS SAM** – 如果您想要在外部建置其他函數資源的同時 AWS SAM 建置一些函數資源 AWS SAM，您可以在 AWS SAM 範本中指定此選項。

### 在 外部建置一些函數資源 AWS SAM
<a name="building-applications-skip-some"></a>

若要在使用 時 AWS SAM 略過函數**sam build**，請在 AWS SAM 範本中設定下列項目：

1. 將`SkipBuild: True`中繼資料屬性新增至函數。

1. 指定建置函數資源的路徑。

以下是範例，其中 `TestFunction`設定為略過。其建置的資源位於 `built-resources/TestFunction.zip`。

```
TestFunction:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: built-resources/TestFunction.zip
    Handler: TimeHandler::handleRequest
    Runtime: java11
  Metadata:
    SkipBuild: True
```

現在，當您執行 時**sam build**， AWS SAM 會執行下列動作：

1. AWS SAM 會略過使用 設定的函數`SkipBuild: True`。

1. AWS SAM 會建置所有其他函數資源，並將其快取在`.aws-sam`建置目錄中。

1. 對於略過的函數，其在`.aws-sam`建置目錄中的範本會自動更新，以參考所建置函數資源的指定路徑。

   以下是`TestFunction``.aws-sam`建置目錄中 的快取範本範例：

   ```
   TestFunction:
     Type: AWS::Serverless::Function
     Properties:
       CodeUri: ../../built-resources/TestFunction.zip
       Handler: TimeHandler::handleRequest
       Runtime: java11
     Metadata:
       SkipBuild: True
   ```