使用 CloudTrail 记录 Lambda API 调用
Lambda 与 Amazon CloudTrail 服务集成,后者提供了某个用户、角色或Amazon服务在 Lambda 中执行的操作的记录。CloudTrail 将 Lambda 的 API 调用捕获为事件。捕获的调用包括来自 Lambda 控制台的调用和对 Lambda API 操作的代码调用。如果您创建了跟踪记录,则可以将 CloudTrail 事件持续传送到某个 Amazon Simple Storage Service(Amazon S3)存储桶(包括 Lambda 事件)。如果您不配置跟踪,则仍可在 CloudTrail 控制台中的 Event history(事件历史记录) 中查看最新事件。借助通过 CloudTrail 收集的信息,您可以确定向 Lambda 发出哪些请求、发出请求的 IP 地址、请求的发出者、请求的发出时间以及其他详细信息。
有关 CloudTrail 的更多信息,包括如何对其进行配置和启用,请参阅《Amazon CloudTrail 用户指南》。
CloudTrail 中的 Lambda 信息
在您创建 Amazon 账户时,将在该账户上启用 CloudTrail。当 Lambda 中发生受支持的事件活动时,该活动将记录在 CloudTrail 事件中,并与其他Amazon服务事件一同保存在 Event history(事件历史记录)中。您可以在 Amazon 账户中查看、搜索和下载最新事件。有关更多信息,请参阅 Amazon CloudTrail 用户指南中的使用 CloudTrail 事件历史记录查看事件。
要持续记录您的Amazon账户中的事件(包括 Lambda 事件),请创建 trail(跟踪记录)。通过跟踪,CloudTrail 可将日志文件传送至 Amazon S3 桶。预设情况下,在控制台中创建跟踪时,此跟踪应用于所有 Amazon 区域。此跟踪在 Amazon 分区中记录所有区域中的事件,并将日志文件传送至您指定的 S3 存储桶。此外,您可以配置其他Amazon服务,进一步分析在 CloudTrail 日志中收集的事件数据并采取行动。
有关更多信息,请参阅 Amazon CloudTrail 用户指南 中的以下主题:
每个日志条目都包含有关生成请求的人员的信息。日志中的用户身份信息有助于确定请求是由用户凭证发出,通过某个角色或联合用户的临时安全凭证发出,还是由其他 Amazon 服务发出。有关更多信息,请参阅 CloudTrail 日志事件参考中的 userIdentity 字段。
日志文件可以在存储桶中存储任意长时间,不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。默认情况下,将使用 Amazon S3 服务器端加密 (SSE) 对日志文件进行加密。
如果需要针对传输的日志文件快速采取行动,可选择让 CloudTrail 在传输新日志文件时发布 Amazon Simple Notification Service(Amazon SNS)通知。有关更多信息,请参阅为 CloudTrail 配置 Amazon SNS 通知。
您还可以将多个区域和多个Amazon账户中的 Lambda 日志文件聚合到单个 S3 存储桶中。有关更多信息,请参阅使用 CloudTrail 日志文件。
支持的 Lambda API 操作列表
Lambda 支持将以下操作记录为 CloudTrail 日志文件中的事件:
注意
在 CloudTrail 日志文件中,eventName
可能包括日期和版本信息,但它仍在引用同一公有 API。例如,GetFunction
操作可能会显示为 "GetFunction20150331"
。要查看特定操作的 eventName
,请查看事件历史记录中的日志文件条目。有关更多信息,请参阅 Amazon CloudTrail 用户指南中的使用 CloudTrail 事件历史记录查看事件。
-
(
CreateFunction
的 CloudTrail 日志省略了Environment
和ZipFile
参数。) -
(
PublishLayerVersion
的 CloudTrail 日志省略了ZipFile
参数。) -
(
UpdateFunctionCode
的 CloudTrail 日志省略了ZipFile
参数。) -
(
UpdateFunctionConfiguration
的 CloudTrail 日志省略了Environment
参数。)
了解 Lambda 日志文件条目
CloudTrail 日志文件可包含一个或多个日志条目,每个条目由多个 JSON 格式的事件组成。一个日志条目表示来自任何源的一个请求,包括有关所请求的操作、所有参数以及操作的日期和时间等信息。日志条目不一定具有任何特定顺序。也即,它们不是公用 API 调用的有序堆栈跟踪。
以下示例显示了 GetFunction
和 DeleteFunction
操作的 CloudTrail 日志条目。
注意
eventName
可能包括日期和版本信息(如 "GetFunction20150331"
),但它仍在引用同一公有 API。
{ "Records": [ { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::999999999999:user/myUserName", "accountId": "999999999999", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2015-03-18T19:03:36Z", "eventSource": "lambda.amazonaws.com", "eventName": "GetFunction", "awsRegion": "us-east-1", "sourceIPAddress": "127.0.0.1", "userAgent": "Python-httplib2/0.8 (gzip)", "errorCode": "AccessDenied", "errorMessage": "User: arn:aws:iam::999999999999:user/myUserName is not authorized to perform: lambda:GetFunction on resource: arn:aws:lambda:us-west-2:999999999999:function:other-acct-function", "requestParameters": null, "responseElements": null, "requestID": "7aebcd0f-cda1-11e4-aaa2-e356da31e4ff", "eventID": "e92a3e85-8ecd-4d23-8074-843aabfe89bf", "eventType": "AwsApiCall", "recipientAccountId": "999999999999" }, { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::999999999999:user/myUserName", "accountId": "999999999999", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2015-03-18T19:04:42Z", "eventSource": "lambda.amazonaws.com", "eventName": "DeleteFunction", "awsRegion": "us-east-1", "sourceIPAddress": "127.0.0.1", "userAgent": "Python-httplib2/0.8 (gzip)", "requestParameters": { "functionName": "basic-node-task" }, "responseElements": null, "requestID": "a2198ecc-cda1-11e4-aaa2-e356da31e4ff", "eventID": "20b84ce5-730f-482e-b2b2-e8fcc87ceb22", "eventType": "AwsApiCall", "recipientAccountId": "999999999999" } ] }
使用 CloudTrail 跟踪函数调用
CloudTrail 还会记录数据事件。您可以启用数据事件日志记录,以便在每次调用 Lambda 函数时记录一个事件。这可帮助您了解哪些身份正在调用函数以及调用频率。有关此选项的更多信息,请参阅记录跟踪的数据事件。
注意
CloudTrail 仅记录经过身份验证和授权的请求。CloudTrail 不记录未通过身份验证(凭证缺失或提供的凭证无效)的请求或具有未授权调用函数的凭证的请求。
使用 CloudTrail 排查已禁用的事件源的问题
可能会遇到的一个数据事件是 LambdaESMDisabled
事件。有 5 种常规错误类别与此事件相关联:
RESOURCE_NOT_FOUND
-
请求中指定的资源不存在。
FUNCTION_NOT_FOUND
-
附加到事件源的函数不存在。
REGION_NAME_NOT_VALID
-
提供给事件源或函数的区域名称无效。
AUTHORIZATION_ERROR
-
尚未设置权限或权限配置错误。
FUNCTION_IN_FAILED_STATE
-
函数代码无法编译或遇到了无法恢复的异常,或者发生了部署错误。
这些错误包含在 serviceEventDetails
实体内的 CloudTrail 事件消息中。
例 serviceEventDetails
实体
"serviceEventDetails":{
"ESMDisableReason":"Lambda Function not found"
}