【问题标题】:create_export_task returns success but does not export data to s3 from cloudwatchcreate_export_task 返回成功但不将数据从 cloudwatch 导出到 s3
【发布时间】:2018-01-05 11:05:19
【问题描述】:

我在 cloudwatch 上有日志,我想每天将其存储在 S3 上。我正在使用 AWS Lambda 来实现这一点。

我在 AWS Lambda 上创建了一个函数,并使用 Cloudwatch 事件作为触发器。这在 Cloudwatch 上创建了一个事件规则。现在,当我执行此 lambda 函数时,它成功执行并在存储桶内的 S3 上创建了一个名为“aws-log-write-test”的文件,但存储桶中没有其他数据或文件。该文件包含文本“权限检查成功”。

这是我的 lambda 函数:

import boto3
import collections
from datetime import datetime, date, time, timedelta

region = 'us-west-2'

def lambda_handler(event, context):
    yesterday = datetime.combine(date.today()-timedelta(1),time())
    today = datetime.combine(date.today(),time())
    unix_start = datetime(1970,1,1)
    client = boto3.client('logs')
    response = client.create_export_task(
        taskName='export_cw_to_s3',
        logGroupName='ABC',
        logStreamNamePrefix='ABCStream',
        fromTime=int((yesterday-unix_start).total_seconds()),
        to=int((today-unix_start).total_seconds()),
        destination='abc-logs',
        destinationPrefix='abc-logs-{}'.format(yesterday.strftime("%Y-%m-%d"))
    )
    return 'Response from export task at {} :\n{}'.format(datetime.now().isoformat(),response)

这是我执行 lambda 函数时的响应:

Response from export task at 2018-01-05T10:57:42.441844 :\n{'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx', 'HTTPHeaders': {'x-amzn-requestid': 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx', 'date': 'Fri, 05 Jan 2018 10:57:41 GMT', 'content-length': '49', 'content-type': 'application/x-amz-json-1.1'}}, u'taskId': u'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx'}

START RequestId: xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx Version: $LATEST
END RequestId: xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
REPORT RequestId: xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx   Duration: 1418.13 ms    Billed Duration: 1500 ms    Memory Size: 128 MB Max Memory Used: 36 MB

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudwatch


    【解决方案1】:

    事实上,根据create_export_task 方法,您应该将时间戳转换为毫秒,然后将结果数乘以 1000:

    fromTime = int((yesterday-unix_start).total_seconds() * 1000),
    to       = int((today-unix_start).total_seconds() * 1000),
    

    另外,请确保您已经创建了适当的 bucket policy 以使您的 lambda 能够导出对象并将其放入您的存储桶:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "logs.us-west-2.amazonaws.com"
                },
                "Action": "s3:GetBucketAcl",
                "Resource": "arn:aws:s3:::abc-logs"
            },
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "logs.us-west-2.amazonaws.com"
                },
                "Action": "s3:PutObject",
                "Resource": "arn:aws:s3:::abc-logs/*",
                "Condition": {
                    "StringEquals": {
                        "s3:x-amz-acl": "bucket-owner-full-control"
                    }
                }
            }
        ]
    }
    

    您尝试在您的存储桶上创建不同的文件夹以使每日导出彼此分开,这是一个绝妙的主意:

    destinationPrefix='abc-logs-{}'.format(yesterday.strftime("%Y-%m-%d"))
    

    但是但不可能在策略json上使用时间戳,所以你必须:

    将 Resource Arn 更改为此,以允许在所有新创建的目标文件夹上放置对象:

    "Resource":"arn:aws:s3:::abc-logs/*"
    

    【讨论】:

    • 解决了我的问题,我需要将时间戳转换为毫秒。 int(from_time.timestamp())*1000, # number of milliseconds
    【解决方案2】:

    确保时间戳以毫秒为单位。

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      相关资源
      最近更新 更多