使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中
> 作者:[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 >}}
<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运维博客
使用 Lambda 函数将 CloudWatch Log 中的日志归档到 S3 桶中的更多相关文章
- flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去
1. openrestry的安装 OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑 (1)安装开发库依赖 yum install -y ...
- JNI的native代码中打印日志到eclipse的logcat中
1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCA ...
- C++11—lambda函数
[1]lambda表达式语法定义 lambda表达式的语法定义如下: [capture] (parameters) mutable ->return-type {statement}; (1) ...
- Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...
- Javascript 将 console.log 日志打印到 html 页面中
如何将 console.log() 打印的日志输出到 html 页面中 (function () { var old = console.log; var logger = document.getE ...
- Python中的lambda函数
今天在看书的时候,看到了这样的一条语句: if isinstance(value,int) or isinstance(value,float): split_function=lambda row: ...
- C#中Lambda表达式类型Expression不接受lambda函数
在EF Core中我们经常会用System.Linq.Expressions系统命名空间的Expression<TDelegate>类型来作为EF Core的查询条件,比如: using ...
- python中lambda函数
1.lambda函数使用如下: lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右侧的是返回值 >>> g=lambda x,y:x*y>>> g(4 ...
- 【转】python中的lambda函数
http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html lambda函数也叫匿名函数,即,函数没有具 ...
- 关于python中lambda 函数使用小结
例子: 如果定义普通函数,一般都是这样写: def:ds(x): return 2*x+1 调用即: ds(5) 如果用lambda函数就是这么写,就是一句话: g =lambda x:2*x+1 调 ...
随机推荐
- 查看Linux内存占用情况
参考链接: 查看Linux磁盘及内存占用情况 linux的top命令参数详解 1.ps ps aux --sort -rss a 显示所有终端机下执行的进程,包括其他用户的进程(有的进程没有终 ...
- 联想拯救者R9000P风扇拉满加强散热的方法
管软可以开野兽模式,但是风扇还不是最猛的.锻炼的时候为了保护硬件,牺牲风扇和噪音吧,方法如下:下载 RWEverything运行RW.exe点击笔记本图标+EC文字的图案 修改:B0+0D对应的数据, ...
- linux 查看进程的启动开始时间
先使用命令查看需要查看的进程 ps -ef | grep java root 29861 13755 2 09:42 pts/0 00:10:48 java -jar XXXX.jar ps axo ...
- 教你如何用纯css代码实现太极阴阳鱼动画效果
今天看到一个有意思的效果,闲来无事做一个: 把2d静态的太极图改成了3d,阴极和阳极分到了两个平面里实现旋转效果,这个好实现,重点是实现它的透明效果,平面太极图显示出两极是用另加的块元素挡住底面的颜色 ...
- 这几个SQL语法的坑,你踩过吗
本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...
- Rancher 系列文章-RHEL7.8 离线有代理条件下安装单节点 Rancher
一 基础信息 1.1 前提 本次安装的为 20220129 最新版:Rancher v2.6.3 VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求) ...
- ACM-刷题记录-14届NEFU校赛
P2031凯撒密码 #include<bits/stdc++.h> using namespace std; int main(){ string s; int d; while(cin& ...
- C语言结构体大小分析
title: C语言结构体大小分析 author: saopigqwq233 date: 2022-04-05 C语言结构体大小分析 一,基本类型 C语言自带的数据类型大小如下 数据类型 大小(字节) ...
- Kubernetes 各个组件 启动参数介绍
kube-controller-manager Kubernetes 控制器管理器是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路.在机器人和自动化的应用中,控制回路是一个永不休止 ...
- python模拟鼠标键盘操作
前言 1 懒人,工作中可以模拟真人操作,不用自己点击 2游戏人员 这是做模拟外挂的必备知识,不管手机还是电脑游戏,尤其副本 准备模块 代码如下: 实现了一个最简单的输入密码,enter进入的登录过程 ...