使用 .zip 封存檔部署 Go Lambda 函數 - AWS Lambda

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

使用 .zip 封存檔部署 Go Lambda 函數

你的 AWS Lambda 函數的代碼由腳本或編譯的程序及其依賴關係組成。使用部署套件將函數程式碼部署到 Lambda。Lambda 支援兩種類型的部署套件:容器映像和 .zip 封存檔。

本頁說明如何建立 .zip 檔案做為 Go 執行階段的部署套件,然後使用 .zip 檔案將函數程式碼部署至 AWS Lambda 使用 AWS Management Console、 AWS Command Line Interface (AWS CLI) 和 AWS Serverless Application Model (AWS SAM)。

請注意,Lambda 使用 POSIX 檔案許可,因此在建立 .zip 封存檔之前,您可能需要設定部署套件資料夾的許可

在 macOS 和 Linux 上建立 .zip 檔案

下列步驟會說明如何使用 go build 命令編譯可執行檔,以及如何為 Lambda 建立 .zip 檔案部署套件。在編譯程式碼之前,請確定您已從中安裝了 lambda 套件 GitHub。此模組會讓您實作執行期界面,管理 Lambda 與函數程式碼之間的互動。若要下載此程式庫,請執行下列命令。

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

如果您的函數使用 AWS SDK for Go,請下載一組標準的 SDK 模組,以及應用程式所需的任何 AWS 服務 API 用戶端。若要瞭解如何安裝適用 SDK for Go,請參閱 AWS SDK for Go V2 入門

使用提供的運行時系列

Go 的實作方式與其他受管執行期不同。由於 Go 原生編譯為可執行二進製文件,因此它不需要專用的語言運行時。使用僅限作業系統的執行階段 (provided執行階段系列) 將 Go 函數部署至 Lambda。

建立 .zip 部署套件 (macOS/Linux) 的方式
  1. 在含有應用程式 main.go 檔案的專案目錄中編譯可執行檔。注意下列事項:

    • 可執行檔必須命名為 bootstrap。如需詳細資訊,請參閱 命名

    • 設定您的目標 指令集架構。僅限作業系統的執行階段同時支援 arm64 和 x86_64。

    • 您可以使用選用 lambda.norpc 標籤,來排除 lambda 程式庫的遠端程序呼叫 (RPC) 元件。只有在使用已取代的 Go 1.x 執行階段時,才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。

    若是 arm64 架構:

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

    若是 x86_64 架構:

    GOOS=linux GOARCH=amd64 go build -tags lambda.norpc -o bootstrap main.go
  2. (可選) 您可能需要用 Linux 上的 CGO_ENABLED=0 設定編譯套件:

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

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

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

    zip myFunction.zip bootstrap
    注意

    bootstrap 檔案必須位於 .zip 檔案的根層級。

  4. 建立函數。注意下列事項:

    • 二進位檔必須命名為 bootstrap,但處理常式名稱可以是任何名稱。如需詳細資訊,請參閱 命名

    • 如果您使用的是 arm64,才需要選擇 --architectures 選項。預設值為 x86_64。

    • 針對 --role,請指定 執行角色 的 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 檔案

下列步驟顯示如何從下載 Windows build-lambda-zip工具 GitHub、編譯可執行檔,以及建立 .zip 部署套件。

注意

如果尚未這樣做,您必須安裝 git,然後將 git 可執行檔新增到 Windows %PATH% 環境變數。

在編譯代碼之前,請確保您已從中安裝了 lambda 庫 GitHub。若要下載此程式庫,請執行下列命令。

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

如果您的函數使用 AWS SDK for Go,請下載一組標準的 SDK 模組,以及應用程式所需的任何 AWS 服務 API 用戶端。若要瞭解如何安裝適用 SDK for Go,請參閱 AWS SDK for Go V2 入門

使用提供的運行時系列

Go 的實作方式與其他受管執行期不同。由於 Go 原生編譯為可執行二進製文件,因此它不需要專用的語言運行時。使用僅限作業系統的執行階段 (provided執行階段系列) 將 Go 函數部署至 Lambda。

建立 .zip 部署套件的方式 (Windows)
  1. 從下載build-lambda-zip工具 GitHub。

    go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
  2. 使用您的 GOPATH 工具來建立 .zip 檔案。如果您已預設安裝 Go,則該工具通常位於 %USERPROFILE%\Go\bin 中。否則,導覽至您安裝 Go 執行期之處,然後執行下列其中一個動作:

    cmd.exe

    在 cmd.exe 中執行下列其中一項 (視您的目標 指令集架構 而定)。僅限作業系統的執行階段同時支援 arm64 和 x86_64。

    您可以使用選用 lambda.norpc 標籤,來排除 lambda 程式庫的遠端程序呼叫 (RPC) 元件。只有在使用已取代的 Go 1.x 執行階段時,才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。

    範例 - 適用 x86_64 架構
    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
    範例 - 適用 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,根據您的目標指令集架構,執行下列其中一個動作。僅限作業系統的執行階段同時支援 arm64 和 x86_64。

    您可以使用選用 lambda.norpc 標籤,來排除 lambda 程式庫的遠端程序呼叫 (RPC) 元件。只有在使用已取代的 Go 1.x 執行階段時,才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。

    若是 x86_64 架構:

    $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
  3. 建立函數。注意下列事項:

    • 二進位檔必須命名為 bootstrap,但處理常式名稱可以是任何名稱。如需詳細資訊,請參閱 命名

    • 如果您使用的是 arm64,才需要選擇 --architectures 選項。預設值為 x86_64。

    • 針對 --role,請指定 執行角色 的 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 函數

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

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

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

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

chmod 755 <filepath>

若要在 Windows 中變更檔案許可,請參閱 Microsoft Windows 文件的 Set, View, Change, or Remove Permissions on an Object

透過主控台使用 .zip 檔案建立及更新函數

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

如果您的 .zip 檔案小於 50 MB,您可以透過直接從本機電腦上傳檔案來建立或更新函數。若 .zip 檔案大於 50 MB,您必須先將套件上傳至 Amazon S3 儲存貯體。如需有關如何使用將檔案上傳到 Amazon S3 儲存貯體的指示 AWS Management Console,請參閱開始使用 Amazon S3。若要使用上載檔案 AWS CLI,請參閱《使用指南》中的AWS CLI 〈移動物件

注意

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

若要建立新的函數 (主控台)
  1. 開啟 Lambda 主控台的函數頁面,然後選擇建立函數

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

  3. 基本資訊下,請執行下列動作:

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

    2. 對於 Runtime (執行時間),選擇 provided.al2023

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

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

若要從本機電腦上傳 .zip 封存檔 (主控台)
  1. 在 Lambda 主控台的函數頁面中選擇要上傳 .zip 檔案的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中選擇上傳來源

  4. 選擇 .zip 檔案

  5. 若要上傳 .zip 檔案,請執行下列操作:

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

    2. 選擇 Open (開啟)。

    3. 選擇儲存

若要從 Amazon S3 儲存貯體上傳 .zip 封存檔 (控制台)
  1. 在 Lambda 主控台的函數頁面中選擇要上傳新 .zip 檔案的函數。

  2. 選取程式碼索引標籤。

  3. 程式碼來源窗格中選擇上傳來源

  4. 選擇 Amazon S3 位置

  5. 貼上 .zip 檔案的 Amazon S3 連結 URL,然後選擇儲存

使用 .zip 檔案建立和更新函數 AWS CLI

您可以使用 AWS CLI 建立新函數,或使用 .zip 檔案更新現有函數。使用建立函數update-function-code命令來部署您的 .zip 套件。如果您的 .zip 檔案小於 50 MB,則可以從本機建置電腦的檔案位置上傳 .zip 套件。若檔案較大,則必須先從 Amazon S3 儲存貯體上傳 .zip 套件。如需有關如何使用將檔案上傳到 Amazon S3 儲存貯體的指示 AWS CLI,請參閱使用AWS CLI 者指南中的移動物件

注意

如果您使用從 Amazon S3 儲存貯體上傳 .zip 檔案 AWS CLI,則該儲存貯體必須與您的函數位於 AWS 區域 相同的位置。

若要使用 .zip 檔案與建立新函數 AWS CLI,您必須指定下列項目:

  • 函數名稱 (--function-name)

  • 函數的執行期 (--runtime)

  • 函數執行角色的 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=DOC-EXAMPLE-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 DOC-EXAMPLE-BUCKET --s3-key myFileName.zip --s3-object-version myObject Version

透過 Lambda API 使用 .zip 檔案建立及更新函數

若要使用 .zip 封存檔建立及更新函數,請使用下列 API 操作:

使用 .zip 文件創建和更新函數 AWS SAM

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中的入門使用。

您也可以使用現有的 .zip 檔案封存 AWS SAM 來建立 Lambda 函數。若要使用建立 Lambda 函數 AWS SAM,您可以將 .zip 檔案儲存在 Amazon S3 儲存貯體或建置機器的本機資料夾中。如需有關如何使用將檔案上傳到 Amazon S3 儲存貯體的指示 AWS CLI,請參閱使用AWS CLI 者指南中的移動物件

在 AWS SAM 範本中,AWS::Serverless::Function資源會指定您的 Lambda 函數。在本資源中設定下列屬性,以使用 .zip 封存檔建立函數:

  • PackageType:設定為 Zip

  • CodeUri-設定為函數程式碼的 Amazon S3 URI、本機資料夾的路徑或FunctionCode物件

  • Runtime:設定為所選執行期

使用時 AWS SAM,如果您的 .zip 檔案大於 50MB,則不需要先將其上傳到 Amazon S3 儲存貯體。 AWS SAM 可以從本地構建機器上的位置上傳 .zip 軟件包,最大允許大小為 250MB(解壓縮)。

若要進一步瞭解如何使用 .zip 檔案部署函數 AWS SAM,請參閱AWS SAM 開發人員指南AWS::Serverless::Function中的。

示例:使用 AWS SAM 提供的 .al2023 構建 Go 函數
  1. 建立具有下列屬性的 AWS SAM 範本:

    • BuildMethod:指定應用程式的編譯器。請使用 go1.x

    • Runtime:使用 provided.al2023

    • CodeUri:輸入代碼的路徑。

    • Architectures:為 arm64 架構使用 [arm64]。若是 x86_64 指令集架構,請使用 [amd64] 或移除 Architectures 屬性。

    範例 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]
  2. 使用 sam build 命令來編譯可執行檔。

    sam build
  3. 使用 sam deploy 命令將函數部署到 Lambda。

    sam deploy --guided

使用 .zip 文件創建和更新函數 AWS CloudFormation

您可以使 AWS CloudFormation 用 .zip 檔案封存來建立 Lambda 函數。若要使用 .zip 檔案建立 Lambda 函數,您必須先將檔案上傳至 Amazon S3 儲存貯體。如需有關如何使用將檔案上傳到 Amazon S3 儲存貯體的指示 AWS CLI,請參閱使用AWS CLI 者指南中的移動物件

在 AWS CloudFormation 範本中,AWS::Lambda::Function資源會指定您的 Lambda 函數。在本資源中設定下列屬性,以使用 .zip 封存檔建立函數:

  • PackageType:設定為 Zip

  • Code:在 S3Bucket 和 S3Key 欄位中輸入 Amazon S3 儲存貯體名稱和 .zip 檔案名稱。

  • Runtime:設定為所選執行期

AWS CloudFormation 產生的 .zip 檔案不能超過 4MB。若要進一步瞭解有關使用 .zip 檔案部署函數的更多資訊 AWS CloudFormation,請參閱使用AWS CloudFormation 者指南AWS::Lambda::Function中的。

為相依項建立 Go 層

注意

以 Go 等編譯語言函數使用層,可能不會具有與使用 Python 等轉譯語言一樣的好處。由於 Go 是編譯語言,因此您的函數仍須在 init 階段,將所有共用組件手動載入記憶體中,這可能會增加冷啟動時間。相反地,建議您在編譯時加入任何共用程式碼,利用任何內建的編譯器最佳化功能。

本節中的指示說明如何在層中包含相依項。

Lambda 會自動偵測 /opt/lib 目錄中的任何程式庫,以及 /opt/bin 目錄中的任何二進位檔案。若要確保 Lambda 正確找到您的層內容,請建立層,結構如下:

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

封裝層之後,請參閱在 Lambda 中建立和刪除層為函數新增層,完成層設定。