擷取使用已棄用執行時間之 Lambda 函數的資料 - AWS Lambda

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

擷取使用已棄用執行時間之 Lambda 函數的資料

當 Lambda 執行期即將取代時,Lambda 會透過電子郵件提醒您,並在 AWS Health Dashboard 和 中提供通知 Trusted Advisor。這些電子郵件和通知會列出使用執行期的 $LATEST 版本函數。若要列出使用特定執行時間的所有函數版本,您可以使用 AWS Command Line Interface (AWS CLI) 或其中一個 AWS SDKs。

如果您有大量函數使用即將取代的執行期,您也可以使用 AWS CLI 或 AWS SDKs 來協助您排定最常調用函數的更新優先順序。

請參閱下列各節,了解如何使用 AWS CLI 和 AWS SDKs 來收集使用特定執行時間之函數的資料。

列出使用特定執行時間的函數版本

若要使用 AWS CLI 列出使用特定執行時間的所有函數版本,請執行下列命令。RUNTIME_IDENTIFIER 將 取代為已棄用之執行時間的名稱,然後選擇您自己的 AWS 區域。若要僅列出 $LATEST 函數版本,--function-version ALL請從命令中省略 。

aws lambda list-functions --function-version ALL --region us-east-1 --output text --query "Functions[?Runtime=='RUNTIME_IDENTIFIER'].FunctionArn"
提示

範例命令會列出特定 us-east-1 區域中的函數 AWS 帳戶 。您需要針對帳戶具有函數的每個區域和每個 重複此命令 AWS 帳戶。

您也可以使用其中一個 列出使用特定執行期的函數 AWS SDKs。下列範例程式碼使用 V3 AWS SDK for JavaScript 和 AWS SDK for Python (Boto3) 來傳回使用特定執行時間ARNs的函數清單。範例程式碼也會傳回每個所列函數的 CloudWatch 日誌群組。您可以使用此日誌群組來尋找函數的上次調用日期。如需詳細資訊,識別最常用和最近調用的函數請參閱下一節。

Node.js
範例 JavaScript 使用特定執行時間列出函數的程式碼
import { LambdaClient, ListFunctionsCommand } from "@aws-sdk/client-lambda"; const lambdaClient = new LambdaClient(); const command = new ListFunctionsCommand({ FunctionVersion: "ALL", MaxItems: 50 }); const response = await lambdaClient.send(command); for (const f of response.Functions){ if (f.Runtime == '<your_runtime>'){ // Use the runtime id, e.g. 'nodejs18.x' or 'python3.9' console.log(f.FunctionArn); // get the CloudWatch log group of the function to // use later for finding the last invocation date console.log(f.LoggingConfig.LogGroup); } } // If your account has more functions than the specified // MaxItems, use the returned pagination token in the // next request with the 'Marker' parameter if ('NextMarker' in response){ let paginationToken = response.NextMarker; }
Python
範例 使用特定執行期列出函數的 Python 程式碼
import boto3 from botocore.exceptions import ClientError def list_lambda_functions(target_runtime): lambda_client = boto3.client('lambda') response = lambda_client.list_functions( FunctionVersion='ALL', MaxItems=50 ) if not response['Functions']: print("No Lambda functions found") else: for function in response['Functions']: if function['PackageType']=='Zip' and function['Runtime'] == target_runtime: print(function['FunctionArn']) # Print the CloudWatch log group of the function # to use later for finding last invocation date print(function['LoggingConfig']['LogGroup']) if 'NextMarker' in response: pagination_token = response['NextMarker'] if __name__ == "__main__": # Replace python3.12 with the appropriate runtime ID for your Lambda functions list_lambda_functions('python3.12')

若要進一步了解如何使用 AWS SDK來使用 ListFunctions動作列出函數,請參閱您偏好的程式設計語言SDK文件

您也可以使用 AWS Config 進階查詢功能,列出使用受影響執行時間的所有函數。此查詢只會傳回函數 $LATEST 版本,但您可以使用 AWS 帳戶 單一命令彙總查詢,列出所有區域和多個區域的函數。若要進一步了解,請參閱 AWS Config 開發人員指南 中的查詢 AWS Auto Scaling 資源的目前組態狀態

識別最常用和最近調用的函數

如果您的 AWS 帳戶 包含使用由於已棄用之執行期的函數,您可能想要優先更新經常調用的函數或最近調用的函數。

如果您只有幾個函數,您可以使用 CloudWatch Logs 主控台,查看函數的日誌串流來收集此資訊。如需詳細資訊,請參閱檢視傳送至日誌的 CloudWatch 日誌資料

若要查看最近的函數叫用次數,您也可以使用 Lambda 主控台中顯示的 CloudWatch 指標資訊。若要檢視此資訊,請執行下列動作:

  1. 開啟 Lambda 主控台中的函數頁面

  2. 選取您要查看調用統計資料的函數。

  3. 選擇 監控 索引標籤。

  4. 設定您希望使用日期範圍選取器檢視 統計資料的時段。最近調用會顯示在調用窗格中。

對於具有大量函數的帳戶,使用 AWS CLI 或其中一個使用 DescribeLogStreams和 AWS SDKsGetMetricStatisticsAPI動作以程式設計方式收集此資料會更有效率。

下列範例提供使用 V3 AWS SDK for JavaScript 和 的程式碼片段 AWS SDK for Python (Boto3) ,以識別特定函數的上次調用日期,並判斷過去 14 天內特定函數的調用次數。

Node.js
範例 JavaScript 尋找函數上次調用時間的程式碼
import { CloudWatchLogsClient, DescribeLogStreamsCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudWatchLogsClient = new CloudWatchLogsClient(); const command = new DescribeLogStreamsCommand({ logGroupName: '<your_log_group_name>', orderBy: 'LastEventTime', descending: true, limit: 1 }); try { const response = await cloudWatchLogsClient.send(command); const lastEventTimestamp = response.logStreams.length > 0 ? response.logStreams[0].lastEventTimestamp : null; // Convert the UNIX timestamp to a human-readable format for display const date = new Date(lastEventTimestamp).toLocaleDateString(); const time = new Date(lastEventTimestamp).toLocaleTimeString(); console.log(`${date} ${time}`); } catch (e){ console.error('Log group not found.') }
Python
範例 用於尋找函數上次調用時間的 Python 程式碼
import boto3 from datetime import datetime cloudwatch_logs_client = boto3.client('logs') response = cloudwatch_logs_client.describe_log_streams( logGroupName='<your_log_group_name>', orderBy='LastEventTime', descending=True, limit=1 ) try: if len(response['logStreams']) > 0: last_event_timestamp = response['logStreams'][0]['lastEventTimestamp'] print(datetime.fromtimestamp(last_event_timestamp/1000)) # Convert timestamp from ms to seconds else: last_event_timestamp = None except: print('Log group not found')
提示

您可以使用 ListFunctionsAPI操作來尋找函數的日誌群組名稱。如需如何執行此操作的範例,列出使用特定執行時間的函數版本請參閱 中的程式碼。

Node.js
範例 JavaScript 尋找過去 14 天內叫用次數的程式碼
import { CloudWatchClient, GetMetricStatisticsCommand } from "@aws-sdk/client-cloudwatch"; const cloudWatchClient = new CloudWatchClient(); const command = new GetMetricStatisticsCommand({ Namespace: 'AWS/Lambda', MetricName: 'Invocations', StartTime: new Date(Date.now()-86400*1000*14), // 14 days ago EndTime: new Date(Date.now()), Period: 86400 * 14, // 14 days. Statistics: ['Sum'], Dimensions: [{ Name: 'FunctionName', Value: '<your_function_name>' }] }); const response = await cloudWatchClient.send(command); const invokesInLast14Days = response.Datapoints.length > 0 ? response.Datapoints[0].Sum : 0; console.log('Number of invocations: ' + invokesInLast14Days);
Python
範例 用於尋找過去 14 天內叫用次數的 Python 程式碼
import boto3 from datetime import datetime, timedelta cloudwatch_client = boto3.client('cloudwatch') response = cloudwatch_client.get_metric_statistics( Namespace='AWS/Lambda', MetricName='Invocations', Dimensions=[ { 'Name': 'FunctionName', 'Value': '<your_function_name>' }, ], StartTime=datetime.now() - timedelta(days=14), EndTime=datetime.now(), Period=86400 * 14, # 14 days Statistics=[ 'Sum' ] ) if len(response['Datapoints']) > 0: invokes_in_last_14_days = int(response['Datapoints'][0]['Sum']) else: invokes_in_last_14_days = 0 print(f'Number of invocations: {invokes_in_last_14_days}')