在本機測試 Lambda 容器映像 - AWS Lambda

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

在本機測試 Lambda 容器映像

您可以使用 Lambda 執行期介面模擬器在本機測試容器映像函數,然後再將其上傳到 Amazon Elastic Container Registry (Amazon ECR),並將其部署到 Lambda。模擬器是 Lambda 執行階段 API 的代理。它是一種輕量型 Web 伺服器,可將 HTTP 請求轉換為 JSON 事件,以傳遞給容器映像中的 Lambda 函數。

AWS 基礎映像僅限作業系統的基礎映像包含執行期介面模擬器。如果您使用替代基礎映像 (例如 Alpine Linux 或 Debian 映像),便可 將模擬器建置到映像中 或 將其安裝在本機電腦上

AWS GitHub 存儲庫上提供了運行時界面仿真器。x86-64 和 arm64 架構具備不同的套件。

使用執行期介面模擬器的指導方針

使用執行期介面模擬器時,請注意下列指導方針:

  • RIE 不會模擬 Lambda 的安全和身分驗證組態,或 Lambda 的協同運作。

  • Lambda 為每個指令集架構提供了一個模擬器。

  • 模擬器不支援 AWS X-Ray 追蹤或其他 Lambda 整合。

環境變數

執行期介面模擬器支援本機執行映像中 Lambda 函數的環境變數子集。

如果您的函數使用安全登入資料,可以透過設定下列環境變數來設定登入資料:

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_DEFAULT_REGION

若要設定函數逾時,請設定 AWS_LAMBDA_FUNCTION_TIMEOUT。輸入您要允許函數執行的秒數上限。

模擬器不會填充以下 Lambda 環境變數。不過,您可以設定它們,以符合您預期在 Lambda 服務中執行函數時的值:

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

測試使用 AWS 基礎映像建置的映像

Lambda 的 AWS 基礎映像包含執行期介面模擬器。建置 Docker 映像檔後,請按照以下步驟在本機進行測試。

  1. 使用 docker run 命令啟動 Docker 影像。在此範例中,docker-image 為映像名稱,test 為標籤。

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    此命令將映像作為容器執行,並在 localhost:9000/2015-03-31/functions/function/invocations 建立本機端點。

    注意

    如果您為 ARM64 指令集架構建立 Docker 映像檔,請務必將--platform linux/arm64選項改用選項。--platform linux/amd64

  2. 從新的終端機視窗,將事件張貼至本機端點。

    Linux/macOS

    在 Linux 或 macOS 中,執行下列 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!"}'
    PowerShell

    在中 PowerShell,執行下列Invoke-WebRequest命令:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    此命令會透過空白事件調用函數,並傳回一個回應。如果您使用自己的函數程式碼而不是範例函數程式碼,則可能需要使用 JSON 承載調用該函數。範例:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. 取得容器 ID。

    docker ps
  4. 使用 docker kill 命令停止容器。在此命令中,將 3766c4ab331c 替換為上一步驟中的容器 ID。

    docker kill 3766c4ab331c

測試使用替代基礎映像建置的映像

如果您使用替代基礎映像 (例如 Alpine Linux 或 Debian 映像),便可 將模擬器建置到映像中 或 將其安裝在本機電腦上

將執行期介面模擬器建置到映像中

將模擬器建置到您的映像中
  1. 建立指令碼並將其儲存在您的專案目錄中。設定指令碼檔案的執行許可。

    指令碼檢查 AWS_LAMBDA_RUNTIME_API 環境變數的存在,即表示存在執行期 API。如果存在執行期 API,則指令碼會執行執行期界面用戶端。否則,指令碼會執行執行期界面模擬器。

    選擇您的語言以查看範例指令碼:

    Node.js

    在下列範例中,/usr/local/bin/npx aws-lambda-ric 是啟動 Node.js 執行期介面用戶端的 npx 命令。

    範例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/npx aws-lambda-ric $@ else exec /usr/local/bin/npx aws-lambda-ric $@ fi
    注意

    如果您使用的是 Windows,請務必以 LF 行結尾來儲存指令碼。如果指令碼使用 CRLF,當您嘗試執行 Docker 映像檔時,您將收到類似這樣的錯誤:

    exec /entry_script.sh: no such file or directory
    Python

    在下列範例中,/usr/local/bin/python -m awslambdaric 是將 Python 執行期介面用戶端作為指令碼運行的 Python 解譯器。

    範例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $@ else exec /usr/local/bin/python -m awslambdaric $@ fi
    注意

    如果您使用的是 Windows,請務必以 LF 行結尾來儲存指令碼。如果指令碼使用 CRLF,當您嘗試執行 Docker 映像檔時,您將收到類似這樣的錯誤:

    exec /entry_script.sh: no such file or directory
    Java

    在下列範例中,/usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda 將 classpath 設為 Java 執行期介面用戶端。

    範例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ else exec /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ fi
    注意

    如果您使用的是 Windows,請務必以 LF 行結尾來儲存指令碼。如果指令碼使用 CRLF,當您嘗試執行 Docker 映像檔時,您將收到類似這樣的錯誤:

    exec /entry_script.sh: no such file or directory
    Go

    在下列範例中,/main 是建置 Docker 時編譯的二進位檔。

    範例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /main $@ else exec /main $@ fi
    注意

    如果您使用的是 Windows,請務必以 LF 行結尾來儲存指令碼。如果指令碼使用 CRLF,當您嘗試執行 Docker 映像檔時,您將收到類似這樣的錯誤:

    exec /entry_script.sh: no such file or directory
    Ruby

    在下列範例中,aws_lambda_ric 是 Ruby 的執行期介面用戶端。

    範例 entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie aws_lambda_ric $@ else exec aws_lambda_ric $@ fi
    注意

    如果您使用的是 Windows,請務必以 LF 行結尾來儲存指令碼。如果指令碼使用 CRLF,當您嘗試執行 Docker 映像檔時,您將收到類似這樣的錯誤:

    exec /entry_script.sh: no such file or directory
  2. 將目標架構的運行時界面模擬器下載 GitHub 到項目目錄中。Lambda 為每個指令集架構提供了一個模擬器。

    Linux/macOS
    curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x aws-lambda-rie

    要安裝 arm64 模擬器,請使用以下命令替換上一個命令中的 GitHub 存儲庫 URL:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    Invoke-WebRequest -Uri https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie -OutFile aws-lambda-rie

    若要安裝 arm64 模擬器,請將 Uri 更換為下列項目:

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  3. 請將下列幾行新增至 Dockerfile。ENTRYPOINT 包含您在步驟 1 建立的指令碼和函數處理常式。

    範例 新增至 Dockerfile 的程式碼

    在下列範例中,以函數處理常式更換 lambda_function.handler

    COPY ./entry_script.sh /entry_script.sh RUN chmod +x /entry_script.sh ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh","lambda_function.handler" ]
  4. 使用 docker build 命令建立 Docker 映像檔。以下範例將映像命名為 docker-image 並為其提供 test 標籤

    docker build --platform linux/amd64 -t docker-image:test .
    注意

    此命令會指定 --platform linux/amd64 選項,確保無論建置機器的架構為何,您的容器都與 Lambda 執行環境相容。如果您打算使用 ARM64 指令集架構建立 Lambda 函數,務必將命令變更為改用 --platform linux/arm64 選項。

  5. 使用 docker run 命令啟動 Docker 影像。在此範例中,docker-image 為映像名稱,test 為標籤。

    docker run --platform linux/amd64 -p 9000:8080 docker-image:test

    此命令將映像作為容器執行,並在 localhost:9000/2015-03-31/functions/function/invocations 建立本機端點。

    注意

    如果您為 ARM64 指令集架構建立 Docker 映像檔,請務必將--platform linux/arm64選項改用選項。--platform linux/amd64

  6. 從新的終端機視窗,將事件張貼至本機端點。

    Linux/macOS

    在 Linux 或 macOS 中,執行下列 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!"}'
    PowerShell

    在中 PowerShell,執行下列Invoke-WebRequest命令:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    此命令會透過空白事件調用函數,並傳回一個回應。如果您使用自己的函數程式碼而不是範例函數程式碼,則可能需要使用 JSON 承載調用該函數。範例:

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  7. 取得容器 ID。

    docker ps
  8. 使用 docker kill 命令停止容器。在此命令中,將 3766c4ab331c 替換為上一步驟中的容器 ID。

    docker kill 3766c4ab331c

在本機安裝執行期界面模擬器

若要在本機電腦上安裝執行階段介面模擬器,請從中下載您偏好架構的套件 GitHub。接著,使用 docker run 命令啟動容器映像,並將 --entrypoint 設為模擬器。如需詳細資訊,請選擇您慣用語言的指示: