搭配使用 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 函數中的說明。

為了完成以下步驟,您需要命令列終端或 shell 來執行命令。命令和預期的輸出會列在不同的區塊中:

aws --version

您應該會看到下列輸出:

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

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

在 Linux 和 macOS 上,使用您偏好的 shell 和套件軟體管理工具。在 Windows 10 上,您可以安裝適用於 Linux 的 Windows 子系統,以取得 Ubuntu 和 Bash 的 Windows 整合版本。

本教學課程使用 AWS Command Line Interface (AWS CLI) 呼叫服務 API 操作。若要安裝或升級 AWS CLI,請參閱《AWS Command Line Interface 使用者指南》中的安裝 AWS CLI

建立執行角色

建立執行角色,授予您的函式存取 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 nodejs16.x \ --role arn:aws:iam::123456789012:role/lambda-ex

    您應該會看到下列輸出:

    { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs16.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": "nodejs16.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": "nodejs16.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": "nodejs16.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 使用者指南中的刪除角色或執行個體設定檔