> 作者:[SRE运维博客](https://www.cnsre.cn/) > 博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/) > 文章地址:[https://www.cnsre.cn/posts/221205544069/](https://www.cnsre.cn/posts/221205544069/) > 相关话题:[https://www.cnsre.cn/tags/aws/](https://www.cnsre.cn/tags/aws/)

躺了好久,诈尸了。因为换了工作,所以比较忙一直没有时间去更新博客的内容(主要还是因为懒)

话不多说 直接上干货。

需求背景

最近在看费用的时候发现有很大一部分费用都是 cloudwatch log中存储了大量的数据,是因为ec2 将日志传输到了存储到了cloudwatch中。这个存储的多的查询日志的时候收费特别的高。另外一个是因为数据分析用途,大数据分析的同事如果想那到数据的话,还是存储在 S3 中是比较划算和方便的,一个是拿取数据比较方便,另外一个是S3 可以最归档存储,后面的大量数据可以分层储存,以此来降低费用。

如果你也想将你的cloudwatch 中日志组中的日志存储到S3中的话可以参考下这篇文章。

前置条件

  • 创建 一个 S3 桶,并修改权限

  • 创建 lambda 函数

  • 有一个Cloudwatch 日志组并且有一天以上的日志

  • 给 lambda分配所需的权限

创建 S3 桶并修改权限

{{< tabs 国内S3桶权限配置 国外S3桶权限配置 >}}

{{< tab >}}

国内S3桶权限配置


{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.cn-north-1.amazonaws.com.cn" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws-cn:s3:::<bucket name>" }, { "Effect": "Allow", "Principal": { "Service": "logs.cn-north-1.amazonaws.com.cn" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::<bucket name>/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }

{{< /tab >}}

{{< tab >}}

国外S3桶权限配置


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

{{< /tab >}}

{{< /tabs >}}

S3 桶权限文档链接

<ins class="adsbygoogle"

style="display:block; text-align:center;"

data-ad-layout="in-article"

data-ad-format="fluid"

data-ad-client="ca-pub-4855142804875926"

data-ad-slot="5670838583">

创建 lambda 函数

创建 lambda


import boto3 import logging import time import datetime import json logger = logging.getLogger() logger.setLevel(logging.INFO) def export_s3_logs(bucket_name, log_group_name, log_stream_name, days_of_logs=1, timeout=1000): ''' today = datetime.datetime.combine(datetime.datetime.utcnow(), datetime.datetime.min.time()) day_end = today day_start = today - datetime.timedelta(days=days_of_logs) ''' today = datetime.datetime.combine(datetime.datetime.utcnow() + datetime.timedelta(hours=8), datetime.datetime.min.time()) # UTC+8 day_end = today - datetime.timedelta(hours=8) # UTC day_start = today - datetime.timedelta(days=days_of_logs, hours=8) # UTC #print(day_start) ts_start = '{0:.0f}'.format(((day_start - datetime.datetime(1970, 1, 1)).total_seconds())*1000) ts_end = '{0:.0f}'.format(((day_end - datetime.datetime(1970, 1, 1)).total_seconds())*1000) the_date = '/'.join([str(today.year), '0'+str(today.month)[-2:], '0'+str(today.day)[-2:]]) #folder_name = '/'.join([log_group_name, log_stream_name, the_date]) folder_name = '/'.join([log_group_name,the_date]) client = boto3.client('logs') #print (ts_start, ts_end)#, day_start, day_end,the_date task_id = client.create_export_task( logGroupName=log_group_name, #logStreamNamePrefix=log_stream_name, fromTime=int(ts_start), to=int(ts_end), destination=bucket_name, destinationPrefix=folder_name )['taskId'] i = 1 while i<timeout: response = client.describe_export_tasks( taskId=task_id ) status = response['exportTasks'][0]['status'] if status == 'COMPLETED': result = True break elif status != 'RUNNING': result = False break i += 1 time.sleep(interval) return result def lambda_handler(event, context): region = 'cn-northwest-1' # 日志组所在区域 bucket_name = '<bucket name>' #同区域内的S3桶名称 log_group_name = '<log group name>' #日志组名称 log_stream_name = '1' #默认即可 log_export_days = 1 #默认即可 export_s3_logs(bucket_name, log_group_name, log_stream_name, log_export_days)

给 lambda 分配权限

  • AmazonS3的读写权限

  • CloudWatchLogsFullAccess

验证桶内的文件

最后会以日期的目录将日志归档起来,以方便日后对归档文件进行梳理。


作者:SRE运维博客

博客地址:https://www.cnsre.cn/

文章地址:https://www.cnsre.cn/posts/221205544069/

相关话题:https://www.cnsre.cn/tags/aws/


使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中的更多相关文章

  1. flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

    1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...

  2. JNI的native代码中打印日志到eclipse的logcat中

    1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...

  3. C++11—lambda函数

    [1]lambda表达式语法定义 lambda表达式的语法定义如下: [capture] (parameters) mutable ->return-type {statement}; (1) ...

  4. Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  5. Javascript 将 console.log 日志打印到 html 页面中

    如何将 console.log() 打印的日志输出到 html 页面中 (function () { var old = console.log; var logger = document.getE ...

  6. Python中的lambda函数

    今天在看书的时候,看到了这样的一条语句: if isinstance(value,int) or isinstance(value,float): split_function=lambda row: ...

  7. C#中Lambda表达式类型Expression不接受lambda函数

    在EF Core中我们经常会用System.Linq.Expressions系统命名空间的Expression<TDelegate>类型来作为EF Core的查询条件,比如: using ...

  8. python中lambda函数

    1.lambda函数使用如下: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右侧的是返回值 >>> g=lambda x,y:x*y>>> g(4 ...

  9. 【转】python中的lambda函数

    http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html lambda函数也叫匿名函数,即,函数没有具 ...

  10. 关于python中lambda 函数使用小结

    例子: 如果定义普通函数,一般都是这样写: def:ds(x): return 2*x+1 调用即: ds(5) 如果用lambda函数就是这么写,就是一句话: g =lambda x:2*x+1 调 ...

随机推荐

  1. 转载C#加密方法

    方法一:    //须添加对System.Web的引用     using System.Web.Security;          ...          /// <summary> ...

  2. gogetssl申请的域名证书私钥文件丢了,可以重新申请个吗?

    因为gogetssl是不保存我们使用浏览器生成的KEY文件的,CSR文件倒是可以有办法再找到 也就是说Certificate Signing Request(CSR)可以想想办法,但是Your Pri ...

  3. Checkmk监控工具使用手册

    其实用法Checkmk官网文档很全面:https://docs.checkmk.com/latest/en/intro_setup.html 顺着beginner's guide章节看完基本就能上手, ...

  4. pytest用例管理框架实战(基础篇)

    先安装pip install pytest pytest用例管理框架 默认规则: 1.py文件必须以test_开头或者_test结尾 2.类名必须以test开头 3.测试用例必须以test_开头 ge ...

  5. 在CentOS中搭建NFS

    概述 NFS是一款经典的网络文件系统,在Linux上我们可以通过创建一个NFS服务在不同的服务器之间共享磁盘文件,而不用在多个服务器之间进行不断的拷贝复制,麻烦且浪费存储空间.在k8s中我们也可以使用 ...

  6. 组合计数中的q-模拟 q analog

    拒绝更新,深度和广度上建议看这个pdf URL里面用到的一些query-string过期了,,, 论文题目是 THE q-SERIES IN COMBINATORICS; PERMUTATION ST ...

  7. 简述SpringAOP的实现原理

    ​ Spring默认采取的动态代理机制实现AOP,当动态代理不可用时 (代理类无接口)会使用CGlib机制. Spring提供了两种方式来生成代理对象:JDKProxy和Cglib,具体使用哪种方式生 ...

  8. 领域驱动设计DDD应用与最佳实践

    领域驱动设计(Domain Driven Design,简称:DDD)设计思想和方法论早在2005年时候就被提出来,但是一直没有重视和推荐使用,直到2015年之后微服务流行之后,再次被人重视和推荐使用 ...

  9. Dubbo服务提供者如何优雅升级?

    文章首发于公众号:BiggerBoy.欢迎关注. 往期文章推荐 大坑!隐式转换导致索引失效...高性能分布式限流:Redis+Lua真香!MySQL索引知识点&常见问题汇总联合索引在B+树上的 ...

  10. 如何申请 Azure OpenAI

    一.前言 众所周知 OpenAI ChatGPT 是不对中国开放的,包括香港.就最近一个月的情况来看,陆续有 API 调用被限制.大规模账号封禁.关闭注册.无法直接使用银联支付(国内信用卡)等等,使用 ...