将 Lambda 函数日志发送到 Amazon S3 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 Lambda 函数日志发送到 Amazon S3

您可以使用 Lambda 控制台配置 Lambda 函数,以将日志直接发送到 Amazon S3。此功能为长期日志存储提供了经济高效的解决方案,并使用 Athena 等服务实现了强大的分析选项。

注意

您可以使用 Lambda 控制台、Amazon CLI、Amazon CloudFormation 和所有 Amazon SDK 将 Lambda 函数日志配置为发送到 Amazon S3。

定价

有关定价详细信息,请参阅 Amazon CloudWatch 定价

Amazon S3 日志目标所需的权限

使用 Lambda 控制台将 Amazon S3 配置为函数的日志目标时,您需要:

  1. 将 CloudWatch Logs 与 Lambda 结合使用所需的 IAM 权限

  2. 设置 CloudWatch Logs 订阅筛选条件以将 Lambda 函数日志发送到 Amazon S3。此筛选条件定义将哪些日志事件传送到 Amazon S3 存储桶。

设置 CloudWatch Logs 订阅筛选条件以将 Lambda 函数日志发送到 Amazon S3

要将日志从 CloudWatch Logs 发送到 Amazon S3,您需要创建一个订阅筛选条件。此筛选条件定义将哪些日志事件传送到 Amazon S3 存储桶。您的 Amazon S3 存储桶必须与您的日志组位于同一区域。

为 Amazon S3 创建订阅筛选条件

  1. 创建 Amazon Simple Storage Service (Amazon S3) 存储桶 我们建议您使用专为 CloudWatch Logs 创建的存储桶。但是,如果要使用现有存储桶,请跳至第 2 步。

    运行以下命令,将占位符区域替换为您想使用的区域:

    aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
    注意

    amzn-s3-demo-bucket2 是示例 Amazon S3 存储桶名称。它是预留的。要使此过程生效,您必须将其替换为唯一的 Amazon S3 存储桶名称。

    下面是示例输出:

    { "Location": "/amzn-s3-demo-bucket2" }
  2. 创建 IAM 角色,该角色将授予 CloudWatch Logs 将数据放入 Amazon S3 存储桶的权限。此策略包括 aws:SourceArn 全局条件上下文密钥,有助于避免出现混淆代理安全问题。有关更多信息,请参阅 Confused deputy prevention

    1. 使用文本编辑器在文件 ~/TrustPolicyForCWL.json 中创建一个信任策略,具体如下所示:

      { "Statement": { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:logs:region:123456789012:*" } }, "Action": "sts:AssumeRole" } }
    2. 使用 create-role 命令创建 IAM 角色,并指定信任策略文件。请记下返回的 Role.Arn 值,因为后面的步骤中将会用到它:

      aws iam create-role \ --role-name CWLtoS3Role \ --assume-role-policy-document file://~/TrustPolicyForCWL.json { "Role": { "AssumeRolePolicyDocument": { "Statement": { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Condition": { "StringLike": { "aws:SourceArn": "arn:aws:logs:region:123456789012:*" } } } }, "RoleId": "AAOIIAH450GAB4HC5F431", "CreateDate": "2015-05-29T13:46:29.431Z", "RoleName": "CWLtoS3Role", "Path": "/", "Arn": "arn:aws:iam::123456789012:role/CWLtoS3Role" } }
  3. 创建权限策略以定义可对您的账户执行的 CloudWatch Logs 操作。首先,使用文本编辑器在文件 ~/PermissionsForCWL.json 中创建权限策略:

    { "Statement": [ { "Effect": "Allow", "Action": ["s3:PutObject"], "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket2/*"] } ] }

    使用以下 put-role-policy 命令,将权限策略与角色关联:

    aws iam put-role-policy --role-name CWLtoS3Role --policy-name Permissions-Policy-For-S3 --policy-document file://~/PermissionsForCWL.json
  4. 创建 Delivery 日志组或使用现有的 Delivery 日志组。

    aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
  5. PutSubscriptionFilter 用于设置目标

    aws logs put-subscription-filter --log-group-name my-logs --filter-name my-lambda-delivery --filter-pattern "" --destination-arn arn:aws:s3:::amzn-s3-demo-bucket2 --role-arn arn:aws:iam::123456789012:role/CWLtoS3Role --region REGION_NAME

将 Lambda 函数日志发送到 Amazon S3

在 Lambda 控制台中,您可以在创建新函数后将函数日志直接发送到 Amazon S3。为此,请完成以下步骤:

  1. 登录 Amazon 管理控制台,然后打开 Lambda 控制台。

  2. 选择您的函数名称。

  3. 选择配置选项卡。

  4. 选择监控和操作工具选项卡。

  5. 在“日志记录配置”部分中,选择编辑

  6. 在“日志内容”部分,选择一种日志格式。

  7. 在“日志目标”部分中,完成以下步骤:

    1. 选择目标服务。

    2. 选择创建新的日志组或使用现有日志组

      注意

      如果为 Amazon S3 目标选择现有日志组,请确保您选择的日志组是 Delivery 日志组类型。

    3. 选择 Amazon S3 存储桶作为函数日志的目标。

    4. 将出现 CloudWatch Delivery 日志组。

  8. 选择保存

注意

如果控制台中提供的 IAM 角色没有所需的权限,则目标设置将失败。要解决此问题,请参阅

跨账户日志记录

您可以将 Lambda 为使用不同 Amazon 账户向 Amazon S3 存储桶发送日志。这需要设置目标,并在两个账户中配置适当的权限。

有关设置跨账户日志记录的详细说明,包括所需的 IAM 角色和策略,请参阅 CloudWatch Logs 文档中的 Setting up a new cross-account subscription