

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

# 使用 .zip 封存檔部署 Go Lambda 函數
<a name="golang-package"></a>

 AWS Lambda 函數的程式碼包含指令碼或編譯的程式及其相依性。使用*部署套件*將函數程式碼部署到 Lambda。Lambda 支援兩種類型的部署套件：容器映像和 .zip 封存檔。

此頁面說明如何建立 .zip 檔案做為 Go 執行時間的部署套件，然後使用 .zip 檔案， AWS Lambda 使用 AWS 管理主控台、 AWS Command Line Interface (AWS CLI) 和 AWS Serverless Application Model () 將函數程式碼部署到AWS SAM。

請注意，Lambda 使用 POSIX 檔案許可，因此在建立 .zip 封存檔之前，您可能需要[設定部署套件資料夾的許可](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-deployment-package-errors/)。

**Topics**
+ [在 macOS 和 Linux 上建立 .zip 檔案](#golang-package-mac-linux)
+ [在 Windows 上建立 .zip 檔案](#golang-package-windows)
+ [使用 .zip 檔案建立及更新 Go Lambda 函數](#golang-package-create-function)

## 在 macOS 和 Linux 上建立 .zip 檔案
<a name="golang-package-mac-linux"></a>

下列步驟會說明如何使用 `go build` 命令編譯可執行檔，以及如何為 Lambda 建立 .zip 檔案部署套件。在編譯程式碼之前，請確認已從 GitHub 安裝 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 套件。此模組會讓您實作執行期界面，管理 Lambda 與函數程式碼之間的互動。若要下載此程式庫，請執行下列命令。

```
go get github.com/aws/aws-lambda-go/lambda
```

如果您的函數使用 適用於 Go 的 AWS SDK，請下載標準 SDK 模組集，以及應用程式所需的任何 AWS 服務 API 用戶端。若要了解如何安裝適用於 Go 的 SDK，請參閱 [適用於 Go 的 AWS SDK V2 入門](https://github.com/aws/aws-sdk-go-v2?tab=readme-ov-file#getting-started)。

### 使用提供的執行時期系列
<a name="golang-package-mac-linux-al2"></a>

Go 的實作方式與其他受管執行期不同。由於 Go 程式碼原生編譯至可執行的二進位檔，因此不需要專用語言執行時期。應使用[僅限作業系統的執行時期](runtimes-provided.md) (`provided` 執行時期系列) 將 Go 函數部署至 Lambda。

**建立 .zip 部署套件 (macOS/Linux) 的方式**

1. 在含有應用程式 `main.go` 檔案的專案目錄中編譯可執行檔。注意下列事項：
   + 可執行檔必須命名為 `bootstrap`。如需詳細資訊，請參閱[處理常式命名慣例](golang-handler.md#golang-handler-naming)。
   + 設定您的目標 [指令集架構](foundation-arch.md)。僅限作業系統的執行時期同時支援 arm64 和 x86\$164。
   + 您可以使用選用 `lambda.norpc` 標籤，來排除 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 程式庫的遠端程序呼叫 (RPC) 元件。使用已棄用的 Go 1.x 執行時期時，才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。

   若是 arm64 架構：

   ```
   GOOS=linux GOARCH=arm64 go build -tags lambda.norpc -o bootstrap main.go
   ```

   若是 x86\$164 架構：

   ```
   GOOS=linux GOARCH=amd64 go build -tags lambda.norpc -o bootstrap main.go
   ```

1. (可選) 您可能需要用 Linux 上的 `CGO_ENABLED=0` 設定編譯套件：

   ```
   GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap -tags lambda.norpc main.go
   ```

   此命令為標準 C 程式庫 (`libc`) 版本建立了一個穩定的二進位套件，這在 Lambda 和其他設備上可能不同。

1. 透過將可執行檔封裝在 .zip 檔案中建立部署套件。

   ```
   zip myFunction.zip bootstrap
   ```
**注意**  
`bootstrap` 檔案必須位於 .zip 檔案的根層級。

1. 建立函數。注意下列事項：
   + 二進位檔必須命名為 `bootstrap`，但處理常式名稱可以是任何名稱。如需詳細資訊，請參閱[處理常式命名慣例](golang-handler.md#golang-handler-naming)。
   + 如果您使用的是 arm64，才需要選擇 `--architectures` 選項。預設值為 x86\$164。
   + 針對 `--role`，請指定 [執行角色](lambda-intro-execution-role.md) 的 Amazon Resource Name (ARN)。

   ```
   aws lambda create-function --function-name myFunction \
   --runtime provided.al2023 --handler bootstrap \
   --architectures arm64 \
   --role arn:aws:iam::111122223333:role/lambda-ex \
   --zip-file fileb://myFunction.zip
   ```

## 在 Windows 上建立 .zip 檔案
<a name="golang-package-windows"></a>

下列步驟會說明從 GitHub 下載適用於 Windows 的 [build-lambda-zip](https://github.com/aws/aws-lambda-go/tree/main/cmd/build-lambda-zip) 工具、編譯可執行檔，以及建立 .zip 部署套件的方式。

**注意**  
如果尚未這樣做，您必須安裝 [git](https://git-scm.com/)，然後將 `git` 可執行檔新增到 Windows `%PATH%` 環境變數。

在編譯程式碼之前，請確認已從 GitHub 安裝 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 程式庫。若要下載此程式庫，請執行下列命令。

```
go get github.com/aws/aws-lambda-go/lambda
```

如果您的函數使用 適用於 Go 的 AWS SDK，請下載標準 SDK 模組集，以及應用程式所需的任何 AWS 服務 API 用戶端。若要了解如何安裝適用於 Go 的 SDK，請參閱 [適用於 Go 的 AWS SDK V2 入門](https://aws.github.io/aws-sdk-go-v2/docs/getting-started/)。

### 使用提供的執行時期系列
<a name="golang-package-windows-al2"></a>

Go 的實作方式與其他受管執行期不同。由於 Go 程式碼原生編譯至可執行的二進位檔，因此不需要專用語言執行時期。應使用[僅限作業系統的執行時期](runtimes-provided.md) (`provided` 執行時期系列) 將 Go 函數部署至 Lambda。

**建立 .zip 部署套件的方式 (Windows)**

1. 從 GitHub 下載 **build-lambda-zip** 工具。

   ```
   go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
   ```

1. 使用您的 `GOPATH` 工具來建立 .zip 檔案。如果您已預設安裝 Go，則該工具通常位於 `%USERPROFILE%\Go\bin` 中。否則，導覽至您安裝 Go 執行期之處，然後執行下列其中一個動作：

------
#### [ cmd.exe ]

   在 cmd.exe 中執行下列其中一項 (視您的目標 [指令集架構](foundation-arch.md) 而定)。僅限作業系統的執行時期同時支援 arm64 和 x86\$164。

   您可以使用選用 `lambda.norpc` 標籤，來排除 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 程式庫的遠端程序呼叫 (RPC) 元件。使用已棄用的 Go 1.x 執行時期時，才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。

**Example - 適用 x86\$164 架構**  

   ```
   set GOOS=linux
   set GOARCH=amd64
   set CGO_ENABLED=0
   go build -tags lambda.norpc -o bootstrap main.go
   %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

**Example - 適用 arm64 架構**  

   ```
   set GOOS=linux
   set GOARCH=arm64
   set CGO_ENABLED=0
   go build -tags lambda.norpc -o bootstrap main.go
   %USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

------
#### [ PowerShell ]

   在 PowerShell 中執行下列其中一項 (視您的目標 [指令集架構](foundation-arch.md) 而定)。僅限作業系統的執行時期同時支援 arm64 和 x86\$164。

   您可以使用選用 `lambda.norpc` 標籤，來排除 [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda) 程式庫的遠端程序呼叫 (RPC) 元件。使用已棄用的 Go 1.x 執行時期時，才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。

   若是 x86\$164 架構：

   ```
   $env:GOOS = "linux"
   $env:GOARCH = "amd64"
   $env:CGO_ENABLED = "0"
   go build -tags lambda.norpc -o bootstrap main.go
   ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

   若是 arm64 架構：

   ```
   $env:GOOS = "linux"
   $env:GOARCH = "arm64"
   $env:CGO_ENABLED = "0"
   go build -tags lambda.norpc -o bootstrap main.go
   ~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
   ```

------

1. 建立函數。注意下列事項：
   + 二進位檔必須命名為 `bootstrap`，但處理常式名稱可以是任何名稱。如需詳細資訊，請參閱[處理常式命名慣例](golang-handler.md#golang-handler-naming)。
   + 如果您使用的是 arm64，才需要選擇 `--architectures` 選項。預設值為 x86\$164。
   + 針對 `--role`，請指定 [執行角色](lambda-intro-execution-role.md) 的 Amazon Resource Name (ARN)。

   ```
   aws lambda create-function --function-name myFunction \
   --runtime provided.al2023 --handler bootstrap \
   --architectures arm64 \
   --role arn:aws:iam::111122223333:role/lambda-ex \
   --zip-file fileb://myFunction.zip
   ```

## 使用 .zip 檔案建立及更新 Go Lambda 函數
<a name="golang-package-create-function"></a>

 建立 .zip 部署套件後，您可以使用該套件建立新的 Lambda 函數或更新現有函數。您可以使用 Lambda 主控台、 AWS Command Line Interface和 Lambda API 部署 .zip 套件。您也可以使用 AWS Serverless Application Model  (AWS SAM) 和  CloudFormation 建立並更新 Lambda 函數。

Lambda 的 .zip 部署套件大小上限為 250 MB (解壓縮)。請注意，此限制適用於您上傳的所有檔案 (包括任何 Lambda 層) 的大小總和。

Lambda 執行時間需有許可才能讀取部署套裝服務中的檔案。在 Linux 許可八進位標記法中，Lambda 需要 644 個許可 (rw-r--r--) 用於非可執行檔，以及 755 個許可 (rwxr-x) 用於目錄和可執行檔。

在 Linux 和 MacOS 中，使用 `chmod` 命令變更部署套件中檔案和目錄的檔案許可。例如，若要為非可執行檔提供正確的許可，請執行下列命令。

```
chmod 644 <filepath>
```

若要在 Windows 中變更檔案許可，請參閱 Microsoft Windows 文件的 [Set, View, Change, or Remove Permissions on an Object](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731667(v=ws.10))。

**注意**  
如果您未授予 Lambda 存取部署套件中的目錄所需的許可，Lambda 會將這些目錄的許可設定為 755 (rwxr-xr-x)。

### 透過主控台使用 .zip 檔案建立及更新函數
<a name="golang-package-create-console"></a>

 若要建立新函數，您必須先在主控台中建立函數，然後上傳您的 .zip 封存檔。若要更新現有函數，請開啟函數的頁面，然後按照同樣的程序新增更新後的 .zip 檔案。

 如果您的 .zip 檔案小於 50 MB，您可以透過直接從本機電腦上傳檔案來建立或更新函數。若 .zip 檔案大於 50 MB，您必須先將套件上傳至 Amazon S3 儲存貯體。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS 管理主控台，請參閱 [Amazon S3 入門](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)。若要使用 上傳檔案 AWS CLI，請參閱*AWS CLI 《 使用者指南*》中的[移動物件](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

**注意**  
您無法轉換現有的容器映像函數以使用 .zip 封存檔。您必須建立新的函數。

**若要建立新的函數 (主控台)**

1. 開啟 Lambda 主控台的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)，然後選擇**建立函數**。

1. 選擇 **Author from scratch** (從頭開始撰寫)。

1. 在**基本資訊**下，請執行下列動作：

   1. 在**函數名稱**中輸入函數名稱。

   1. 對於 **Runtime (執行時間)**，選擇 `provided.al2023`。

1. (選用) 在**許可**下，展開**變更預設執行角色**。您可建立新的**執行角色**，或使用現有的角色。

1. 選擇**建立函數**。Lambda 會使用您選擇的執行期建立一個基本的「Hello world」函數。

**若要從本機電腦上傳 .zip 封存檔 (主控台)**

1. 在 Lambda 主控台的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)中選擇要上傳 .zip 檔案的函數。

1. 選取**程式碼**索引標籤。

1. 在**程式碼來源**窗格中選擇**上傳來源**。

1. 選擇 **.zip 檔案**。

1. 若要上傳 .zip 檔案，請執行下列操作：

   1. 選擇**上傳**，然後在檔案選擇器中選取您的 .zip 檔案。

   1. 選擇 **Open** (開啟)。

   1. 選擇**儲存**。

**若要從 Amazon S3 儲存貯體上傳 .zip 封存檔 (控制台)**

1. 在 Lambda 主控台的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)中選擇要上傳新 .zip 檔案的函數。

1. 選取**程式碼**索引標籤。

1. 在**程式碼來源**窗格中選擇**上傳來源**。

1. 選擇 **Amazon S3 位置**。

1. 貼上 .zip 檔案的 Amazon S3 連結 URL，然後選擇**儲存**。

### 使用 建立和更新具有 .zip 檔案的函數 AWS CLI
<a name="golang-package-create-cli"></a>

 您可以使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 建立新函數，或使用 .zip 檔案更新現有函數。使用 [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) 和 [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) 命令來部署您的 .zip 套件。如果您的 .zip 檔案小於 50 MB，則可以從本機建置電腦的檔案位置上傳 .zip 套件。若檔案較大，則必須先從 Amazon S3 儲存貯體上傳 .zip 套件。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI，請參閱*AWS CLI 《 使用者指南*》中的[移動物件](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

**注意**  
如果您使用 從 Amazon S3 儲存貯體上傳 .zip 檔案 AWS CLI，儲存貯體必須與 AWS 區域 函數位於相同的 中。

 若要搭配 使用 .zip 檔案建立新的函數 AWS CLI，您必須指定下列項目：
+ 函數名稱 (`--function-name`)
+ 函數的執行期 (`--runtime`)
+ 函數[執行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)的 Amazon Resource Name (ARN) (`--role`)
+ 函數程式碼中處理常式方法的名稱 (`--handler`)

 您也必須指定 .zip 檔案的位置。如果您的 .zip 檔案位於本機建置電腦上的資料夾中，請使用 `--zip-file` 選項來指定檔案路徑，如下列範例命令所示。

```
aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 若要在 Amazon S3 儲存貯體中指定 .zip 檔案的位置，請使用如下列範例命令所示的 `--code` 選項。您只需針對版本控制的物件使用 `S3ObjectVersion` 參數。

```
aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 若要使用 CLI 更新現有函數，您可以使用 `--function-name` 參數指定函數的名稱。您也必須指定要用來更新函數程式碼的 .zip 檔案的位置。如果您的 .zip 檔案位於本機建置電腦上的資料夾中，請使用 `--zip-file` 選項來指定檔案路徑，如下列範例命令所示。

```
aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip
```

 若要在 Amazon S3 儲存貯體中指定 .zip 檔案的位置，請使用如下列範例命令所示的 `--s3-bucket` 和 `--s3-key` 選項。您只需針對版本控制的物件使用 `--s3-object-version` 參數。

```
aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
```

### 透過 Lambda API 使用 .zip 檔案建立及更新函數
<a name="golang-package-create-api"></a>

 若要使用 .zip 封存檔建立及更新函數，請使用下列 API 操作：
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)

### 使用 建立和更新具有 .zip 檔案的函數 AWS SAM
<a name="golang-package-create-sam"></a>

 AWS Serverless Application Model (AWS SAM) 是一種工具組，可協助簡化建置和執行無伺服器應用程式的程序 AWS。您可以在 YAML 或 JSON 範本中定義應用程式的資源，並使用 AWS SAM 命令列界面 (AWS SAM CLI) 來建置、封裝和部署應用程式。當您從 AWS SAM 範本建置 Lambda 函數時， AWS SAM 會自動使用函數程式碼和您指定的任何相依性建立 .zip 部署套件或容器映像。若要進一步了解如何使用 AWS SAM 來建置和部署 Lambda 函數，請參閱《 *AWS Serverless Application Model 開發人員指南*》中的 [入門 AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html)。

您也可以使用 AWS SAM 來建立使用現有 .zip 檔案封存的 Lambda 函數。若要使用 建立 Lambda 函數 AWS SAM，您可以將 .zip 檔案儲存在 Amazon S3 儲存貯體或建置機器的本機資料夾中。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI，請參閱*AWS CLI 《 使用者指南*》中的[移動物件](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。

 在您的 AWS SAM 範本中，`AWS::Serverless::Function`資源會指定您的 Lambda 函數。在本資源中設定下列屬性，以使用 .zip 封存檔建立函數：
+ `PackageType`：設定為 `Zip`
+ `CodeUri`：設定為函數程式碼的 Amazon S3 URI、本機資料夾的路徑或 [FunctionCode](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-functioncode.html) 物件
+ `Runtime`：設定為所選執行期

 如果您的 AWS SAM.zip 檔案大於 50MB，則不需要先將其上傳至 Amazon S3 儲存貯體。 AWS SAM 可以從本機建置機器的位置上傳最大允許大小為 250MB （解壓縮） 的 .zip 套件。

 若要進一步了解如何在 中使用 .zip 檔案部署函數 AWS SAM，請參閱《 *AWS SAM 開發人員指南*》中的 [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)。

**範例：使用 搭配 provided.al2023 AWS SAM 建置 Go 函數**

1. 建立具有下列屬性的 AWS SAM 範本：
   + **BuildMethod**：指定應用程式的編譯器。請使用 `go1.x`。
   + **Runtime**：使用 `provided.al2023`。
   + **CodeUri**：輸入程式碼的路徑。
   + **Architectures**：為 arm64 架構使用 `[arm64]`。若是 x86\$164 指令集架構，請使用 `[amd64]` 或移除 `Architectures` 屬性。  
**Example template.yaml**  

   ```
   AWSTemplateFormatVersion: '2010-09-09'
   Transform: 'AWS::Serverless-2016-10-31'
   Resources:
     HelloWorldFunction:
       Type: AWS::Serverless::Function
       Metadata:
         BuildMethod: go1.x
       Properties:
         CodeUri: hello-world/ # folder where your main program resides
         Handler: bootstrap
         Runtime: provided.al2023
         Architectures: [arm64]
   ```

1. 使用 [sam build](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html) 命令來編譯可執行檔。

   ```
   sam build
   ```

1. 使用 [sam deploy](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html) 命令將函數部署到 Lambda。

   ```
   sam deploy --guided
   ```

### 使用 建立和更新具有 .zip 檔案的函數 CloudFormation
<a name="golang-package-create-cfn"></a>

 您可以使用 CloudFormation 建立使用 .zip 檔案封存的 Lambda 函數。若要使用 .zip 檔案建立 Lambda 函數，您必須先將檔案上傳至 Amazon S3 儲存貯體。如需如何使用 將檔案上傳至 Amazon S3 儲存貯體的指示 AWS CLI，請參閱《 使用者指南》中的[移動物件](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)。 *AWS CLI *

在您的 CloudFormation 範本中，`AWS::Lambda::Function`資源會指定您的 Lambda 函數。在本資源中設定下列屬性，以使用 .zip 封存檔建立函數：
+ `PackageType`：設定為 `Zip`
+ `Code`：在 `S3Bucket` 和 `S3Key` 欄位中輸入 Amazon S3 儲存貯體名稱和 .zip 檔案名稱。
+ `Runtime`：設定為所選執行期

 CloudFormation 產生的 .zip 檔案不能超過 4MB。若要進一步了解如何在 中使用 .zip 檔案部署函數 CloudFormation，請參閱*CloudFormation 《 使用者指南*》中的 [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)。