本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用容器映像來部署 Go Lambda 函數
您可以透過兩種方式為 Go Lambda 函數建置容器映像:
-
Go 的實作方式與其他受管執行期不同。由於 Go 程式碼原生編譯至可執行的二進位檔,因此不需要專用語言執行時期。使用僅限作業系統的基礎映像來建置 Lambda 的 Go 映像。若要使映像檔與 Lambda 相容,您必須在映像中加入
aws-lambda-go/lambda套件。 -
您可以使用其他容器登錄檔中的替代基礎映像 (例如 Alpine Linux 或 Debian)。您也可以使用組織建立的自訂映像。若要使映像檔與 Lambda 相容,您必須在映像中加入
aws-lambda-go/lambda套件。
提示
若要縮短 Lambda 容器函數變成作用中狀態所需的時間,請參閱 Docker 文件中的使用多階段建置
本頁面會說明如何為 Lambda 建置、測試和部署容器映像。
AWS 部署 Go 函數的基本映像
Go 的實作方式與其他受管執行期不同。由於 Go 程式碼原生編譯至可執行的二進位檔,因此不需要專用語言執行時期。使用僅限作業系統的基礎映像,將 Go 函數部署至 Lambda。
| 名稱 | 識別符 | 作業系統 | 取代日期 | 封鎖函數建立 | 封鎖函數更新 |
|---|---|---|---|---|---|
|
僅限作業系統的執行期 |
|
Amazon Linux 2023 |
2029 年 6 月 30 日 |
2029 年 7 月 31 日 |
2029 年 8 月 31 日 |
|
僅限作業系統的執行期 |
|
Amazon Linux 2 |
2026 年 6 月 30 日 |
2026 年 7 月 31 日 |
2026 年 8 月 31 日 |
Amazon Elastic Container Registry 公有資源庫:gallery.ecr.aws/lambda/provided
Go 執行期介面用戶端
此 aws-lambda-go/lambda 套件包含執行期介面實作。如需在映像中使用 aws-lambda-go/lambda 的範例,請參閱 使用僅限 AWS 作業系統的基礎映像 或 使用非AWS 基礎映像。
使用僅限 AWS 作業系統的基礎映像
Go 的實作方式與其他受管執行期不同。由於 Go 程式碼原生編譯至可執行的二進位檔,因此不需要專用語言執行時期。使用僅限作業系統的基礎映像來建置 Go 函數的容器映像。
| 標籤 | 執行期 | 作業系統 | Dockerfile | 棄用 |
|---|---|---|---|---|
al2023 |
僅限作業系統的執行期 | Amazon Linux 2023 | GitHub 上僅限作業系統之執行期的 Dockerfile |
2029 年 6 月 30 日 |
al2 |
僅限作業系統的執行期 | Amazon Linux 2 | GitHub 上僅限作業系統之執行期的 Dockerfile |
2026 年 6 月 30 日 |
如需有關這類基礎映像的詳細資訊,請參閱 Amazon ECR 公有庫中 提供的內容
您必須將 aws-lambda-go/lambda
若要完成本節中的步驟,您必須執行下列各項:
-
Docker
(最低版本 25.0.0) -
Docker buildx 外掛程式
。 -
Go
使用 provided.al2023 基礎映像建置和部署 Go 函數
-
建立專案的目錄,然後切換至該目錄。
mkdir hello cd hello -
初始化新的 Go 模組。
go mod initexample.com/hello-world -
將 lambda 程式庫新增為新模組的相依項。
go get github.com/aws/aws-lambda-go/lambda -
建立名為
main.go的檔案,然後在文字編輯器中開啟。這是 Lambda 函數的程式碼。可以使用以下範本程式碼進行測試,也可以將其替換為您自己的程式碼。package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) } -
使用文字編輯器在專案目錄中建立 Dockerfile。
-
下列範例 Dockerfile 使用多階段建置
。這可讓您在每個步驟中使用不同的基礎映像。您可以使用一個映像 (例如 Go 基礎映像 檔) 來編譯程式碼並建置可執行二進位檔案。然後,可以在最終的 FROM陳述式中使用不同的映像 (例如provided.al2023) 來定義您部署到 Lambda 的映像。建置程序與最終部署映像是分開的,因此最終映像僅包含執行應用程式所需的檔案。 -
您可以使用選用
lambda.norpc標籤,來排除 lambda程式庫的遠端程序呼叫 (RPC) 元件。使用已棄用的 Go 1.x 執行時期時,才需要 RPC 元件。排除 RPC 會縮減部署套件的大小。 -
請注意,範例 Dockerfile 不包含 USER 指令
。當您將容器映像部署到 Lambda 時,Lambda 會自動定義一個具有最低權限許可的預設 Linux 使用者。這與標準 Docker 行為不同,後者會在未提供 USER指令時預設為root使用者。
範例 – 多階段建置 Dockerfile
注意
確保您在 Dockerfile 中指定的 Go 版本 (例如,
golang:1.20) 與用於建立應用程式的 Go 版本相同。FROMgolang:1.20as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build with optional lambda.norpc tag COPY main.go . RUN go build-tags lambda.norpc-o main main.go # Copy artifacts to a clean image FROMpublic.ecr.aws/lambda/provided:al2023COPY --from=build /helloworld/main ./main ENTRYPOINT [ "./main" ] -
-
使用 docker build
命令建立 Docker 映像檔。以下範例將映像命名為 docker-image並為其提供test標籤。若要讓映像與 Lambda 相容,您必須使用 --provenance=false選項。docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.注意
此命令會指定
--platform linux/amd64選項,確保無論建置機器的架構為何,您的容器都與 Lambda 執行環境相容。如果您打算使用 ARM64 指令集架構建立 Lambda 函數,務必將命令變更為改用--platform linux/arm64選項。
使用 執行期界面模擬器provided.al2023 基礎映像中。
若要在本機電腦上執行執行期界面模擬器
-
使用 docker run 命令啟動 Docker 影像。注意下列事項:
-
docker-image是映像名稱,而test是標籤。 -
./main是來自 Dockerfile 的ENTRYPOINT。
docker run -d -p 9000:8080 \ --entrypoint /usr/local/bin/aws-lambda-rie \docker-image:test ./main此命令將映像作為容器執行,並在
localhost:9000/2015-03-31/functions/function/invocations建立本機端點。 -
-
從新的終端機視窗,使用 curl 命令將事件張貼至下列端點:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'此命令會透過空白事件調用函數,並傳回一個回應。部分函數可能需要使用 JSON 承載。範例:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}' -
取得容器 ID。
docker ps -
使用 docker kill
命令停止容器。在此命令中,將 3766c4ab331c替換為上一步驟中的容器 ID。docker kill3766c4ab331c
若要將映像上傳至 Amazon ECR 並建立 Lambda 函數
-
使用 get-login-password
命令,向 Amazon ECR 登錄檔驗證 Docker CLI。 -
將
--region值設定為 AWS 區域 您要建立 Amazon ECR 儲存庫的 。 -
111122223333以您的 AWS 帳戶 ID 取代 。
aws ecr get-login-password --regionus-east-1| docker login --username AWS --password-stdin111122223333.dkr.ecr.us-east-1.amazonaws.com -
-
使用 create-repository
命令在 Amazon ECR 中建立儲存庫。 aws ecr create-repository --repository-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE注意
Amazon ECR 儲存庫必須與 Lambda 函數 AWS 區域 位於相同位置。
如果成功,您將會看到以下回應:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } } -
從上一步驟的輸出中複製
repositoryUri。 -
執行 docker tag
命令,將 Amazon ECR 儲存庫中的本機映像標記為最新版本。在此命令中: -
docker-image:test為 Docker 映像檔的名稱和標籤。這是您在 docker build命令中指定的映像名稱和標籤。 -
將
<ECRrepositoryUri>替換為複製的repositoryUri。確保在 URI 的末尾包含:latest。
docker tag docker-image:test<ECRrepositoryUri>:latest範例:
docker tagdocker-image:test111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
-
執行 docker push
命令,將本機映像部署至 Amazon ECR 儲存庫。確保在儲存庫 URI 的末尾包含 :latest。docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
建立函數的執行角色 (若您還沒有的話)。在下一個步驟中您需要角色的 Amazon Resource Name (ARN)。
-
建立 Lambda 函數。對於
ImageUri,從之前的設定中指定儲存庫 URI。確保在 URI 的末尾包含:latest。aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex注意
只要映像與 Lambda 函數位於相同的區域,您就可以使用不同 AWS 帳戶中的映像來建立函數。如需詳細資訊,請參閱 Amazon ECR 跨帳戶許可。
-
調用函數。
aws lambda invoke --function-namehello-worldresponse.json您應該看到如下回應:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
若要查看函數的輸出,請檢查
response.json檔案。
若要更新函數程式碼,您必須再次建置映像、將新映像上傳到 Amazon ECR 存放庫,然後使用 update-function-code
Lambda 會將映像標籤解析為特定映像摘要。這表示如果您將用來部署函數的映像標籤指向 Amazon ECR 中的新映像,Lambda 不會自動更新函數以使用新映像。
若要將新映像部署至相同的 Lambda 函數,必須使用 update-function-code--publish 選項會使用更新的容器映像來建立新的函數版本。
aws lambda update-function-code \ --function-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish
使用非AWS 基礎映像
您可以從非AWS 基礎映像建置 Go 的容器映像。下列步驟中的 Dockerfile 範例使用 Alpine 基礎映像
您必須將 aws-lambda-go/lambda
若要完成本節中的步驟,您必須執行下列各項:
-
Docker
(最低版本 25.0.0) -
Docker buildx 外掛程式
。 -
Go
使用 Alpine 基礎映像建置和部署 Go 函數
-
建立專案的目錄,然後切換至該目錄。
mkdir hello cd hello -
初始化新的 Go 模組。
go mod initexample.com/hello-world -
將 lambda 程式庫新增為新模組的相依項。
go get github.com/aws/aws-lambda-go/lambda -
建立名為
main.go的檔案,然後在文字編輯器中開啟。這是 Lambda 函數的程式碼。可以使用以下範本程式碼進行測試,也可以將其替換為您自己的程式碼。package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) } -
使用文字編輯器在專案目錄中建立 Dockerfile。下列 Dockerfile 範例使用 Alpine 基礎映像
。請注意,範例 Dockerfile 不包含 USER 指令 。當您將容器映像部署到 Lambda 時,Lambda 會自動定義一個具有最低權限許可的預設 Linux 使用者。這與標準 Docker 行為不同,後者會在未提供 USER指令時預設為root使用者。範例 Dockerfile
注意
確保您在 Dockerfile 中指定的 Go 版本 (例如,
golang:1.20) 與用於建立應用程式的 Go 版本相同。FROM golang:1.20.2-alpine3.16 as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build COPY main.go . RUN go build -o main main.go # Copy artifacts to a clean image FROM alpine:3.16 COPY --from=build /helloworld/main /main ENTRYPOINT [ "/main" ] -
使用 docker build
命令建立 Docker 映像檔。以下範例將映像命名為 docker-image並為其提供test標籤。若要讓映像與 Lambda 相容,您必須使用 --provenance=false選項。docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.注意
此命令會指定
--platform linux/amd64選項,確保無論建置機器的架構為何,您的容器都與 Lambda 執行環境相容。如果您打算使用 ARM64 指令集架構建立 Lambda 函數,務必將命令變更為改用--platform linux/arm64選項。
使用 執行期界面模擬器
若要在本機電腦上安裝並執行執行期介面模擬器
-
在您的專案目錄中執行以下命令,從 GitHub 下載執行期介面模擬器 (x86-64 架構),並安裝在本機電腦上。
-
使用 docker run 命令啟動 Docker 影像。注意下列事項:
-
docker-image是映像名稱,而test是標籤。 -
/main是來自 Dockerfile 的ENTRYPOINT。
此命令將映像作為容器執行,並在
localhost:9000/2015-03-31/functions/function/invocations建立本機端點。注意
如果您為 ARM64 指令集架構建立 Docker 映像檔,請務必將
--platform linux/選項改用選項。arm64--platform linux/amd64 -
-
將事件張貼至本機端點。
-
取得容器 ID。
docker ps -
使用 docker kill
命令停止容器。在此命令中,將 3766c4ab331c替換為上一步驟中的容器 ID。docker kill3766c4ab331c
若要將映像上傳至 Amazon ECR 並建立 Lambda 函數
-
使用 get-login-password
命令,向 Amazon ECR 登錄檔驗證 Docker CLI。 -
將
--region值設定為 AWS 區域 您要建立 Amazon ECR 儲存庫的 。 -
111122223333以您的 AWS 帳戶 ID 取代 。
aws ecr get-login-password --regionus-east-1| docker login --username AWS --password-stdin111122223333.dkr.ecr.us-east-1.amazonaws.com -
-
使用 create-repository
命令在 Amazon ECR 中建立儲存庫。 aws ecr create-repository --repository-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE注意
Amazon ECR 儲存庫必須與 Lambda 函數 AWS 區域 位於相同位置。
如果成功,您將會看到以下回應:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } } -
從上一步驟的輸出中複製
repositoryUri。 -
執行 docker tag
命令,將 Amazon ECR 儲存庫中的本機映像標記為最新版本。在此命令中: -
docker-image:test為 Docker 映像檔的名稱和標籤。這是您在 docker build命令中指定的映像名稱和標籤。 -
將
<ECRrepositoryUri>替換為複製的repositoryUri。確保在 URI 的末尾包含:latest。
docker tag docker-image:test<ECRrepositoryUri>:latest範例:
docker tagdocker-image:test111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
-
執行 docker push
命令,將本機映像部署至 Amazon ECR 儲存庫。確保在儲存庫 URI 的末尾包含 :latest。docker push111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest -
建立函數的執行角色 (若您還沒有的話)。在下一個步驟中您需要角色的 Amazon Resource Name (ARN)。
-
建立 Lambda 函數。對於
ImageUri,從之前的設定中指定儲存庫 URI。確保在 URI 的末尾包含:latest。aws lambda create-function \ --function-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex注意
只要映像與 Lambda 函數位於相同的區域,您就可以使用不同 AWS 帳戶中的映像來建立函數。如需詳細資訊,請參閱 Amazon ECR 跨帳戶許可。
-
調用函數。
aws lambda invoke --function-namehello-worldresponse.json您應該看到如下回應:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 } -
若要查看函數的輸出,請檢查
response.json檔案。
若要更新函數程式碼,您必須再次建置映像、將新映像上傳到 Amazon ECR 存放庫,然後使用 update-function-code
Lambda 會將映像標籤解析為特定映像摘要。這表示如果您將用來部署函數的映像標籤指向 Amazon ECR 中的新映像,Lambda 不會自動更新函數以使用新映像。
若要將新映像部署至相同的 Lambda 函數,必須使用 update-function-code--publish 選項會使用更新的容器映像來建立新的函數版本。
aws lambda update-function-code \ --function-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish