搭配使用 Lambda 與 AWS CLI - AWS Lambda

搭配使用 Lambda 與 AWS CLI

您可以使用 AWS Command Line Interface 來管理函式和其他 AWS Lambda 資源。AWS CLI 使用 AWS SDK for Python (Boto) 與 Lambda API 互動。您可使用它來了解 API,並將該知識套用在搭配使用 Lambda 與 AWS 開發套件的建置應用程式中。

在此教學課程中,您會使用 AWS CLI 來管理並調用 Lambda 函數。如需詳細資訊,請參閱 AWS Command Line Interface 使用者指南中的什麼是 AWS CLI?

先決條件

此教學課程假設您具備基本的 Lambda 操作知識並了解 Lambda 主控台。如果您尚未執行,請依照使用主控台建立一個 Lambda 函數中的說明。

若要完成下列步驟,您需要 AWS Command Line Interface (AWS CLI) 版本 2。命令和預期的輸出會列在不同的區塊中:

aws --version

您應該會看到下列輸出:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

對於長命令,逸出字元 (\) 用於將命令分割為多行。

在 Linux 和 macOS 上,使用您偏好的 shell 和套件軟體管理工具。

注意

在 Windows 中,作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 zip)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本,請安裝適用於 Linux 的 Windows 子系統。本指南中的 CLI 命令範例使用 Linux 格式。如果您使用的是 Windows CLI,必須重新格式化包含內嵌 JSON 文件的命令。

建立執行角色

建立執行角色,授予您的函式存取 AWS 資源的許可。如要使用AWS CLI 建立執行角色,請使用 create-role 命令。

在下列範例中,您可以指定內嵌信任政策。JSON 字串中轉義引號的請求有所不同,這取決於您的 shell。

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

您也可使用 JSON 檔案來定義角色的信任政策。在下列範例中,trust-policy.json 為當前目錄中的檔案。此信任政策會授予服務主體 lambda.amazonaws.com 呼叫 AWS Security Token Service (AWS STS) AssumeRole 動作的許可,以便 Lambda 能使用角色的許可。

範例 trust-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json

您應該會看到下列輸出:

{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }

使用 attach-policy-to-role 命令將許可新增至角色。透過新增 AWSLambdaBasicExecutionRole 受管政策開始。

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

AWSLambdaBasicExecutionRole 政策具備函數將日誌寫入到 CloudWatch Logs 時所需的許可。

建立函數

下列範例會記錄環境變數和事件物件的值。

範例 index.js
exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.log("EVENT\n" + JSON.stringify(event, null, 2)) return context.logStreamName }
建立函數
  1. 將範本程式碼複製到名為 index.js 的檔案。

  2. 建立部署套件。

    zip function.zip index.js
  3. 使用 create-function 命令建立一個 Lambda 函數。使用您的帳戶 ID,取代角色 ARN 中的反白文字。

    aws lambda create-function --function-name my-function \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::123456789012:role/lambda-ex

    您應該會看到下列輸出:

    { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }

若要從命令列取得某次調用的日誌,請使用 --log-type 選項。其回應將包括 LogResult 欄位,內含該次調用的 base64 編碼日誌 (最大達 4 KB)。

aws lambda invoke --function-name my-function out --log-type Tail

您應該會看到下列輸出:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }

您可以使用 base64 公用程式將日誌解碼。

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d

您應該會看到下列輸出:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

base64 公用程式適用於 Linux、macOS 以及 Ubuntu on Windows。macOS 請使用 base64 -D 命令。

如需從命令列取得完整日誌事件,您可以在您函式的輸出中納入日誌串流名稱,如上述範例中所示。以下範例指令碼會呼叫名為 my-function 的函式,並下載最後 5 個日誌事件。

範例 get-logs.sh 指令碼

此範例需要 my-function 傳回日誌串流 ID。

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5

該指令碼使用 sed 以從輸出檔案移除引述,並休眠 15 秒以使日誌可供使用。輸出包括來自 Lambda 的回應以及來自 get-log-events 命令的輸出。

./get-logs.sh

您應該會看到下列輸出:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

更新函數

建立函數之後,您可以設定函數的其他功能,例如觸發程序、網路存取和檔案系統存取。您也可以調整與函數相關聯的資源,例如記憶體和並行處理。這些組態適用於定義為 .zip 封存檔的函數,以及定義為容器映像的函數。

使用 update-function-configuration 命令設定函數。以下範例將函數記憶體設定為 256 MB。

範例 update-function-configuration 命令
aws lambda update-function-configuration \ --function-name my-function \ --memory-size 256

列出您帳戶中的 Lambda 函數

執行下列 AWS CLI list-functions 命令,來擷取您已建立的函數清單。

aws lambda list-functions --max-items 10

您應該會看到下列輸出:

{ "Functions": [ { "FunctionName": "cli", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", ... }, { "FunctionName": "random-error", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:random-error", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "index.handler", ... }, ... ], "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=" }

在回應中,Lambda 傳回一份多達 10 個函數的清單。如果有更多的函式可以取回,NextToken 會提供可在下一個 list-functions 請求中使用的標記。下列 list-functions AWS CLI 命令範例清楚說明 --starting-token 參數。

aws lambda list-functions --max-items 10 --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=

擷取 Lambda 函數

Lambda CLI get-function 命令會傳回 Lambda 函數中繼資料和預先簽署的 URL,供您用來下載函數的部署套件。

aws lambda get-function --function-name my-function

您應該會看到下列輸出:

{ "Configuration": { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }, "Code": { "RepositoryType": "S3", "Location": "https://awslambda-us-east-2-tasks.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-function-4203078a-b7c9-4f35-..." } }

如需詳細資訊,請參閱 GetFunction

清除

執行下列 delete-function 命令以刪除 my-function 函數。

aws lambda delete-function --function-name my-function

刪除您在 IAM 主控台中建立的 IAM 角色。如需關於刪除角色的詳細資訊,請參閱 IAM 使用者指南中的刪除角色或執行個體設定檔